[Android]反编译apk + eclipse中调试smali
? ? 從來(lái)沒(méi)有想過(guò)反編譯apk是來(lái)的如此方便,并且還可以修改后重新編譯運(yùn)行,這比在win下修改pe容易多了,感謝apktool和smali工具的作者提供這么好的工具。
?
? ? 跟蹤apk一般的做法是在反編譯的smali代碼中插入log輸出,然后重新編譯運(yùn)行看輸出日志,這種方法費(fèi)時(shí)費(fèi)力,如果能夠?qū)崟r(shí)調(diào)試是最好的了。搜了一下,目前比較好的方法是使用NetBeans+DDMS。我嘗試過(guò)可以調(diào)試,但不大認(rèn)識(shí)NetBeans的操作,eclipse估計(jì)很多人都會(huì)吧,其實(shí)設(shè)置跟NetBeans大同小異。
? ? 調(diào)試步驟:
? ? 1.對(duì)apk使用apktool反編譯出可調(diào)試的smali代碼到out文件夾,目前apktool最新的版本是2.0.0b7。
java -jar apktool_2.0.0b7.jar d -d test.apk -o out? ? 這里必須使用-d參數(shù),這樣反編譯出來(lái)的代碼后綴均是java,因?yàn)橹挥衘ava文件才能被eclipse/netbeans識(shí)別調(diào)試。
? ? 2.設(shè)置調(diào)試標(biāo)記和尋找主類(lèi)
? ? 在輸出的out文件夾中,用文本編輯工具打開(kāi)AndroidManifest.xml,在application節(jié)點(diǎn)中設(shè)置屬性android:debuggable="true"。
? ? 繼續(xù)在AndroidManifest.xml中,搜索以下關(guān)鍵字
<intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/> </intent-filter>? ? 找到含有以上信息的activity節(jié)點(diǎn),記錄其android:name屬性的值,該值則為其應(yīng)用的主類(lèi)。如下面的例子,主類(lèi)為com.acids.helloworld.MainActivity。
<?xml version="1.0" encoding="utf-8" standalone="no"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.acids.helloworld"><application android:debuggable="true" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"><activity android:label="@string/app_name" android:name="com.acids.helloworld.MainActivity"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity></application> </manifest>? ? 3.在主類(lèi)的onCreate事件中添加調(diào)試等待。
? ? 用文本編輯工具打開(kāi)主類(lèi)文件,找到onCreate方法,在第一句前插入invoke-static {}, Landroid/os/Debug;->waitForDebugger()V,記得添加a=0;//的前綴保持上下一致,結(jié)果如下:
a=0;// # virtual methods a=0;// .method protected onCreate(Landroid/os/Bundle;)V a=0;// invoke-static {}, Landroid/os/Debug;->waitForDebugger()V a=0;// a=0;// .locals 1 a=0;// .param p1, "savedInstanceState" # Landroid/os/Bundle; a=0;// a=0;// .prologue a=0;// .line 11 a=0;// invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V? ? 4.保存文件,用apktool重新編譯打包為debug.apk
java -jar apktool_2.0.0b7.jar b -d out -o debug.apk? ? 5.對(duì)debug.apk簽名(需要下載簽名工具),我把簽名工具放在了signapk文件夾下,生成debug.sign.apk
java -jar .\signapk\signapk.jar .\signapk\testkey.x509.pem .\signapk\testkey.pk8 .\debug.apk .\debug.sign.apk? ? 6.上傳debug.sign.apk至手機(jī)或模擬器,然后安裝并運(yùn)行。這時(shí)你會(huì)看到程序運(yùn)行后停留在白屏界面,這時(shí)不要?jiǎng)釉O(shè)備和退出程序,因?yàn)槌绦颥F(xiàn)在是運(yùn)行到剛才添加的waitForDebugger代碼這里,這行代碼的意思是一直掛起中,等待調(diào)試器。
?
? ??下面開(kāi)始設(shè)置實(shí)時(shí)調(diào)試的環(huán)境。
? ? 7.啟動(dòng)eclipse,構(gòu)建java項(xiàng)目
? ? 1) File -> New -> Project -> Java Project -> Next
? ? 2) Project Name隨便起,Use default location選項(xiàng)去掉,Location選擇out文件夾,然后Next
? ? 3) 把smali文件夾設(shè)為Source Folder,然后Finish
? ? 8.在eclipse中,打開(kāi)第2步找到的主類(lèi),并找到onCreate方法,在waitForDebugger后面的第一個(gè)方法開(kāi)始添加斷點(diǎn)。如下圖
? ? 9.打開(kāi)DDMS(路徑在%android-sdks%\tools\ddms.bat),如果在第6步中運(yùn)行了修改后的程序,在DDMS的設(shè)備列表中會(huì)顯示可以調(diào)試的程序。
? ? 對(duì)應(yīng)程序最后一欄為8600/8700,其中8600即為調(diào)試該程序的端口。
? ? 10.現(xiàn)在要做的就是把代碼與調(diào)試程序關(guān)聯(lián)即可。?回到eclipse,配置遠(yuǎn)程調(diào)試
? ? 1) 菜單Run -> Debug -> Debug?Configurations
? ? 2) 雙擊Remote Java Application,Host處默認(rèn)localhost就行,Port填第10步得到的8600,然后Apply -> Debug。
? ? 11.這時(shí)eclipse自動(dòng)切換至debug視圖,并看到程序已經(jīng)運(yùn)行并中斷在下一行可執(zhí)行的代碼了,相關(guān)的變量可以直接查看了。
?
?
? ? 總結(jié)
? ? 已經(jīng)可以用eclipse調(diào)試smali了,上面的例子是從程序開(kāi)頭的地方開(kāi)始調(diào)試,但要調(diào)試到自己所關(guān)心地方的代碼處確實(shí)麻煩。建議先用jd-gui等軟件直接查看反編譯的java代碼,確定要調(diào)試的位置后,再進(jìn)入smali定位斷點(diǎn)并實(shí)時(shí)調(diào)試,就可以事半功倍。如果不需要在程序的開(kāi)頭調(diào)試的話(huà),建議把第三部的代碼注釋掉。
?
? ? 相關(guān)工具可以在這里下載
? ? apktool:?https://code.google.com/p/android-apktool/
? ? dex2jar:?https://code.google.com/p/dex2jar/
? ? jd-gui:?http://jd.benow.ca/
?
? ??轉(zhuǎn)載請(qǐng)注明原文地址:http://www.cnblogs.com/litou/p/3539281.html
轉(zhuǎn)載于:https://www.cnblogs.com/litou/p/3539281.html
總結(jié)
以上是生活随笔為你收集整理的[Android]反编译apk + eclipse中调试smali的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JavaScript 禁用键盘按钮
- 下一篇: Abiword 编辑事件设计