IDA遠程調試Android中so文件


                                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

 
7. 選擇要進行調試的APP
 
ok 則進入調試界面,注意,這時候還不能進行動態調試...
 

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)

 
如果成功執行jdb -connect DDMS上蟲子圖標會變成綠色...
 

連接成功后,在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。

 

 
 
0x753030000 + 0x1B9C = 0x75304B9C (JNI_OnLoad在APP進程中的地址)
 

這里需要說明的是:有可能在快捷鍵CTRL + S跳出的窗口中有兩個同名的so,我們應當選擇權限為RX的這個,RX一般是代碼段,RW一般是數據段。

 

10. 得到真實地址后,在IDA中按下快捷鍵G跳轉到這個地址,然后按下快捷鍵F2就完成在JNI_OnLoad函數入口處下斷點了。如果想直接在native函數下斷點,那么另開一個IDA 進行靜態查看函數地址然后轉換成為動態加載起來的地址,接着G到該地址下斷點即可


 

11. 再次按下F9,則在JNI_OnLoad斷了下來,接着就可以進行調試等系列操作了...

 
 
接着我們講的是第二種,附加方式調試so:
 
1. 拷貝android_server
adb push android_server的目錄) /data/local/tmp
 
2. 修改執行權限並執行
adb shell chmod 755 /data/local/tmp/android_server

adb shell

su

cd data/local/tmp

./android_server

 
4. 轉發端口
adb forward tcp:23946 tcp:23946
 
5. 啟動android_server
    這里我發現一個小問題,就是退出調試以后再次調試,android_server沒有close,按道理是可以再一次連接的,但是我這里則是無法進行再次連接調試,所以需要重新啟動一下android_server
如下:(14061是pid)
root@android:/ # ps | grep android_server
root 14061 13574 11180 9504 ffffffff 40183da0 S /data/local/tmp/android_server 
root@android:/ # kill -s 9 14061 
 

6打開IDA,選擇菜單Debugger -> Attach -> Remote ARM Linux/Android debugger

 

Hostname 填寫 127.0.0.1或者locahost (都是一個意思)

Port 自動填的23946


選擇要進行調試的APP
 
得到進程中地址后,在IDA中按下快捷鍵G跳轉到這個地址,然后按下快捷鍵F2就完成在JNI_OnLoad函數入口處下斷點了。如果想直接在native函數下斷點,那么另開一個IDA 進行靜態查看函數地址然后轉換成為動態加載起來的地址,接着G到該地址下斷點即可:
 
運行程序指定功能,觸發斷點,接着就可以到達該函數進行調試了,嘿嘿...
 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM