安卓逆向11.IDA以Debug模式啟動APK調試SO的JNI_OnLoad函數的兩種辦法


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

  


免責聲明!

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



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