前言
這年頭仰挣,apk全都是加密啊冒冬,加殼啊伸蚯,反調(diào)試啊,小伙伴們表示已經(jīng)不能愉快的玩耍了简烤。靜態(tài)分析越來越不靠譜了剂邮,apktool、ApkIDE横侦、jd GUI挥萌、dex2jar等等等等已經(jīng)無法滿足大家的需求了。那么問題就來了枉侧,小伙伴們真正需要的是什么引瀑?好的,大家一起吶喊出你內(nèi)心的欲望吧榨馁,我們的目標是——“debug apk step by step”憨栽。
那些不靠譜的工具
先來說說那些不靠譜的工具,就是今天吭了我小半天的各種工具翼虫,看官上坐屑柔,待我細細道來。
IDA pro
IDA pro6.6之后加入了dex動態(tài)調(diào)試功能珍剑,一時間普天同慶掸宛、喜大普奔。興奮之后你才會發(fā)現(xiàn)IDA這東西在動態(tài)調(diào)試方面真的是很挫招拙,就算他是靜態(tài)反編譯之王旁涤,我也不得不說他的動態(tài)調(diào)試功能還非常需要加強。先說說使用ida調(diào)試dex的方法迫像。
IDA pro調(diào)試dex流程:
1.? ? ? ? 用apktool反編譯apk劈愚,添加android:debuggable=”true”,重打包apk并簽名
2.? ? ? ? 從apk文件中扣出class.dex文件闻妓,不管你用什么方法菌羽,7zip、unzip…whatever
3.? ? ? ? 用ida打開這個dex文件由缆,直到output window窗口顯示“xxxx finished”
4.? ? ? ? 設(shè)置debugger選項注祖,debugger->debugger options->set specific options猾蒂,按如圖1所示進行設(shè)置,然后一路確定返回
5.? ? ? ? 找到要下斷點的位置是晨,光標移到要下斷點的那一行肚菠,按f2下斷點
6.? ? ? ? 手機開啟調(diào)試選項,鏈接usb到電腦
7.? ? ? ? 選中IDA pro窗口罩缴,按f9走起蚊逢,不出意外的話應該會出現(xiàn)如圖2的畫面,成功啦~
觸發(fā)斷點箫章,在watch view和Locals窗口都能看到內(nèi)存變量的值烙荷,簡直就是畫美不看啊,是不是有點小興奮檬寂?终抽!我只能說高興的太早了,小伙伴們還是太天真了桶至,仔細觀察下昼伴,就算你勾選了“Hex display”,你還是無法以hex格式顯示變量的值镣屹,就是說不可顯示字符你都看不到值是什么亩码,而且我找了很久也沒找到類似windbg、od野瘦、vc6描沟、gdb、lldb那樣以各種姿勢或者命令直接查看某內(nèi)存地址值的功能鞭光,然后就出現(xiàn)了如圖3的畫面……WTF吏廉!我特么忙活了半天居然還不如直接logcat來得痛快!
apktool+eclipse
其實小生一直還是很支持eclipse的惰许,畢竟伴我度過了無數(shù)不眠之夜和懵懂的年華(當然蒼老師和windbg可能占的更多)席覆,可是這次我真的有點小失望哈。由于使用apktool+eclipse和apktool+android studio的調(diào)試方法跟apktool+idea一樣汹买,調(diào)試方法后面一起說佩伤,這里我就純吐槽了先。
當小伙伴們成功設(shè)置調(diào)試選項晦毙,帶著嗨翻的心情進入調(diào)試界面的時候生巡,我們看到了如圖4的畫面,細細觀察和各種嘗試之后见妒,我保證你的心里一定有一萬頭草泥馬奔騰而過9氯佟!!盐股。
我們都看到了啥:
?? ? ? ? debug窗口表示命中第30行的斷點
?? ? ? ? variables窗口沒有任何本地變量的值钱豁,寄存器的值也沒有
?? ? ? ? 單步步入、單步步過等調(diào)試按鈕都是灰色的疯汁,快捷鍵F5678都沒反應
我就想知道這你讓我怎么debug牲尺,難道我要設(shè)無限個斷點,拼命f9來調(diào)試幌蚊?就算是這樣谤碳,我該去哪兒看變量的值?
apktool+android studio
android studio這個東西本來是蠻不錯的霹肝,就是稍微有點卡,習慣了也還好塑煎。其實android studio本身就是用idea改的沫换,但是好像給改挫了。調(diào)試方法還是后面再說最铁,直接上成功掛載到調(diào)試界面的圖讯赏,如圖5。
這次情況是這樣的:
?? ? ? ? 可以看到現(xiàn)在程序停在哪一行冷尉,雖然不明顯
?? ? ? ? 本地變量能看到漱挎,但是寄存器還是木有啊
?? ? ? ? 單步按鈕還有單步快捷鍵都能用了,看起來好多了啊
我還是想說雀哨,問題是寄存器的值還是沒法直觀的看到啊磕谅,對于有強迫癥的我還是無法接受這種設(shè)定啊,想當年vc6雾棺、od膊夹、windbg、gdb捌浩、lldb是多么的給力放刨,多么的好用!
apktool+idea
正菜來了尸饺,apktool 2.0bete9版本推出了-d選項进统,專門用來重打包apk進行單步調(diào)試的,給力浪听!apktool+idea無源碼debug apk step by step簡直不要太好用螟碎,這也是我跟小波請教之后才弄好的,這個選項也是小波等人建議apktool作者這樣做的迹栓,不禁感嘆一句抚芦,波神你為何這么屌!
3.1調(diào)試基礎(chǔ)
本小節(jié)內(nèi)容引用自看雪論壇@火翼[CCG]的文章,原文鏈接:
http://www.kanxue.com/bbs/showthread.php?p=1291716
根據(jù)android的官方文檔叉抡,如果要調(diào)試一個apk里面的dex代碼尔崔,必須滿足以下兩個條件中的任何一個:
1.? ? ? ? apk中的AndroidManifest.xml文件中的Application標簽包含屬性android:debuggable=”true”
2.? ? ? ? /default.prop中ro.debuggable的值為1
由于正常的軟件發(fā)布時都不會把android:debuggable設(shè)置為false(當然也不排除某些很2的應用偏偏就是true),所以要達成條件1需要對app進行重新打包褥民,這不僅每次分析一個apk都重復操作季春,而且很多軟件會對自身進行校驗,重打包后執(zhí)行會被檢測到消返,所以想辦法滿足第2個條件是個一勞永逸的辦法载弄。
由于default.prop是保存在boot.img的ramdisk中,這部分每次重新啟動都會重新從rom中加載撵颊,所以要到目的必須修改boot.img中的ramdisk并重新刷到設(shè)備中宇攻。修改步驟如下(我沒試過,有興趣的倒騰下):
1.? ? ? ? 從Google官方網(wǎng)站下載到boot.img
2.? ? ? ? 使用工具(abootimg倡勇,gunzip, cpio)把boot.img完全解開逞刷,獲取到default.prop
3.? ? ? ? 修改default.prop
4.? ? ? ? 把修改后的文件重新打包成boot_new.img
5.? ? ? ? 使用fastboot工具把boot_new.img刷入設(shè)備(fastboot flash boot boot_new.img)
3.2調(diào)試方法
這里我們還是用第一種方法來進行測試:
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到調(diào)試設(shè)備(這個不用我說怎么操作吧);
6.下載安裝并打開idea拗馒,新建一個空的java項目路星,本例中項目名為“DebugOnly”,將apk反編譯后的smali目錄下的所有文件拷貝到剛才新建的java項目的src/目錄下诱桂,刷新洋丐,如圖6;
此時在調(diào)試設(shè)備上會顯示等待調(diào)試器接入:
8.從android device monitor上發(fā)現(xiàn)需要調(diào)試的程序已經(jīng)顯示在列表里面了挥等,記下端口號友绝,本例中為8700;
9. 新建遠程調(diào)試:依次點擊run-> edit configuration->“+”號->Remote肝劲,選中第6步中新建的項目迁客,填寫第8步中獲得的端口號郭宝,如圖10;
10.找到相應位置設(shè)置斷點(在想設(shè)斷點的位置前后多設(shè)置幾個斷點)掷漱,點擊run->debug->unnamed粘室,其中unnamed是第9步中新建的遠程調(diào)試的名字;
11.不出意外的話卜范,小伙伴們應該能看到如圖12所示的畫面衔统,恭喜你,已經(jīng)成功了海雪!此時此刻興奮之情簡直能以言表哈~good luck! have fun! enjoy~
后語
另外锦爵,阿呆曾經(jīng)提到一篇文章用jdb遠程調(diào)試android程序的文章,鏈接為:http://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications/奥裸,我沒有嘗試過险掀,主要是我比較懶,用apktool+idea已經(jīng)夠用了湾宙,就沒去倒騰樟氢,有興趣的小伙伴請自行倒騰,別忘了分享创倔!
最后嗡害,其實我也不確定ida是不是真的不能以hex格式顯示變量值焚碌,或許是我不會用ida咧畦攘;我也不確定eclipse到底能不能看寄存器的值,單步按鈕和快捷鍵到底能不能用十电,或許是我eclipse版本的問題咧知押;我也不確定android studio到底能不能看到寄存器的值,或許是我android studio版本的問題咧鹃骂,再或者我用的調(diào)試設(shè)備有問題咧台盯,再或者我的臉有問題咧……以上問題,如果哪位小伙伴知道怎么解畏线,跪求告知静盅!