以阿里移動安全挑戰賽2015年第二題為調試樣本
樣本是有點久遠,但是足夠一窺動態調試so的門道。
先上參考連接,有一些概念性的東西這兩篇寫的很詳細,比如下斷時機,為什么在那里下斷,反調思路是什么。
原創]-------------IDA調試 android so文件的10個技巧
https://bbs.pediy.com/thread-221876.htm
1.android逆向之旅-動態方式破解apk進階篇ida調試so源碼
0.準備工作
首先必須有一臺root過的手機,且把ida的android_server文件放到手機/data目錄下,修改其執行權限。
這里可能會遇到android_server和ida 目標api不符的提示,所以建議是用android 4.4的手機,且Android_server文件是從你使用的ida文件里拿出來的。
1.下斷
姑且認為你已經閱讀了上述兩篇文章,知道該demo是有反調試的,所以我們需要先靜態分析so,在so里下斷。
1-1在jni_onLoad下斷
1-2在native方法下斷
1-3設置ida的debug options
2.執行Android_server,供ida 附加一個調試進程
依次執行adb shell ,su,cd data,./android_server
打開ida調試監聽
執行
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 包名
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
然后進入到linker
3-7再按f9運行,會進入我們jni_onLoad斷點
4分析代碼
f8單步運行
4-1 nop反調試代碼
如果想去看方法,f7進入方法,想看源碼的,在BLX R7那里按f5,ida會反編譯源碼
根據地址找到so對應的值,在靜態調試so,G快捷鍵 。
修改為0.保存修改,重新打包一份apk,重簽名,從頭跑一遍。反調試代碼就被干掉了。
4-2 找native方法
反調試之后,輸入密碼,繼續f9運行,會斷在我們的native方法里
根據大家的經驗總結,去尋找CMP指令,查看寄存器的值,總會有一個地方值做判斷,然后返回結果。
那么做判斷的地方,就是正確密碼的出現地。
雙擊可查看寄存器的值
至此,動態調試so結束