轉貼地址:http://www.freebuf.com/tools/54562.htmlphp
0×01前言
html
這年頭,apk 全都是加密啊,加殼啊,反調試啊,小夥伴們表示已經不能愉快的玩耍了。靜態分析愈來愈不靠譜了,apktool、ApkIDE、jd GUI、dex2jar等已經沒法知足你們的需求了。那麼問題就來了,小夥伴們真正須要的是什麼?好的,你們一塊兒吶喊出你心裏的慾望吧,咱們的目標是—— 「debug apk step by step」。java
先來講說那些不靠譜的工具,就是今天吭了我小半天的各類工具,看官上坐,待我細細道來。android
2.1 IDA proshell
IDA pro6.6以後加入了dex動態調試功能,一時間普天同慶、喜大普奔。興奮以後你纔會發現IDA這東西在動態調試方面真的是很挫,就算他是靜態反編譯之王,我也不得不說他的動態調試功能還很是須要增強。先說說使用ida調試dex的方法。安全
IDA pro調試dex流程:app
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配置eclipse
圖 2 ida動態調試apkide
觸發斷點,在watch view和Locals窗口都能看到內存變量的值,簡直就是畫美不看啊,是否是有點小興奮?!我只能說高興的太早了,小夥伴們仍是太天真了,仔細觀察下,就算你勾選了「Hex display」,你仍是沒法以hex格式顯示變量的值,就是說不可顯示字符你都看不到值是什麼,並且我找了好久也沒找到相似windbg、od、 vc六、gdb、lldb那樣以各類姿式或者命令直接查看某內存地址值的功能,而後就出現瞭如圖3的畫面……WTF!我特麼忙活了半天竟然還不如直接logcat來得痛快!工具
圖 3 Locals窗口
2.2 apktool+eclipse
其實小生一直仍是很支持eclipse的,畢竟伴我度過了無數不眠之夜和懵懂的年華(固然蒼老師和windbg可能佔的更多),但是此次我真的有點小失望哈。因爲使用 apktool+eclipse和apktool+android studio的調試方法跟apktool+idea同樣,調試方法後面一塊兒說,這裏我就先純吐槽了。
當小夥伴們成功設置調試選項,帶着嗨翻的心情進入調試界面的時候,咱們看到了如圖4的畫面,細細觀察和各類嘗試以後,我保證你的內心必定有一萬頭草泥馬奔騰而過!!!。
圖 4 eclipse單步調試apk
咱們都看到了啥:
1.debug窗口表示命中第30行的斷點
2.variables窗口沒有任何本地變量的值,寄存器的值也沒有
3.單步步入、單步步過等調試按鈕都是灰色的,快捷鍵F5678都沒反應
我就想知道這你讓我怎麼debug,難道我要設無限個斷點,拼命f9來調試?就算是這樣,我該去哪兒看變量的值?
2.3 apktool+android studio
android studio這個東西原本是蠻不錯的,就是稍微有點卡,習慣了也還好。其實android studio自己就是用idea改的,可是好像給改挫了。調試方法仍是後面再說,直接上成功掛載到調試界面的圖,如圖5。
圖 5 android studio單步調試apk
此次狀況是這樣的:
1.能夠看到如今程序停在哪一行,雖然不明顯
2.本地變量能看到,可是寄存器仍是木有啊
3.單步按鈕還有單步快捷鍵都能用了,看起來好多了啊
我仍是想說,問題是寄存器的值仍是無法直觀的看到啊,對於有強迫症的我仍是沒法接受這種設定啊,想當年vc6、od、windbg、gdb、lldb是多麼的給力,多麼的好用!
0×03 apktool+idea
正菜來了,apktool 2.0bete9版本推出了-d選項,專門用來重打包apk進行單步調試的,給力!apktool+idea無源碼debug apkstep 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/
java -jar apktool_2.0.0b9.jar d -d xxx.apk -o out
加上-d選項以後反編譯出的文件後綴爲.java,而不是.smali,每一個.java文件立馬都僞形成了一個類,語句全都是「a=0;」這一句,smali語句成爲註釋,小夥伴們本身看看打開就知道了,作這些都是爲了後面欺騙idea、eclipse、androidstudio這些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.打開androiddevice monitor(終端下敲命令monitor或者ddms),終端下運行命令:adb shell am start -D -n {Package Name}/.{Activity},運行效果如圖7;
圖 7命令運行效果
此時在調試設備上會顯示等待調試器接入:
圖 8調試設備狀態
8.從androiddevice 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~
圖 12 idea單步調試apk
0×04後語
另外,阿呆曾經提到一篇文章用jdb遠程調試android程序的文章,連接爲:http://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications/,我沒有嘗試過,主要是我比較懶,用apktool+idea已經夠用了,就沒去倒騰,有興趣的小夥伴請自行倒騰,別忘了分享!
最後,其實我也不肯定ida是否是真的不能以hex格式顯示變量值,或許是我不會用ida咧;我也不肯定eclipse到底能不能看寄存器的值,單步按鈕和快捷鍵到底能不能用,或許是我eclipse版本的問題咧;我也不肯定android studio到底能不能看到寄存器的值,或許是我android studio版本的問題咧,再或者我用的調試設備有問題咧,再或者個人臉有問題咧……以上問題,若是哪位小夥伴知道怎麼解,跪求告知!
[做者/阿里聚安全-軒夏 Jason_HZ,轉載須註明來自FreeBuf.COM]