前言:android
使用IDA進行動態調試so,有兩種方式進行調試,一種是調試啓動方式,調試啓動能夠調試jni_onload ,init_array 處的代碼,能夠在較早的時機獲得調試權限,通常反調試會在較早的時候進行啓動; 而另外一種則是附加調試,附加調試是在APP已經運行起來的時候進行附加調試,這兩種方式與Windows上的調試啓動和附加調試概念很類似;下面咱們來進行實踐把...shell
實踐環境:Windows 10 + IDA Pro 7.0 + Nexus5(4.4.4)tcp
正文:ide
第一種調試啓動:函數
1. 以調試的方式啓動程序(這樣能夠在jni_onload ,init_array 處斷下來)spa
adb shell am start -D -n com.yaotong.crackme/.MainActivity線程
2. 在IDA的主目錄 dbgsrv 目錄下 ,找到 android_server,拷貝到手機的 data/local/tmp/ 目錄下debug
adb push (android_server的目錄) /data/local/tmp3d
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