網上公開IDA6.6已經有一段時間,這個版本有個好處就是可以動態調試java代碼。正好現在需要動態調試,所以順便練習一下。
根據android的官方文檔,如果要調試一個apk里面的dex代碼,必須滿足以下兩個條件中的任何一個:
1.apk中的AndroidManifest.xml文件中的Application標簽包含屬性android:debuggable=”true”
2./default.prop中ro.debuggable的值為1
由於一般軟件發布時都會把android:debuggable設置為false,所以要達成條件1需要反編譯原apk,修改AndroidManifest.xml並進行重新打包,這樣不僅麻煩,而且很多軟件進行了加固,要破解很難。所以想辦法滿足第2個條件是個一勞永逸的辦法。
由於default.prop是保存在boot.img的ramdisk中,這部分每次重新啟動都會重新從rom中加載,所以要到目的必須修改boot.img中的ramdisk並重新刷到設備中。修改步驟如下:
1.從Google官方網站下載到boot.img 2.使用工具(abootimg,gunzip, cpio)把boot.img完全解開,獲取到default.prop 3.修改default.prop 4.把修改后的文件重新打包成boot_new.img 5.使用fastboot工具把boot_new.img刷入設備(fastboot flash boot boot_new.img)
由於我們這篇文章的重點是如何動態調試dex代碼,所以我們就假設該dex是可調試的。
1.用ida打開apk文件,選擇dex文件進行加載 2.設置debugger選項,Debugger->Debugger options->Set specific options,按如圖1所示進行設置(adb路徑也要設置),然后一路確定返回 3.找到要下斷點的位置,光標移到要下斷點的那一行,按f2下斷點 4.手機開啟調試選項,連接到電腦,運行apk 5.選中IDA pro窗口,按f9運行,如果出現如圖2的畫面,就說明設置成功,可以進行動態調試了。
圖1 調試設置
圖2 調試界面
如何查看寄存器的值呢?選中ida->debugger->use source level debugger,然后點擊ida->debugger->debugger windows->locals打開本地變量窗口,就可以查看寄存器的值了。
如果變量的值出現“Bad type”的情況,如下圖所示:
可以按下述步驟解決:
點擊“Debugger->Debugger windows->Watch view”,會彈出“Watch view”窗口:
然后在Watch view窗口中右擊,選擇“Add watch”:
然后在彈出的窗口中自己為變量添加一個類型,類似這樣:
(Object*)v0 (String)v0 (char*)v0 (int)v0
假設我們要設置v0寄存器值的類型為String類型,就在在彈出的對話框中輸入(String)v0,點擊“OK”就可以在Watch view窗口中看到變量值了。
注意:如果運行過程中一直顯示如圖3所示窗口,就需要關注一下你的手機屏幕,看是否是需要與用戶進行交互了。
圖3