IDA的动态调试脚本 IDA使用IDC脚本进行动态调试,主要用到的函数有StartDebugger、GetDebuggerEvent、RunTo、GetRegValue
StartDebugger(“”,””,””)的三个参数主要是被调试的可执行文件路径、命令行参数、进程的初始化目录,调试过程主要使用的是参数2设置命令行参数
需要注意的是在调用StartDebugger、Runto的时候
在调用此函数之后你必须调用GetDebuggerEvent()函数,以便知道发生了什么事件
之后可以采用GetRegValue、SetRegValue来获取以及设置相关的寄存器的值
IDC example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include <idc.idc> static main () { auto max_eax,max_ebx,second_ebx,third_eax; auto eax,ebx; max_eax = 0 ; StartDebugger("" ,"< input" ,"" ); auto code = GetDebuggerEvent(WFNE_SUSP,-1 ); auto i; for (i =0 ; i < 1 ;i++){ RunTo(0x0000000008048710 ); code = GetDebuggerEvent(WFNE_SUSP,-1 ); eax = GetRegValue("RAX" ); ebx = GetRegValue("RBX" ); Message("rax %x" ,eax); } }
IDA python example2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 import idaapiimport idcfor i in range(1 , 256 ): RunTo(0x080485b1 ) GetDebuggerEvent(WFNE_SUSP, -1 ) print i SetRegValue(i, "eax" ) RunTo(0x08048704 ) GetDebuggerEvent(WFNE_SUSP, -1 ) bool = GetRegValue("eax" ) RunTo(0x08048746 ) GetDebuggerEvent(WFNE_SUSP, -1 ) SetRegValue(0x080486D4 , 'eip' ) if bool == 0x95 : print i break RunTo(0x080485b1 ) GetDebuggerEvent(WFNE_SUSP, -1 ) print iSetRegValue(i, "eax" ) RunTo(0x08048704 ) GetDebuggerEvent(WFNE_SUSP, -1 ) stack = GetRegValue("esp" ) arr_addr = stack + 0x1c arr = [] for i in range(0xff ): arr.append(Byte(arr_addr + i)) s = '95eeaf95ef94234999582f722f492f72b19a7aaf72e6e776b57aee722fe77ab5ad9aaeb156729676ae7a236d99b1df4a' a = [] for i in range(0 ,len(s), 2 ): a.append(arr.index(int(s[i:i+2 ], 16 ))) print '' .join(map(chr, a))
参考 * https://www.codenong.com/cs105359705/
* IDA Pro 帮助手册
* https://introspelliam.github.io/2017/09/18/tools/IDA%E7%9A%84%E8%B0%83%E8%AF%95%E8%84%9A%E6%9C%ACidc/