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;
//AddBpt(0x0000000008048A8C);
//AddBpt(0x8048710);
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 idaapi
import idc

for 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 i
SetRegValue(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/