本文是記錄自己學習IDA的一些總結與歸納,並將其體現成具體功能,便於複習與交流,有不對之處望大家包容並指出,歡迎大家留言收藏
本篇對比IDA動態調試android的so文件第一篇大體相同,但是也有不同之處,具體可以根據具體需求選擇不同的方式
環境
環境
- 小米5 - root - android7.0
- IDA pro 7.0
- so包是32位
- android運行demo並進入主界面這時候不會加載so包,點按鈕運行加載so包並執行native函數
- 如果出現其他問題可以參考IDA常見問題
- 附加GitHub地址下載apk
配置
- 複製IDA 安裝目錄下dbgsrv 文件裏面的android_server文件到 手機內存儲的 /data/local/tmp 目錄下
- 控制檯輸入
adb shell su
命令獲取管理員權限 - 控制檯輸入
setenforce 0
命令 關閉保護(每次關機後開機都要重新設置) - 控制檯輸入:
cd /data/local/tmp
進入android_server目錄 ,輸入:chmod 777 android_server
命令獲取執行權限
開始
-
控制檯輸入
adb shell su
命令獲取管理員權限 -
輸入:
./data/local/tmp/android_server
啓動android_server -
新開一個命令窗口 不用獲取管理員權限
-
直接輸入
adb forward tcp:23946 tcp:23946
命令 端口轉發 -
adb shell am start -D -n 包名/activity路徑 啓動應用,例如:
adb shell am start -D -n com.example.androidida/com.example.androidida.MainActivity
-
打開IDA -> 不要選擇文件
-
然後選擇debugger -> Attach -> Remote ARM linux/Android debugger
-
hostname = 127.0.0.1 post = 23946 然後點擊debug options , 設置如下圖 , 設置完成後都點擊ok
-
這時候到選擇進程的彈框 ,選擇自己apk的進程,點ok
-
出現如下圖界面,點擊開始按鈕(F9) ,如果有反調試的話,一定要先下斷點,不然一運行就崩潰了,這裏運行自己的就沒事
-
打開Android Device Minitor , 查看端口,這裏是8612
-
控制檯輸入:
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8612
注意:我這裏是8612,自己的是多少就填多少, 輸完這時候Android Device Minitor的小瓢蟲會變成綠色,並且IDA程序會開始運行 -
IDA一直按運行按鈕(F9) , 直到加載完 , 有以下幾點注意:之後會有彈框,有ok按ok , 有yes按yes , 由於本次app在啓動MainActivity不會加載so包,所以一直按到運行按鈕不能按
-
點擊IDA的菜單欄的Debugger菜單中的Debugger options項,按照如下彈框選擇(這是上面已經做過的,但是這裏還是需要重新打開一下)
-
測試apk點擊按鈕進入加載so的頁面,這時候會斷自動斷點
-
這裏要慢點按運行按鈕 , 每次運行查看so包是否加載了 (control + s鍵可以查看已經加載的so包)
-
加載so包之後, 在general registers查看so包的函數(ctrl +F可以搜索) , 雙擊so包
-
搜索自己定義的函數名稱,雙擊函數名
-
雙擊函數名後,在Debug View試圖會定位到函數位置,按F2 可以給選中行下斷點,如下:
-
下好斷點之後,按鈕IDA的運行按鈕(F9) , 一直到指示線條變色,說明已經斷點成功(提示: F8運行下一個斷點)
總結
這個動態調試的第二種方案 , 並沒有結合靜態so包 ,這種方式的優點相比動態和靜態結合 , 這個方式更加快速簡單 , 缺點就是這樣調試 ,有很多功能是不能用的