有時候,我們需要在APK啟動時就附加上進程,等程序完全運行后再附加的方法顯然時機已經晚了!
比如想要調試SO庫的JNI_Onload函數,很多時候需要在程序啟動的時候就附加並且調試!
方法一、附加斷點法(先附加再下斷點)
優點:速度快
缺點:IDA v7.2 斷點在Jni_Onload后F5無法查看偽代碼,IDA6.8可以,原因未知!
1.首先需要給AndroidManifest.xml設置android:debuggable="true",否則會出現無法附加到模擬器的錯誤!

2.在CMD窗口下執行【adb devices】檢查模擬器是否正常連接

3.將IDA安裝目錄下dbgsrv文件夾下的android_server發送到安卓模擬器中,注意android_server文件所在路徑不能有中文和空格,否則adb push命令會出錯,我這里將android_server文件放在c盤根目錄下,使用以下命令將android_server發送到模擬器中。 【adb push C:\android_server /data/local/tmp】

4.執行【adb shell】命令

5.執行【su】 獲取root權限

6.執行【cd /data/local/tmp】 將路徑切換到/data/local/tmp下

7.執行【ls -l】 查詢目錄下所有文件以及讀寫權限

8.執行【chmod 777 android_server】 將android_server文件權限修改為777權限

9.再次執行【ls -l】查看文件權限是否修改成功

10.執行【./android_server】啟動android_server

11.原來的窗口別關,重新打開一個新的CMD窗口,執行【adb forward tcp:23946 tcp:23946】進行端口轉發

12.打開DDMS,打開就行了,只要能正常顯示進程列表就行。然后DDMS別關!

13.以Debug模式啟動進程 命令格式為:adb shell am start -D -n 包名/包名.入口Activity 【adb shell am start -D -n com.crackme.jnidynamicregtest/com.crackme.jnidynamicregtest.MainActivity】
命令執行之后,可以看到安卓模擬器啟動了進程,並且提示Waiting for debugger


14.打開IDA 菜單 Debugger->Attach->Remote ARM Linux/Android debugger,輸入127.0.0.1點擊OK


15.選擇要附加的進程,點擊OK

16.此時IDA已經正常附加進程,並且暫停下來

17.Debugger->Debugger option,勾選一下三項


18.打開剛才啟動的DDMS,查看進程端口,此時為8613

19.執行【jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8613】恢復java層運行,注意8613是DDMS里查詢到的端口號。

20.此時再到IDA中按F9可以看到IDA日志窗口會提示當前加載的SO庫文件

21.這時候就可以到Jni_Onload函數下斷,然后按F9就會斷在Jni_Onload函數

方法二、斷點附加法(先下斷點再附加)
優點:IDA可以直接F5查看偽代碼
缺點:速度相對第一種更慢
1.首先我們需要將APK文件里的so文件提取出來,方法很多,比如直接用ZIP解壓!

2.直接用IDA打開提取出來的libnative-lib.so文件,找到Jni_OnLoad函數並下好斷點

3.執行命令,啟動IDA的android_server服務 adb shell su cd /data/local/tmp ./android_server

4.以Debug模式啟動進程 命令格式為:adb shell am start -D -n 包名/包名.入口Activity 【adb shell am start -D -n com.crackme.jnidynamicregtest/com.crackme.jnidynamicregtest.MainActivity】 命令執行之后,可以看到安卓模擬器啟動了進程,並且提示Waiting for debugger


8.執行【adb forward tcp:23946 tcp:23946】進行端口轉發

9.打開DDMS並關

10.返回IDA,菜單 Debugger->Select debugger->Remote ARM Linux/Android debugger


11.菜單 Debugger->process option

12.HostName設置127.0.0.1,點擊OK

13.菜單 Debugger->Attach Process,選擇需要調試的進程


14.當看到IDA中斷下后按F9運行

15.執行【jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8604】恢復java層運行,注意8604是DDMS里查詢到的端口號。


16.IDA會提示檢測到相同的so文件,點擊same

17.等待漫長的過程后,發現已經成功在Jni_OnLoad函數斷下

18.IDA F5也能正常使用

三、附加技巧
改文件名 mv android_server as 改調試端口號 ./android_server -p123456 注意:p后面沒有空格 或者靜態path android_server 不打開DDMS附加方法: adb shell ps找到進程PID adb forward tcp:xxxx jdwp:PID jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=xxxx
