IDA 動態調試Android SO .init .init_array JNI_Onload總結

在安卓脫殼過程中,經常需要用ida動態調試so,並且在解密代碼執行前下斷點,下面介紹用IDA在Android so文件的.init.init_array上和JNI_OnLoad處下斷點方法。我們以自己編寫的一個小程序initTest.apk爲例,該apk實現了在.init.init_array上和JNI_OnLoad 中的方法中打印日誌功能.
下載地址:http://download.csdn.net/detail/u012417380/9919842

一、上傳android_server,啓動android_server

上傳android_server到手機/data/local/tmp目錄

adb push  android_server   /data/local/tmp

賦予 android_server執行權限

$ chmod 777  android_server

以root身份執行android_server文件,android_server文件默認監聽23946端口,可以通過-p端口參數進行設置端口,注意p和端口之間無空格

 $ ./android_server -p23946

二、打開DDMS程序

打開DDMS程序,DDMS程序會將應用的調試端口映射到電腦上,使用jdb命令能夠對被掛起的程序恢復執行。

三、進行端口轉發

使用adb命令進行端口轉發

$  adb forward tcp:23946PC_porttcp:23946(Phone_port)

四、以調試模式啓動app

我們以debug模式啓動程序。程序會出現waiting for debugger的調試界面

$ adb shell am start -D  -n   com.example.inittest/.MainActivity
Starting: Intent { cmp=com.example.inittest/.MainActivity }

程序會出現waiting for debugger的調試界面

這裏寫圖片描述

這時DDMS顯示,調試端口在8700

這裏寫圖片描述

五、用IDA 附加到啓動ida並attach這個app的進程。

這裏寫圖片描述
這裏寫圖片描述

六、當so加載的時候掛起

我們在debugger setup裏勾選 suspend on library load。然後點擊繼續(按F9鍵繼續)。這裏寫圖片描述

七、使用jdb命令恢復程序執行

使用jdb命令恢復程序執行

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

設置未捕獲的java.lang.Throwable
設置延遲的未捕獲的java.lang.Throwable
正在初始化jdb...
>

這時DDMS中該應用的顏色變爲了綠色:

這裏寫圖片描述

程序加載so,由於之前的設置,程序停在了liner

這裏寫圖片描述

八 確定模塊的加載地址,在linkerlibvm.so中下斷點

android4.4.4_r1源碼中,linker.init.init_array的斷點位置爲0000274C,JNI_OnLoad的斷點位置爲00050004
我們先查看內存中segmentlinker加載的位置
Ctrl+S組合鍵打開內存中的segmets,知道linker的內存加載地址4008B000,那麼斷點的位置是4008B000+0000274C=4008D74C

這裏寫圖片描述

G鍵輸入地址4008D74C進行跳轉,將光標移至該處後按P鍵進行反彙編,看到了彙編代碼,在該處4008D74C下斷點

這裏寫圖片描述

同理按Ctrl+S組合鍵打開內存中的segmets,知道libdvm.so的內存加載地址41503000,那麼斷點的位置是41503000+00050004=41553004
這裏寫圖片描述

G鍵輸入地址41553004進行跳轉,將光標移至該處後按P鍵進行反彙編,看到了彙編代碼,在該處41553004下斷點

這裏寫圖片描述

九、繼續執行

F9 鍵繼續執行,發現在第一處斷點停了下來

這裏寫圖片描述

F7鍵步入函數執行,發現其首先進入了_init函數中,調用了自定義的打印日誌函數輸入函數名

這裏寫圖片描述

接着按F8 跨過執行,直到函數返回

這裏寫圖片描述
接着按F9 鍵繼續執行到下一斷點,發現第二次在該斷電處停了下來

這裏寫圖片描述

F7鍵步入函數執行,發現其先進入了.init_array段的myConstructor1函數中,調用了自定義的打印日誌函數輸入函數名
這裏寫圖片描述
接着按F8 跨過執行,直到函數返回
這裏寫圖片描述
接着按F9 鍵繼續執行到下一斷點,發現第三次在該斷電處停了下來

這裏寫圖片描述
F7鍵步入函數執行,發現其先進入了.init_array段的myConstructor2函數中,調用了自定義的打印日誌函數輸入函數名
這裏寫圖片描述
接着按F8 跨過執行,直到函數返回
這裏寫圖片描述

接着按F9 鍵繼續執行到下一斷點,發現在libdvm處斷點停了下來
這裏寫圖片描述
F7鍵步入函數執行,發現其先進入了JNI_OnLoad函數中,調用了自定義的打印日誌函數輸入函數名
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章