解密所有APP运行过程中的内部逻辑
1. 前言
? ? ? 這年頭,apk全都是加密啊,加殼啊,反調試啊,小伙伴們表示已經不能愉快的玩耍了。靜態分析越來越不靠譜了,apktool、ApkIDE、jd GUI、dex2jar等等等等已經無法滿足大家的需求了。那么問題就來了,小伙伴們真正需要的是什么?好的,大家一起吶喊出你內心的欲望吧,我們的目標是——“debug apk step by step”。2. 那些不靠譜的工具
? ? ? 先來說說那些不靠譜的工具,就是今天吭了我小半天的各種工具,看官上坐,待我細細道來。2.1 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的畫面,成功啦~
?圖 2 ida動態調試apk ? ? ? 觸發斷點,在watch view和Locals窗口都能看到內存變量的值,簡直就是畫美不看啊,是不是有點小興奮?!我只能說高興的太早了,小伙伴們還是太天真了,仔細觀察下,就算你勾選了“Hex display”,你還是無法以hex格式顯示變量的值,就是說不可顯示字符你都看不到值是什么,而且我找了很久也沒找到類似windbg、od、vc6、gdb、lldb那樣以各種姿勢或者命令直接查看某內存地址值的功能,然后就出現了如圖3的畫面……WTF!我特么忙活了半天居然還不如直接logcat來得痛快!
?
圖 3 ?Locals窗口
2.2 apktool+eclipse
? ? ? 其實小生一直還是很支持eclipse的,畢竟伴我度過了無數不眠之夜和懵懂的年華(當然蒼老師和windbg可能占的更多),可是這次我真的有點小失望哈。由于使用apktool+eclipse和apktool+android studio的調試方法跟apktool+idea一樣,調試方法后面一起說,這里我就純吐槽了先。? ? ? 當小伙伴們成功設置調試選項,帶著嗨翻的心情進入調試界面的時候,我們看到了如圖4的畫面,細細觀察和各種嘗試之后,我保證你的心里一定有一萬頭草泥馬奔騰而過!!!。
?
? ? ? 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是多么的給力,多么的好用!
3. 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;
?
?
圖 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~
?
4. 后語
? ? ? 另外,阿呆曾經提到一篇文章用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版本的問題咧,再或者我用的調試設備有問題咧,再或者我的臉有問題咧……以上問題,如果哪位小伙伴知道怎么解,跪求告知!
作者:軒夏
原文地址: http://jaq.alibaba.com/blog.htm?id=52
總結
以上是生活随笔為你收集整理的解密所有APP运行过程中的内部逻辑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse项目迁移到Android
- 下一篇: 无源码动态调试APK