天天看點

IDA動态調試so 指南

首先我們如果想要在調試的so的初始化JNI_OnLoad的函數裡面下斷點,去測試是否有反調試等操作,首先應該以啟動調試模式去操作。

第一步:首先以debug模式去啟動調試的app程式。

IDA動态調試so 指南

指令為: adb shell am start -D -n 包名/.activity名字

以debug模式啟動後,打開ddms工具,檢視下是否有小紅蜘蛛出現了,如果出現了則說明關聯上了。

IDA動态調試so 指南

第二步:啟動android_server 腳本,把android_server 拷貝到data/local/tmp檔案夾下,設定上權限,并且以root使用者權限去運作。

IDA動态調試so 指南

第三步:這時候我們手機端的端口已經開啟了監聽了,接下來再把端口資料轉發到ida上面去。

IDA動态調試so 指南

我上面手機端監聽的23946端口(預設端口),轉發的就是23946的預設端口。

第四步:轉發成功後,啟動ida工具,32位的,選擇remote ARMLinux/Android debugger 調試模式

IDA動态調試so 指南

第五步:設定本機ip和端口号資訊

IDA動态調試so 指南

第六步:設定debug options,點選上方的debug options ,将下方的 事件監聽全部勾選上,接下來點選ok。

IDA動态調試so 指南

第七步: 接下來就能看到此裝置上面所有的程序了,選擇我們要調試的程序資訊,選中,并點選ok。

IDA動态調試so 指南

第八步:點選ok後,其實就已經進入系統斷點中了,我們從下圖可以看到系統斷在了libc.so 中,這個是加載的系統關鍵類的so檔案,我們再次設定下 debug options ,再次勾選上面三個event事件的選項,并點選确定。

IDA動态調試so 指南
IDA動态調試so 指南
IDA動态調試so 指南

第九步:此時我們需要讓他繼續執行,因為在modules list 加載清單中,我并沒有看到我自己的so被加載進去。我們按下f9,繼續執行。

第十步:由于我在c層跳過了并讓他繼續執行,但是java層還是處于一個調試的狀态,此時應該輸入如下指令

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1, port=8600

讓java層也繼續執行下去。 此時去檢視下ddms裡面調試的程序的端口資訊。

IDA動态調試so 指南

如上面我這個程序的端口資訊是8600或者8700都可以,執行後效果如下圖一樣。就表示啟動了jdb調試。

IDA動态調試so 指南

此時我們看下ddms的蜘蛛的狀态變為了綠色,已經是可調試的狀态了。

IDA動态調試so 指南

第十一步:接下來我們看到app的界面從wait for debug狀态變為了黑屏,我們繼續回到ida中去檢視,發現已經自動斷在linker.so上面了,這個是連結加載器,初始化so用的,此時我們打開modules list視窗,查找我們需要調試的so。

IDA動态調試so 指南
IDA動态調試so 指南
IDA動态調試so 指南

第十二步:輕按兩下找到我們需要調試的so,如下圖我已經找到了JNI_OnLoad方法了。輕按兩下進去,然後就跳到該方法處了。

IDA動态調試so 指南

第十三步:如下圖所示,我已經下好了斷點了,接下來就f9繼續執行吧。讓他進入斷點處。

IDA動态調試so 指南

以上就是ida以啟動模式去下斷點,适合在較早的時機去下斷點,友善進行脫殼和反調試。