APK程式Dex檔案無原始碼除錯方法討論
那些不靠譜的工具
先來說說那些不靠譜的工具,就是今天吭了我小半天的各種工具,看官上坐,待我細細道來。IDA pro
IDA pro6.6之後加入了dex動態除錯功能,一時間普天同慶、喜大普奔。興奮之後你才會發現IDA這東西在動態除錯方面真的是很挫,就算他是靜態反編譯之王,我也不得不說他的動態除錯功能還非常需要加強。先說說使用ida除錯dex的方法。
IDA pro除錯dex流程:
1. 用apktool反編譯apk,新增android:debuggable=”true”,重打包apk並簽名2. 從apk檔案中扣出class.dex檔案,不管你用什麼方法,7zip、unzip…whatever
3. 用ida開啟這個dex檔案,直到output window視窗顯示“xxxx finished”
4. 設定debugger選項,debugger->debugger options->set specific options,按如圖1所示進行設定,然後一路確定返回
5. 找到要下斷點的位置,游標移到要下斷點的那一行,按f2下斷點
6. 手機開啟除錯選項,連結usb到電腦
7. 選中IDA pro視窗,按f9走起,不出意外的話應該會出現如圖2的畫面,成功啦~
圖 1 ida debug配置
圖 2 ida動態除錯apk
觸發斷點,在watch view和Locals
圖 3 Locals視窗
apktool+eclipse
其實小生一直還是很支援eclipse的,畢竟伴我度過了無數不眠之夜和懵懂的年華,可是這次我真的有點小失望哈。由於使用apktool+eclipse和apktool+android studio的除錯方法跟apktool+idea一樣,除錯方法後面一起說,這裡我就純吐槽了先。當小夥伴們成功設定除錯選項,帶著嗨翻的心情進入除錯介面的時候,我們看到了如圖4的畫面,細細觀察和各種嘗試之後,我保證你的心裡一定有一萬頭草泥馬奔騰而過!!!。
圖 4 eclipse單步除錯apk
我們都看到了啥: debug視窗表示命中第30行的斷點
variables視窗沒有任何本地變數的值,暫存器的值也沒有
單步步入、單步步過等除錯按鈕都是灰色的,快捷鍵F5678都沒反應
我就想知道這你讓我怎麼debug,難道我要設無限個斷點,拼命f9來除錯?就算是這樣,我該去哪兒看變數的值?
apktool+android studio
android studio這個東西本來是蠻不錯的,就是稍微有點卡,習慣了也還好。其實android studio本身就是用idea改的,但是好像給改挫了。除錯方法還是後面再說,直接上成功掛載到除錯介面的圖,如圖5。
圖 5 android studio單步除錯apk
這次情況是這樣的: 可以看到現在程式停在哪一行,雖然不明顯
本地變數能看到,但是暫存器還是木有啊
單步按鈕還有單步快捷鍵都能用了,看起來好多了啊
我還是想說,問題是暫存器的值還是沒法直觀的看到啊,對於有強迫症的我還是無法接受這種設定啊,想當年vc6、od、windbg、gdb、lldb是多麼的給力,多麼的好用!
apktool+idea
正菜來了,apktool 2.0bete9版本推出了-d選項,專門用來重打包apk進行單步除錯的,給力!apktool+idea無原始碼debug apk step by step簡直不要太好用,這也是我跟小波請教之後才弄好的,這個選項也是小波等人建議apktool作者這樣做的,不禁感嘆一句,波神你為何這麼屌!
3.1除錯基礎本小節內容引用自看雪論壇@火翼[CCG]的文章,原文連結:http://www.kanxue.com/bbs/showthread.php?p=1291716
根據android的官方文件,如果要除錯一個apk裡面的dex程式碼,必須滿足以下兩個條件中的任何一個:1. apk中的AndroidManifest.xml檔案中的Application標籤包含屬性android:debuggable=”true”
2. /default.prop中ro.debuggable的值為1
由於正常的軟體釋出時都不會把android:debuggable設定為false(當然也不排除某些很2的應用偏偏就是true),所以要達成條件1需要對app進行重新打包,這不僅每次分析一個apk都重複操作,而且很多軟體會對自身進行校驗,重打包後執行會被檢測到,所以想辦法滿足第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)
3.2除錯方法這裡我們還是用第一種方法來進行測試:
1.下載apktool2.0b9版本,下載地址:http://connortumbleson.com/2014/02/06/apktool-2-0-0-beta-9-released/
2.使用apktool反編譯apk:java -jar apktool_2.0.0b9.jar d -d xxx.apk -o out
加上-d選項之後反編譯出的檔案字尾為.java,而不是.smali,每個.java檔案立馬都偽造成了一個類,語句全都是“a=0;”這一句,smali語句成為註釋,小夥伴們自己看看開啟就知道了,做這些都是為了後面欺騙idea、eclipse、android studio這些ide的;
3.加入android:debuggable=”true”選項;
4.重打包apk,一定記得也使用-d選項:java -jar apktool_2.0.0b9.jar b -d out -o debug.apk
5.對apk進行簽名並安裝apk到除錯裝置(這個不用我說怎麼操作吧);
6.下載安裝並開啟idea,新建一個空的java專案,本例中專案名為“DebugOnly”,將apk反編譯後的smali目錄下的所有檔案拷貝到剛才新建的java專案的src/目錄下,重新整理,如圖6;
圖 6 拷貝檔案
圖 7 命令執行效果
此時在除錯裝置上會顯示等待偵錯程式接入:圖 8 除錯裝置狀態
8.從android device monitor上發現需要除錯的程式已經顯示在列表裡面了,記下埠號,本例中為8700;
圖 9 android device monitor
9. 新建遠端除錯:依次點選run->edit configuration->“+”號->Remote,選中第6步中新建的專案,填寫第8步中獲得的埠號,如圖10;
圖 10 debug設定
10.找到相應位置設定斷點(在想設斷點的位置前後多設定幾個斷點),點選run->debug->unnamed,其中unnamed是第9步中新建的遠端除錯的名字;
圖 11 遠端除錯名字
11.不出意外的話,小夥伴們應該能看到如圖12所示的畫面,恭喜你,已經成功了!此時此刻興奮之情簡直能以言表哈~good luck! have fun! enjoy~
本文轉載自:http://www.kanxue.com/bbs/showthread.php?p=1338639 版權由原作者所有,僅僅是為了轉載一下。
後面有空,親自再針對每一種方式的工具進行除錯細節的描述。