IDA遠程調試Android中so文件
前言:
使用IDA進行動態調試so,有兩種方式進行調試,一種是調試啟動方式,調試啟動可以調試jni_onload ,init_array 處的代碼,可以在較早的時機得到調試權限,一般反調試會在較早的時候進行啟動; 而另一種則是附加調試,附加調試是在APP已經運行起來的時候進行附加調試,這兩種方式與Windows上的調試啟動和附加調試概念很相似;下面我們來進行實踐把...
實踐環境:Windows 10 + IDA Pro 7.0 + Nexus5(4.4.4)
正文:
第一種調試啟動:
1. 以調試的方式啟動程序(這樣可以在jni_onload ,init_array 處斷下來)
adb shell am start -D -n com.yaotong.crackme/.MainActivity

2. 在IDA的主目錄 dbgsrv 目錄下 ,找到 android_server,拷貝到手機的 data/local/tmp/ 目錄下
adb push (android_server的目錄) /data/local/tmp

3. 使用chmod修改android_server程序的執行權限並執行:
adb shell chmod 755 /data/local/tmp/android_server

執行android_server
adb shell
su
cd data/local/tmp
./android_server

4. 新開一個cmd窗口使用forward程序進行端口轉發:
adb forward tcp:23946 tcp:23946

5. 打開方法調試:
打開IDA,選擇菜單Debugger -> Attach -> Remote ARM Linux/Android debugger

6. Hostname 填寫 127.0.0.1或者locahost (都是一個意思)
Port 自動填的23946



8. 點擊菜單Debugger->Debugger Opitions 在彈出的Debugger setup窗口的Events中選擇 Suspend on Process entry和Suspend on thread start/exit 以及 Suspend on library load/unload,再點擊OK退出。通過此操作可以設置程序在創建新線程和加載so時自動中斷。

通過DDMS獲取相應進程的端口號,然后使用jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=XXXX(DDMS查詢到的端口號,一般ddms進行轉發后的端口都是8700)


連接成功后,在IDA按F9后手機上的“waiting for debugger"提示會自動消失,這個時候應該已經斷在新線程,或者加載so處了。

9. 現在就可以在IDA中按下快捷鍵CTRL + S來查看要調試的so是否已經加載了,如果沒有就F9,直到加載了為止;如果已經有了,就記下該so的start位置,然后另開一個ida分析.so庫,找到JNI_ONLOAD的偏移地址,那么該JNI_OnLoad函數在進程中的真實地址就是so.start + JNI_OnLoad_Offset。


這里需要說明的是:有可能在快捷鍵CTRL + S跳出的窗口中有兩個同名的so,我們應當選擇權限為RX的這個,RX一般是代碼段,RW一般是數據段。
10. 得到真實地址后,在IDA中按下快捷鍵G跳轉到這個地址,然后按下快捷鍵F2就完成在JNI_OnLoad函數入口處下斷點了。如果想直接在native函數下斷點,那么另開一個IDA 進行靜態查看函數地址然后轉換成為動態加載起來的地址,接着G到該地址下斷點即可
11. 再次按下F9,則在JNI_OnLoad斷了下來,接着就可以進行調試等系列操作了...

adb shell
su
cd data/local/tmp
./android_server
6打開IDA,選擇菜單Debugger -> Attach -> Remote ARM Linux/Android debugger

Hostname 填寫 127.0.0.1或者locahost (都是一個意思)
Port 自動填的23946



