網上公開IDA6.6已經有一段時間,這個版本有個好處就是能夠動態調試java代碼。正好如今須要動態調試,因此順便練習一下。html
根據android的官方文檔,若是要調試一個apk裏面的dex代碼,必須知足如下兩個條件中的任何一個:java
1.apk中的AndroidManifest.xml文件中的Application標籤包含屬性android:debuggable=」true」android
2./default.prop中ro.debuggable的值爲1windows
因爲通常軟件發佈時都會把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是可調試的。debug
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 調試界面code
如何查看寄存器的值呢?選中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