反編譯apk + eclipse中調試smali


1.對apk使用apktool反編譯出可調試的smali代碼到out文件夾

apktool -d d 定點加粉絲_com.mingniu.wxddjfs_440.apk -o out

這里必須使用-d參數,這樣反編譯出來的代碼后綴均是java,因為只有java文件才能被eclipse/netbeans識別調試

 

2.設置調試標記和尋找主類

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

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

<intent-filter>
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
找到含有以上信息的activity節點,記錄其android:name屬性的值,該值則為其應用的主類。如下面的例子,主類為 .ui.HomeActivity

<activity android:label="@string/app_name" android:name=".ui.HomeActivity" android:screenOrientation="portrait" android:windowSoftInputMode="stateHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

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

grep -rn "HomeActivity" * 找到主類文件,   

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

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

apktool  b -d out -o debug.apk

5.對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至手機或模擬器,然后安裝並運行。這時你會看到程序運行后停留在白屏界面,這時不要動設備和退出程序,因為程序現在是運行到剛才添加的waitForDebugger代碼這里,這行代碼的意思是一直掛起中,等待調試器。

adb install debug.sign.apk

 

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

 

  7.啟動eclipse,構建java項目

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

    2) Project Name隨便起,Use default location選項去掉,Location選擇out文件夾,然后Next

    3) 把smali文件夾設為Source Folder,然后Finish

    8.在eclipse中,打開第2步找到的主類,並找到onCreate方法,在waitForDebugger后面的第一個方法開始添加斷點。如下圖

 

9.打開DDMS(路徑在%android-sdks%\tools\ddms.bat),如果在第6步中運行了修改后的程序,在DDMS的設備列表中會顯示可以調試的程序。

    對應程序最后一欄為8600/8700,其中8600即為調試該程序的端口。

用DDMS沒有獲得調試端口信息,我用的是monitor,如下圖

image

對應程序最后一欄為8611/8700,其中8611即為調試該程序的端口。 關閉monitor

10.現在要做的就是把代碼與調試程序關聯即可。 回到eclipse,配置遠程調試

    1) 菜單Run ->Debug Configurations

    2) 雙擊Remote Java Application,Host處默認localhost就行,Port填第10步得到的8611,然后Apply -> Debug。

image

 

11.這時eclipse自動切換至debug視圖,並看到程序已經運行並中斷在下一行可執行的代碼了,相關的變量可以直接查看了。

    總結

    已經可以用eclipse調試smali了,上面的例子是從程序開頭的地方開始調試,但要調試到自己所關心地方的代碼處確實麻煩。建議先用jd-gui等軟件直接查看反編譯的java代碼,確定要調試的位置后,再進入smali定位斷點並實時調試,就可以事半功倍。如果不需要在程序的開頭調試的話,建議把第三部的代碼注釋掉。

    相關工具可以在這里下載

    apktool: https://code.google.com/p/android-apktool/

    dex2jar: https://code.google.com/p/dex2jar/

    jd-gui: http://jd.benow.ca/

 

參考:

http://www.cnblogs.com/litou/p/3539281.html

https://code.google.com/p/android-apktool/wiki/SmaliDebugging


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM