IDA遠程調試Android中so文件

                                IDA遠程調試Android中so文件

前言: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

 
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到該地址下斷點便可:
 
運行程序指定功能,觸發斷點,接着就能夠到達該函數進行調試了,嘿嘿...
相關文章
相關標籤/搜索