以阿里移動安全挑戰(zhàn)賽2015年第二題為調(diào)試樣本
樣本是有點久遠针史,但是足夠一窺動態(tài)調(diào)試so的門道贡定。
先上參考連接赋访,有一些概念性的東西這兩篇寫的很詳細,比如下斷時機缓待,為什么在那里下斷蚓耽,反調(diào)思路是什么。
原創(chuàng)]-------------IDA調(diào)試 android so文件的10個技巧
https://bbs.pediy.com/thread-221876.htm
1.android逆向之旅-動態(tài)方式破解apk進階篇ida調(diào)試so源碼
0.準備工作
首先必須有一臺root過的手機旋炒,且把ida的android_server文件放到手機/data目錄下步悠,修改其執(zhí)行權(quán)限。
這里可能會遇到android_server和ida 目標api不符的提示瘫镇,所以建議是用android 4.4的手機鼎兽,且Android_server文件是從你使用的ida文件里拿出來的。
1.下斷
姑且認為你已經(jīng)閱讀了上述兩篇文章铣除,知道該demo是有反調(diào)試的接奈,所以我們需要先靜態(tài)分析so,在so里下斷通孽。
1-1在jni_onLoad下斷
1-2在native方法下斷
1-3設(shè)置ida的debug options
2.執(zhí)行Android_server,供ida 附加一個調(diào)試進程
依次執(zhí)行adb shell ,su背苦,cd data互捌,./android_server
打開ida調(diào)試監(jiān)聽
執(zhí)行
adb forward tcp:23946 tcp:23946
端口轉(zhuǎn)發(fā)
3.打開ida 進行動態(tài)調(diào)試
3-1執(zhí)行adb shell am start -D -n com.yaotong.crackme/.MainActivity
喚起樣本,使其等待一個調(diào)試器
3-2 ida-debugger-attach to process行剂,找到我們的demo 包名
3-3 執(zhí)行adb forward tcp:8700 jdwp:17233
端口打通(ddms去做也行秕噪,目的都是一樣的)
3-4 點ok之后就進入動態(tài)調(diào)試
此時會卡在libc.so
3-5 執(zhí)行jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
恢復(fù)運行狀態(tài)
其余報錯,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反調(diào)試代碼
如果想去看方法,f7進入方法撵幽,想看源碼的灯荧,在BLX R7那里按f5,ida會反編譯源碼
根據(jù)地址找到so對應(yīng)的值盐杂,在靜態(tài)調(diào)試so逗载,G快捷鍵 哆窿。
修改為0.保存修改,重新打包一份apk厉斟,重簽名挚躯,從頭跑一遍。反調(diào)試代碼就被干掉了擦秽。
4-2 找native方法
反調(diào)試之后秧均,輸入密碼,繼續(xù)f9運行号涯,會斷在我們的native方法里
根據(jù)大家的經(jīng)驗總結(jié)目胡,去尋找CMP指令,查看寄存器的值链快,總會有一個地方值做判斷誉己,然后返回結(jié)果。
那么做判斷的地方域蜗,就是正確密碼的出現(xiàn)地巨双。
雙擊可查看寄存器的值
至此,動態(tài)調(diào)試so結(jié)束