1. 程式人生 > >Android逆向之動態除錯總結

Android逆向之動態除錯總結

一、在SO中關鍵函式上下斷點


剛學逆向除錯時。大多都滿足於在SO中某關鍵函式上下斷點。然後通過操作應用程式,去觸發這個斷點,然後進行除錯
詳細的步驟可以參見非蟲大大的《Android軟體安全與逆向分析》
簡單說:在libsyclover.so檔案中有一個函式jnicall1。每次單擊按鈕的時候,便會呼叫此函式。
1.靜態載入此so檔案,找到函式的偏移地址為:0x132C

 
2.執行android_server3.埠轉發
adb forward tcp:23946 tcp:23946

4.執行程式

5.IDA附加

 
然後會彈出
 
點選OK之後,在彈出的列表框中選擇需要附加的程序即可

6.下斷點

附加完成之後,會停在libc.so這個模組中。此時按下Ctrl + S,彈出模組列表框,搜尋so檔名。

 
記錄下基地址:0×76072000 (RX許可權)
和靜態分析時得到的偏移地址0x132C相加得到0x7607332C
G跳轉到此位置

 
F2下好斷點!

7.觸發斷點

下好斷點,便F9執行,此時狀態是runing
此時,去應用中單擊按鈕,程式便會斷在剛剛下好的斷點處~

 
ok~ 這種除錯方法侷限性很大,適合於比較初級的除錯。這種除錯手法在現在已經滿足不了需求了。

二、在JNI_OnLoad函式上下斷點

JNI_OnLoad函式大概功能就是在程式載入so的時候,會執行JNI_OnLoad函式,做一系列的準備工作。
很多時候,程式猿們會將一些重要資訊放在此函式中,而不是通過某種事件來重複觸發。包括說將反除錯函式放置在此函式中。因此,除錯手段發生了改變,上述除錯方法基本上被淘汰。

1.靜態分析,找到JNI_OnLoad函式的偏移:0×1504

 

2.執行android_server3.埠轉發
adb forward tcp:23946 tcp:23946

4.以除錯模式啟動程式

adb shell am start -D -n com.example.mytestcm/.MainActivity
此時,手機介面會出現Waiting For Debugger頁面


5.開啟ddms或者Eclipse (必要,為了使用jdb命令)

6.IDA附加
7.設定除錯選項

Debugger — Debugger Options
 

8.F9執行程式

IDA中,F9執行程式,此時是runing狀態。
在命令列中執行:jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
其中port=8700是從ddms中看到的。

 
此時程式會斷下來
 

9.下斷點

Ctrl + S 然後搜尋到so檔名
 
記錄下基地址是:0×76118000
加上JNI_OnLoad函式的偏移地址0×1504為0×76119504
G跳轉到0×76119504,下斷點

 

A.觸發斷點

下好斷點之後,直接F9執行吧,就能斷在JNI_OnLoad函式處~
 
當這種除錯手法出現之後,將特殊函式,或者反除錯函式放在JNI_OnLoad中也不是那麼的安全了。此時,程式猿們通過分析系統對SO檔案的載入連結過程發現,JNI_OnLoad函式並不是最開始執行的。在JNI_OnLoad函式執行之前,還會執行init段和init_array中的一系列函式。
因此,現在的除錯方法,都是將斷點下在init_array中~
至於下斷點的方法,可以類比於在JNI_OnLoad中下斷點的方法,在init_array的函式中下斷點。還有一種方法便是通過在linker模組中,通過對其中函式下斷點,然後也能單步到init_array中
下面便詳細介紹下如何給任意系統函式下斷點

三、給任意系統函式下斷點

1.需要準備的有:
與你除錯環境一致的系統原始碼,這個也可以在http://androidxref.com/網站上線上查閱。
root之後的手機,方便將系統的一些so檔案dump至本地,靜態獲取到系統函式的偏移地址


2.流程
執行android_server
埠轉發 adb forward tcp:23946 tcp:23946
除錯模式啟動程式 adb shell am start -D -n 包名/類名
IDA附加
靜態找到目標函式對應所在模組的偏移地址
Ctrl+S找到對應模組的基地址,兩個地址相加得到最終地址
G跳轉至地址,然後下斷
F9執行
執行jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
斷下,進行除錯


四、在dvmDexFileOpenPartial函式下斷點,dump出明文dex

發展至今,從去年到現在,apk的加解密發展非常迅速。國內出現了很多針對apk的加殼保護方案。主要也體現在對dex的保護和對so的保護!
針對dex的保護,很長一段時間,都能通過對dvmDexFileOpenPartial函式下斷點,從而dump出明文dex檔案。

以這次alictf的第三題為例子,展示下如何對dvmDexFileOpenPartial函式下斷點!
其他步驟都是一樣的,這兒主要說下如何找到dvmDexFileOpenPartial函式位置
1.檢視原始碼

dvmDexFileOpenPartial函式在rewriteDex這個函式中被呼叫。
 
可以看到關鍵字串資訊是:Unable to create DexFile
此時,從手機的/system/lib目錄下得到libdvm.so


2. 載入IDA,搜尋字串:Unable to create DexFile


 
得到偏移地址是:0x0005AE8A

3.下斷點

搜尋模組libdvm.so
 
基地址是0×41492000
加上偏移地址為0x414ECE8A
G跳轉至此位置,下好斷點,即可


4.dump明文dex檔案

下好斷點之後,F9執行,執行jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
程式斷下

 
此時,看到暫存器視窗中的值為:
 
R0儲存dex的起始地址,R1便是dex的長度
 
直接dump即可!

5.後續

dump出來的dex就可以進行反編。
效果如下:

 

五、寫在最後

隨著現在技術的發展,對apk的保護是越來越好!大大增加了逆向分析人員的分析難度。同時,在整個攻防的過程中,對攻防兩端的人都帶來了非常棒體驗。雙方都取得了長足的進步!
也促使了整個加固方向水平的提升!
其中,動態除錯手法在整個過程中是必不可少的。