Smalidea無源碼調試 android 應用

jopen 9年前發布 | 33K 次閱讀 Smalidea Android開發 移動開發


smalidea是一款 IntelliJ IDEA/Android Studio的 smali 插件

已有功能


  • 語法高亮/錯誤提示
  • 字節碼級別調試
    • 斷點
    • 單步調試
    • 寄存器查看
    • 本地窗口 java 語法支持,debug 模式下同樣支持
  • 支持跳轉,方便追蹤變量/函數/類.(Xref也支持)
  • 查找用法
  • 重命名
  • 從 java 代碼引用 smali 類
  • 錯誤反饋...

安裝


  • 下載插件smalidea
  • 進入IntelliJ IDEA/Android Studio開始安裝插件,進入Settings->Plugins點擊Install plugin from disk選中下載好的壓縮包.
  • 點擊apply

開啟應用調試


要調試一個apk里面的dex代碼,必須滿足以下兩個條件中的任何一個:

  • apk中的AndroidManifest.xml文件中的Application標簽包含屬性android:debuggable=”true”
  • /default.prop中ro.debuggable的值為1

可選方案:

  • apktool 反編譯app 后在AndroidManifest.xml文件中插入android:debuggable=”true”
  • hook system debug (Xinstaller)
  • 修改boot.img

個人覺得改 boot.img和二次打包比較麻煩,所以這里采用 hook 方式達到開啟所有應用調試的目的,xposed 插件代碼如下

#!java
public class Debug implements IXposedHookLoadPackage {

    public boolean debugApps = true ;
    public static final int DEBUG_ENABLE_DEBUGGER = 0x1;
    public String tag = "IDG";

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {

        if(lpparam.appInfo == null ||
                (lpparam.appInfo.flags & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) !=0){
            return;
        }

        tag = tag + lpparam.packageName;

        XposedBridge.hookAllMethods(Process.class, "start", new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {

                int id = 5;
                int flags = (Integer) param.args[id];

                Log.d(tag,"flags is : "+flags);

                if (debugApps) {
                    if ((flags & DEBUG_ENABLE_DEBUGGER) == 0) {
                        flags |= DEBUG_ENABLE_DEBUGGER;
                    }
                }

                param.args[id] = flags;
                Log.d(tag,"flags changed : "+flags);

            }
        });
    }

}

效果如下圖

如果遇到如下錯誤

Adb rejected connection to client

可以使用重啟 adb server 來解決

adb kill-server

adb start-server

調試應用


注意:IDEA 14.1及以上版本才支持單步調試

  • 使用 baksmali 反編譯應用

    baksmali myapp.apk -o ~/projects/myapp/src
  • 轉到 IDEA 中,導入新工程,選中之前的目錄

    ~/projects/myapp

  • 導入時選擇Create project from existing sources

  • 成功導入工程后右鍵點擊 src 目錄,設定Mark Directory As->Sources Root

  • 打開Module setting設置對應的 JDK

  • 安裝debug應用

    adb install com.zkj.guimi.apk
  • 找到debug應用進程,啟動應用

    如果不用 ddms 可以使用如下步驟:

    ? adb shell am start -D -W -n com.zkj.guimi/.ui.SplashScreen
    ? adb shell ps |grep guimi                                                                                                         1 ?
    u0_a157   9879  242   883420 36360 ffffffff 00000000 S com.zkj.guimi
    ? adb forward tcp:8700 jdwp:9879
  • 在 IDEA 配置遠程調試(Run->Edit Configurations),更改debug端口為8700

  • Run->Debug

    Connected to the target VM, address: 'localhost:8700', transport: 'socket'

  • 斷點觸發后就可以單步調試

reference


http://www.kanxue.com/bbs/showthread.php?p=1338639

https://github.com/JesusFreke/smali/wiki/smalidea

https://github.com/pylerSM/XInstaller

來自:http://drops.wooyun.org/tips/7181

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!