天天看點

【原創】反編譯apk+eclipse中動态調試smali

 初涉移動端,請各位前輩多多指教!

本文參考http://www.kaifazhe.com/android_school/380973.html

在此,對作者表示感謝!

跟蹤apk一般的做法是在反編譯的smali代碼中插入log輸出,然後重新編譯運作看輸出日志,這種方法費時費力,如果能夠動态調試就最好了。下面就給大家介紹apk+eclipse來調試smali。

前期準備:

eclipse。

Jdk或jre,并設定好環境變量,我的是7.0版本。

Apktool2.0

簽名檔案

目标apk:light.apk。

1.  将LIGHT.APK複制到APKTOOL目錄下,如圖:

【原創】反編譯apk+eclipse中動态調試smali

利用apktool反編譯light.apk。

指令:

D:\apktool2.0>java -jar apktool.jar d -d light.apk -o out(這裡必須使用-d參數,這樣反編譯出來的代碼字尾均是java,因為隻有java檔案才能被eclipse識别調試),如圖:

【原創】反編譯apk+eclipse中動态調試smali

在目前目錄生成了反編譯後的out檔案目錄:

【原創】反編譯apk+eclipse中動态調試smali

2.  設定調試标記和尋找主類

 在輸出的out檔案夾中,用文本編輯工具打開AndroidManifest.xml,在application節點中設定屬性android:debuggable=”true”。

【原創】反編譯apk+eclipse中動态調試smali

 繼續在AndroidManifest.xml中,搜尋以下關鍵字

<intent-filter>

    <action android:name="android.intent.action.MAIN"/>

    <category android:name="android.intent.category.LAUNCHER"/>

</intent-filter>

找到含有以上資訊的activity節點,記錄其android:name屬性的值,該值則為其應用的主類。本例主類為com.devuni.flashlight.MainActivity。

【原創】反編譯apk+eclipse中動态調試smali

3.  在主類的ONCREATE事件中添加調試等待。

用文本編輯工具打開主類檔案,找到onCreate方法,在第一句前插入invoke-static {}, Landroid/os/Debug;->waitForDebugger()V,記得添加a=0;//的字首保持上下一緻,結果如下:

【原創】反編譯apk+eclipse中動态調試smali

4.  儲存檔案,用APKTOOL重新編譯打包為DEBUG.APK

指令:

D:\apktool2.0>java -jar apktool.jar b -d out -o debug.apk

如圖:

【原創】反編譯apk+eclipse中動态調試smali

生成debug.apk檔案:

【原創】反編譯apk+eclipse中動态調試smali

5.  對DEBUG.APK簽名(需要下載下傳簽名工具),我把簽名工具放在了SIGNAPK檔案夾下,生成DEBUG.SIGN.APK

  指令:

D:\APKTOOL2.0>JAVA -JAR .\SIGN\SIGNAPK.JAR .\SIGN\TESTKEY.X509.PEM .\SIGN\TESTKE

Y.PK8 DEBUG.APK DEBUG.SIG.APK

【原創】反編譯apk+eclipse中動态調試smali

6.  上傳DEBUG.SIGN.APK至手機或模拟器,然後安裝并運作。這時你會看到程式運作後停留在白屏界面,這時不要動裝置和退出程式,因為程式現在是運作到剛才添加的WAITFORDEBUGGER代碼這裡,這行代碼的意思是一直挂起中,等待調試器。

下面開始設定實時調試的環境。

7.  進入第1步産生的OUT檔案夾,把裡面的BUILD和DIST檔案夾删除,這是APKTOOL編譯APK時産生的。

8.  啟動ECLIPSE,建構JAVA項目

1)  File -> New -> Project -> Java Project -> Next

2)  Project Name随便起,Use default location選項去掉,Location選擇out檔案夾,然後Next

3)  把smali檔案夾設為Source Folder,然後Finish

9.  在ECLIPSE中,打開第2步找到的主類,并找到ONCREATE方法,在WAITFORDEBUGGER後面的第一個方法開始添加斷點。如下圖

【原創】反編譯apk+eclipse中動态調試smali

10.  打開DDMS,如果在第6步中運作了修改後的程式,在DDMS的裝置清單中會顯示可以調試的程式。

【原創】反編譯apk+eclipse中動态調試smali

對應程式最後一欄為8602/8700,其中8602即為調試該程式的端口。

11.  現在要做的就是把代碼與調試程式關聯即可。 回到ECLIPSE,配置遠端調試

1)  菜單Run -> Debug -> Debug Configurations

2)  輕按兩下Remote Java Application,Host處預設localhost就行,Port填第10步得到的8602,然後Apply -> Debug。

【原創】反編譯apk+eclipse中動态調試smali

12.  這時ECLIPSE自動切換至DEBUG視圖,并看到程式已經運作并中斷在下一行可執行的代碼了,相關的變量可以直接檢視了。

【原創】反編譯apk+eclipse中動态調試smali

已經可以用eclipse調試smali了,上面的例子是從程式開頭的地方開始調試,但要調試到自己所關心地方的代碼處确實麻煩。建議先用jd-gui等軟體直接檢視反編譯的java代碼,确定要調試的位置後,再進入smali定位斷點并實時調試,就可以事半功倍。

繼續閱讀