IDA支持两种脚本语言,分别为IDC和IDApython。

IDC和C语言感觉差别较大,比如i++必须写成i = i + 1,感觉十分麻烦,同时还保留了花括号,有点离谱,解释语言还有一堆格式,又改了一些东西,太难用了。于是我尝试学习IDApython。
IDApyhon的好处在于它的语法和python一模一样,而通过import idc.idc就可以使用所有IDC可以使用的IDA的接口,其具体的接口定义在IDA主目录\python\3目录中,将其添加到工程目录,然后就可以引用其中的内容了(只看了8.3版本的)

其中的所有代码均需要在ida命令行或者脚本界面执行

参考:

IDA/IDAPython手册中文版.pdf at master · yanxxd/IDA (github.com)

对地址的读写接口

1
2
3
4
5
6
7
8
9
10
get_wide_byte(addr)
get_wide_word(addr)
get_wide_dword(addr)
get_qword(addr)
# 上面的分别读取目标地址的1,2,3,4字节,返回对应的值
patch_byte(ea,x)
patch_word(ea, x)
patch_dword(ea, x)
patch_qword(ea, x)
# 上面的分别修改对应ea的地址为x的值

ea是IDA中的地址

其它的不同粒度的操作参考上面的pdf

调试时获取寄存器的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import idc
import idautils

class MyDbgHook(idaapi.DBG_Hooks):
def dbg_bpt(self, tid, ea):
if ea == 0x4015c1:
rdx = idc.get_reg_value("rdx")
print("0x%x" % rdx)
# Continue the execution
return 0

# Instantiate and hook the debugger
debughook = MyDbgHook()
debughook.hook()

# Add a breakpoint at 0x4015c1
idaapi.add_bpt(0x4015c1)

重写dbg_bpt方法,使得执行到对应地址的时候打印出所有值