前提條件和運行環境必定要寫清楚,否則會有不少坑,坑死人。android
(1)IDA 是最新的7.0版本 (2) JDB 使用Java安裝目錄下的 (3)系統是win10 使用命令窗口時有很大的差異shell
(4)手機是4.4 如下系統 app
1.手機要有Root權限tcp
2.複製IDA 安裝目錄下dbgsrv 文件裏面的android_server文件到 手機內存儲的 /data/local/tmp 目錄下函數
3.控制檯輸入 adb shell su 命令獲取管理員權限.net
4.cd /data/local/tmp 進入android_server目錄 ,輸入chmod 777 android_server命令獲取執行權限debug
5. ./android_server啓動android_server調試
6.新開一個命令窗口 不用獲取管理員權限server
直接輸入 adb forward tcp:23946 tcp:23946 命令 端口轉發blog
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,將Eclipse切換到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恢復執行。
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步的視圖中查看內存
from:https://blog.csdn.net/marketandtechnology/article/details/82116074