本篇介紹
使用 IDA 可以單步調(diào)試 so玖详,即使沒有源代碼也沒關(guān)系,這樣就可以逆向目標(biāo)應(yīng)用的so,分析內(nèi)部邏輯揽咕,本篇就介紹下如何操作。
ida debug so
首先得準(zhǔn)備一個(gè)android app套菜,帶jni的亲善。我這邊用了一個(gè)加法的例子,jni 代碼如下:
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_idadebugdemo_MainActivity_addResultFromJNI(JNIEnv *env, jobject thiz, jint first,
jint second) {
// TODO: implement addResultFromJNI()
return first + second;
}
寫完后的界面如下:
接下來就開始調(diào)試了:
運(yùn)行 android server逗柴,從IDA_Pro_7.7\dbgsrv下拷貝對(duì)應(yīng)的二進(jìn)制到手機(jī)/data/local/tmp目錄下蛹头,目前大部分Android手機(jī)都是64位的,選擇android_server64就可以了嚎于,然后給一個(gè)執(zhí)行權(quán)限
flame:/data/local/tmp # ./android_server64
IDA Android 64-bit remote debug server(ST) v7.7.27. Hex-Rays (c) 2004-2022
Listening on 0.0.0.0:23946...
接下來在pc端配置下端口轉(zhuǎn)發(fā)掘而,這樣pc端才可以和手機(jī)正常通信
adb forward tcp:22222 tcp:23946
占用的電腦端口就是22222,在配置ida的時(shí)候也用這個(gè)端口就好了于购。
接下來以調(diào)試模式啟動(dòng)目標(biāo)應(yīng)用:
adb shell am start -D -n com.example.idadebugdemo/com.example.idadebugdemo.MainActivity
這時(shí)候手機(jī)就會(huì)出現(xiàn)一個(gè)彈窗:
接下來就是配置ida了袍睡,用ida 把so 加載進(jìn)去后,配置下debugger:
接下來繼續(xù)設(shè)置bugger肋僧,將Events中的3個(gè)suspend選上斑胜,這樣即使目標(biāo)應(yīng)用有反逆向手段也可以在調(diào)試中繞過去控淡。
接下來再配置下端口:
然后attach 目標(biāo)應(yīng)用:
接下來指令就會(huì)停止到一條svc 指令上:
接下來設(shè)置下jdwp調(diào)試端口:
E:\02documents\01projects\01cpp\zego>adb shell
flame:/ # ps -ef |grep ida
radio 1133 1 0 15:45:29 ? 00:00:00 imsqmidaemon
u0_a141 2197 903 0 15:45:34 ? 00:00:00 .qtidataservices
u0_a144 2341 903 0 15:45:34 ? 00:00:00 .qtidataservices
u0_a142 2587 903 0 15:45:34 ? 00:00:00 .qtidataservices
u0_a3 27700 903 0 14:37:39 ? 00:00:00 com.example.idadebugdemo
root 27842 27838 0 14:50:02 pts/1 00:00:00 grep ida
adb forward tcp:8700 jdwp:27700
繼續(xù)建立jdb鏈接:
jdb -connect "com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700"
接著就可以點(diǎn)F9運(yùn)行了。當(dāng)應(yīng)用開始加載到目標(biāo)so后止潘,就會(huì)出現(xiàn)一個(gè)彈窗
這時(shí)候就根據(jù)實(shí)際情況選擇就好掺炭,最好是搞成一樣的so,這樣調(diào)試起來會(huì)方便一些凭戴。
接下來就可以找目標(biāo)地址打斷點(diǎn)了涧狮,當(dāng)然也可以提前打斷點(diǎn):
接下來就可以觸發(fā)app邏輯了:
這時(shí)候就命中斷點(diǎn)了:
接下來就可以單獨(dú)調(diào)試了,甚至通過修改寄存器值修改代碼邏輯么夫,接下來就試試:
我們輸入的是 1 +1,寄存器w8者冤,w9的值已經(jīng)加載成對(duì)應(yīng)的值了,接下來我們都修改成2:
繼續(xù)運(yùn)行看看:
這樣就完成單步調(diào)試和修改邏輯了档痪。