編輯:關於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的保護是越來越好!大大增加了逆向分析人員的分析難度。同時,在整個攻防的過程中,對攻防兩端的人都帶來了非常棒體驗。雙方都取得了長足的進步!
也促使了整個加固方向水平的提升!
其中,動態調試手法在整個過程中是必不可少的。
轉載自 <a href="http://www.sanwho.com/671.html" >[轉]Android逆向之動態調試總結 | 神乎</a>
《Android源碼設計模式解析與實戰》讀書筆記(二十) 第二十章、適配器模式 適配器模式是結構型設計模式之一,它在我們的開發中使用率極高,比如ListView、Gr
一步一步學ROP之Android ARM 32位篇 0x00 本文僅解釋說明蒸米大神一步一步學ROP之Android ARM 32位篇,讀者應先閱讀這篇文章,遇到問題
Android應用程序內存洩漏介紹 Android應用程序內存洩漏介紹 內存洩漏和內存溢出的區別 內存溢出(out of memory)是指程序在申請內存時,沒有足夠的
Android 急速發布項目到 JitPack,androidjitpack 轉載請標明出處: http://www.cnblogs.com/zhaoyanjun/p/