有時候,我們需要在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