8.動態調試筆記--調試so

以阿里移動安全挑戰賽2015年第二題為調試樣本
樣本是有點久遠,但是足夠一窺動態調試so的門道。

先上參考連接,有一些概念性的東西這兩篇寫的很詳細,比如下斷時機,為什么在那里下斷,反調思路是什么。
原創]-------------IDA調試 android so文件的10個技巧
https://bbs.pediy.com/thread-221876.htm

1.android逆向之旅-動態方式破解apk進階篇ida調試so源碼

2.阿里移動安全挑戰賽第二題writeup

0.準備工作
首先必須有一臺root過的手機,且把ida的android_server文件放到手機/data目錄下,修改其執行權限。
這里可能會遇到android_server和ida 目標api不符的提示,所以建議是用android 4.4的手機,且Android_server文件是從你使用的ida文件里拿出來的。

1.下斷
姑且認為你已經閱讀了上述兩篇文章,知道該demo是有反調試的,所以我們需要先靜態分析so,在so里下斷。
1-1在jni_onLoad下斷


ida的左邊方法區ctrl+f搜索jni_load

1-2在native方法下斷


很好找,java_開頭

1-3設置ida的debug options
勾選on library load

2.執行Android_server,供ida 附加一個調試進程
依次執行adb shell ,su,cd data,./android_server
打開ida調試監聽

image.png

執行
adb forward tcp:23946 tcp:23946
端口轉發

3.打開ida 進行動態調試
3-1執行adb shell am start -D -n com.yaotong.crackme/.MainActivity
喚起樣本,使其等待一個調試器
3-2 ida-debugger-attach to process,找到我們的demo 包名

17233就是pid

3-3 執行adb forward tcp:8700 jdwp:17233
端口打通(ddms去做也行,目的都是一樣的)

3-4 點ok之后就進入動態調試

此時會卡在libc.so

3-5 執行jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700恢復運行狀態

正常會顯示已經捕獲

其余報錯,software refused connected,先更改app的清單debuggable值為true,重打包簽名再重來一遍步驟。
connection refused ,就操作一遍3-3.

3-6 在ida按f9


點same

然后進入到linker

3-7再按f9運行,會進入我們jni_onLoad斷點

4分析代碼
f8單步運行

4-1 nop反調試代碼


我這里是已經修改過的so

如果想去看方法,f7進入方法,想看源碼的,在BLX R7那里按f5,ida會反編譯源碼

根據地址找到so對應的值,在靜態調試so,G快捷鍵 。
修改為0.保存修改,重新打包一份apk,重簽名,從頭跑一遍。反調試代碼就被干掉了。

4-2 找native方法
反調試之后,輸入密碼,繼續f9運行,會斷在我們的native方法里


image.png

根據大家的經驗總結,去尋找CMP指令,查看寄存器的值,總會有一個地方值做判斷,然后返回結果。
那么做判斷的地方,就是正確密碼的出現地。
雙擊可查看寄存器的值


查看到我的輸入值

至此,動態調試so結束

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容