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