1. 程式人生 > >APK程式Dex檔案無原始碼除錯方法討論

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.png檢視次數: 32檔案大小: 288.8 KB檔案 ID : 94464

圖 1 ida debug配置

點選圖片以檢視大圖圖片名稱: 2.png檢視次數: 119檔案大小: 290.3 KB檔案 ID : 94465

圖 2 ida動態除錯apk

觸發斷點,在watch viewLocals

視窗都能看到記憶體變數的值,簡直就是畫美不看啊,是不是有點小興奮?!我只能說高興的太早了,小夥伴們還是太天真了,仔細觀察下,就算你勾選了“Hex display”,你還是無法以hex格式顯示變數的值,就是說不可顯示字元你都看不到值是什麼,而且我找了很久也沒找到類似windbg、od、vc6、gdb、lldb那樣以各種姿勢或者命令直接檢視某記憶體地址值的功能,然後就出現瞭如圖3的畫面……WTF!我特麼忙活了半天居然還不如直接logcat來得痛快!

點選圖片以檢視大圖圖片名稱: 3.png檢視次數: 20檔案大小: 88.5 KB檔案 ID : 94466

圖 3  Locals視窗

apktool+eclipse

其實小生一直還是很支援eclipse的,畢竟伴我度過了無數不眠之夜和懵懂的年華,可是這次我真的有點小失望哈。由於使用apktool+eclipse和apktool+android studio的除錯方法跟apktool+idea一樣,除錯方法後面一起說,這裡我就純吐槽了先。

當小夥伴們成功設定除錯選項,帶著嗨翻的心情進入除錯介面的時候,我們看到了如圖4的畫面,細細觀察和各種嘗試之後,我保證你的心裡一定有一萬頭草泥馬奔騰而過!!!。

點選圖片以檢視大圖圖片名稱: 4.png檢視次數: 107檔案大小: 248.0 KB檔案 ID : 94467

圖 4 eclipse單步除錯apk

我們都看到了啥:
  debug視窗表示命中第30行的斷點
  variables視窗沒有任何本地變數的值,暫存器的值也沒有
  單步步入、單步步過等除錯按鈕都是灰色的,快捷鍵F5678都沒反應

我就想知道這你讓我怎麼debug,難道我要設無限個斷點,拼命f9來除錯?就算是這樣,我該去哪兒看變數的值?

apktool+android studio

android studio這個東西本來是蠻不錯的,就是稍微有點卡,習慣了也還好。其實android studio本身就是用idea改的,但是好像給改挫了。除錯方法還是後面再說,直接上成功掛載到除錯介面的圖,如圖5。

點選圖片以檢視大圖圖片名稱: 5.png檢視次數: 144檔案大小: 292.2 KB檔案 ID : 94468

圖 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.png檢視次數: 64檔案大小: 191.8 KB檔案 ID : 94469

圖 6 拷貝檔案

點選圖片以檢視大圖圖片名稱: 7.png檢視次數: 12檔案大小: 83.2 KB檔案 ID : 94470

圖 7 命令執行效果

此時在除錯裝置上會顯示等待偵錯程式接入:
點選圖片以檢視大圖圖片名稱: 8.png檢視次數: 21檔案大小: 1,004.8 KB檔案 ID : 94471

圖 8 除錯裝置狀態

8.從android device monitor上發現需要除錯的程式已經顯示在列表裡面了,記下埠號,本例中為8700;

點選圖片以檢視大圖圖片名稱: 9.png檢視次數: 42檔案大小: 166.6 KB檔案 ID : 94472

圖 9 android device monitor

9. 新建遠端除錯:依次點選run->edit configuration->“+”號->Remote,選中第6步中新建的專案,填寫第8步中獲得的埠號,如圖10;

點選圖片以檢視大圖圖片名稱: 10.png檢視次數: 28檔案大小: 130.1 KB檔案 ID : 94473

圖 10 debug設定

10.找到相應位置設定斷點(在想設斷點的位置前後多設定幾個斷點),點選run->debug->unnamed,其中unnamed是第9步中新建的遠端除錯的名字;

點選圖片以檢視大圖圖片名稱: 11.png檢視次數: 11檔案大小: 135.5 KB檔案 ID : 94474

圖 11 遠端除錯名字

11.不出意外的話,小夥伴們應該能看到如圖12所示的畫面,恭喜你,已經成功了!此時此刻興奮之情簡直能以言表哈~good luck! have fun! enjoy~

點選圖片以檢視大圖圖片名稱: 12.png檢視次數: 211檔案大小: 294.2 KB檔案 ID : 94475

本文轉載自:http://www.kanxue.com/bbs/showthread.php?p=1338639 版權由原作者所有,僅僅是為了轉載一下。

後面有空,親自再針對每一種方式的工具進行除錯細節的描述。