Android IDA 动态调试最完善攻略,跨过各种坑
?
From:https://www.pianshen.com/article/3409449384/
IDA 靜態(tài)分析 與 動(dòng)態(tài)分析:https://zhuanlan.zhihu.com/p/38983223
新手向總結(jié):IDA 動(dòng)態(tài)調(diào)試 So 的一些坑:https://zhuanlan.zhihu.com/p/145383282
Android 逆向之旅 --- 動(dòng)態(tài)方式破解 apk 進(jìn)階篇 ( IDA 調(diào)試 so 源碼 ):https://zhuanlan.zhihu.com/p/23321571
IDA 動(dòng)態(tài)調(diào)試 逆向 so 庫:https://zhuanlan.zhihu.com/p/40174083
Android 未root 環(huán)境下使用 IDA 調(diào)試:https://www.pianshen.com/article/6759779793/
?
IDA 動(dòng)態(tài)調(diào)試 android 的 so 文件 (二):https://www.pianshen.com/article/29271382106/
?
*********************?前提條件 和 運(yùn)行環(huán)境 一定要寫清楚,不然會(huì)有很多坑,坑死人。?*********************
雷電、藍(lán)疊的 cpu 是 x86 的,ida不能正常調(diào)試,需要用 Android 編譯器自帶的創(chuàng)建模擬器。
ida模擬器動(dòng)態(tài)調(diào)試,當(dāng)執(zhí)行到斷點(diǎn)時(shí)會(huì)出現(xiàn)錯(cuò)誤,通過百度知道是因?yàn)槔纂?、藍(lán)疊模擬器的cpu都是x86的架構(gòu),所以用來調(diào)試就會(huì)出錯(cuò),通過觀看視頻發(fā)現(xiàn)教程中用的是Android自帶的模擬器,所以這里也是創(chuàng)建一個(gè)模擬器。
用 Android studio 創(chuàng)建模擬器會(huì)出現(xiàn)下面的選項(xiàng),選擇 Other Images 選項(xiàng),這時(shí)顯示出 armeabi-v7a,選擇這個(gè)創(chuàng)建模擬器,就是 arm 的模擬器不是 x86,能正常調(diào)試。
?
動(dòng)態(tài)啟動(dòng)調(diào)試(IDA 調(diào)試 Android 方法及簡單的脫殼實(shí)現(xiàn):https://www.pianshen.com/article/12891271497/)
Android Killer 反編譯 x.apk,取出 classes.dex Dalvik文件,記錄包名和啟動(dòng)類名。
修改 AndroidManifest.xml 文件,在 <application> 標(biāo)簽里添加屬性 android:debuggable="true" ?這一步越早修改越好,防止忘記改??梢圆榭匆幌翧ndroidManifest.xml 他們的對應(yīng)關(guān)系,加深理解。
用 AndroidKiller 重新編譯修改過的 x_fix.apk。
adb install x_fix.apk? 安裝到手機(jī)
將 IDA 安裝目錄 dbgsrv 目錄下的 android_server 文件拷入手機(jī)
adb push dbgsrv\android_server /data/data/android_server
接著執(zhí)行
? ? ? ? adb shell chmod 655 /data/data/android_server 添加可執(zhí)行權(quán)限
? ? ? ? adb shell /data/data/android_server?? ? ? ? ? 將其運(yùn)行起來
?
步驟:
(1) IDA 是 7.0 版本?
(2) JDB 使用 Java 安裝目錄下的
(3) 系統(tǒng)是 win10, 使用命令窗口時(shí)有很大的差別
?
(4) 手機(jī)是4.4 以下系統(tǒng)? ??
1.手機(jī)要有 Root 權(quán)限
2.復(fù)制 IDA 安裝目錄下 dbgsrv 文件里面的 android_server 文件到手機(jī)內(nèi)存儲(chǔ)的? /data/local/tmp 目錄下
adb push dbgsrv\android_server /data/data/android_server
3.控制臺(tái)輸入 adb shell su 命令獲取管理員權(quán)限
4.cd /data/local/tmp 進(jìn)入android_server目錄?,輸入chmod 777 android_server 命令獲取執(zhí)行權(quán)限
5.? ./android_server 啟動(dòng) android_server
6. 新開一個(gè)命令窗口? ? 不用獲取管理員權(quán)限,直接輸入?adb forward tcp:23946 tcp:23946? ?命令 端口轉(zhuǎn)發(fā)
7.adb shell am start -D -n??包名/activity路徑? ?啟動(dòng)應(yīng)用
adb shell am start -D -n com.cmxxzwy.mz/com.e4a.runtime.android.mainActivity
8.打開 IDA?
9. 菜單 debugger->attach->Remote ARM Linux/android debugger
10.debug options 一定要選
11. hostname 處輸入127.0.0.1
12. 點(diǎn)擊 ok 后,在彈出的進(jìn)程選擇框 選擇要調(diào)試的 com.cmxxzwy.mz 進(jìn)程
13. 手機(jī)上的 App 開始運(yùn)行后,一定要點(diǎn)擊 IDA 的開始運(yùn)行按鈕。如果有反調(diào)試的話,一定要先下斷點(diǎn),不然一運(yùn)行就崩潰了,一切重新來過。
14. 打開 DDMS,下一步要用
15. 查看? 要調(diào)試的進(jìn)程,發(fā)現(xiàn) 8700 端口被占用。可以使用 8677 端口
?jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700要改為
?jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8677
用 jdb 將 app 恢復(fù)執(zhí)行。
最后在命令行中輸入: jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700 這一步的作用是使程序恢復(fù)運(yùn)行。(注意這時(shí)候如果ida里還沒有點(diǎn)擊運(yùn)行,程序是不會(huì)真的繼續(xù)運(yùn)行的) 這時(shí)候就可以正常地在IDA里下斷調(diào)試了。?
為了使用 jdb 恢復(fù)程序的運(yùn)行,我們需要:
- APK 的 AndroidManifest.xml 中 debuggable 為 true
- 或是 根目錄下 的 ro.debuggable的值為1,如下圖所示:
參考:IDA調(diào)試 :https://www.pianshen.com/article/1916803437/
C:\>adb devices List of devices attached 040ACGD7SAE2 deviceC:\>adb shell shell@mx2:/ $ su root@mx2:/ # exit shell@mx2:/ $ exitC:\>adb shell su root@mx2:/ # cat default.prop | grep debug cat default.prop | grep debug ro.debuggable=0 root@mx2:/ # getprop ro.debuggable getprop ro.debuggable 0 root@mx2:/ #?
16. 好了可以開始調(diào)試了 F7進(jìn)入函數(shù),F8單步調(diào)試,F9跳到下一個(gè)斷點(diǎn),F2下斷點(diǎn),G調(diào)到函數(shù)地址
?
17. 以某數(shù)字加固為例 給 libc.so 的 fopen 函數(shù)起始位置下斷點(diǎn)。
然后一路F9, 直到出現(xiàn)
然后開始F8,一直F8執(zhí)行,知道出現(xiàn)如下提示框
才真正進(jìn)入我們要調(diào)試的 so庫
?
18. 動(dòng)態(tài)調(diào)試的時(shí)候面對的都是 Arm 匯編,理解能力要跟的上調(diào)試速度,這有點(diǎn)難。怎么辦?
那就是動(dòng)靜態(tài)結(jié)合調(diào)試。我們來看動(dòng)態(tài)調(diào)試窗口
1 為這句代碼的動(dòng)態(tài)內(nèi)存地址。 2 為該so文件的動(dòng)態(tài)內(nèi)存基地址。??3 為內(nèi)存段的大小。
靜態(tài)調(diào)試窗口顯示的都是代碼的相對偏移地址,所以我們用? 1動(dòng)態(tài)內(nèi)存地址? - 2內(nèi)存基地址 = 靜態(tài)相對偏移地址
所以?F24B4 就是靜態(tài)代碼的偏移地址。所以我們打開靜態(tài)調(diào)試窗口就可以看到
這樣,動(dòng)態(tài)和靜態(tài)的代碼就對上了,用靜態(tài)的代碼來記錄動(dòng)態(tài)調(diào)試的位置信息,就不怕調(diào)試過程中斷帶來的麻煩。而且使用F5來輔助理解代碼也是棒棒噠
?
19. 動(dòng)態(tài)調(diào)試過程往往反反復(fù)復(fù),命令有時(shí)候懶得重新輸入??旖萱I ctrl +c 結(jié)束當(dāng)前命令程序,按上下鍵輸入之前輸過的命令。
20. 有時(shí)候,跳轉(zhuǎn)到指定地址的時(shí)候全是 DCB 數(shù)據(jù),這怎么辦
這個(gè)時(shí)候可以按 C 鍵識(shí)別為代碼,或者按 P 鍵識(shí)別為函數(shù)
?
21.我們動(dòng)態(tài)調(diào)試經(jīng)常就是為了看內(nèi)存,那么怎么看內(nèi)存。很簡單,執(zhí)行下圖前三步,就能在4步的視圖中查看內(nèi)存
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Android IDA 动态调试最完善攻略,跨过各种坑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 组队竞赛
- 下一篇: 安卓逆向_5 --- Android 学