IDA Python API整理

整理了最近用到的IDA Python的API,刚刚才发现在IDA Python在IDA7.4及以后做了改动,官网上有API的说明,所以我都使用的是新的API,它们在IDA 6.x-7.3以及7.4、7.5上都适用。

参数

在脚本中使用时,不会显式的报告错误信息,因此可以输出到log中,方便调试。

1
2
3
4
command = "{0} -L{1} -A -S{2} {3}".format(ida_path, log_path, script_path, bin_path)
print(command)
p = subprocess.Popen(command)
p.wait()

参数说明:

1
2
3
4
-L:日志路径
-A:让ida自动运行,不需要人工干预,在处理的过程中不会弹出交互窗口
-c:参数会删除所有与参数中指定的文件相关的数据库,并且生成一个新的数据库。
-S:参数用于指定ida在分析完数据之后执行的idc脚本,该选项和参数之间没有空格,并且默认搜索目录为ida目录下的idc文件夹。

指令

1
2
3
4
5
6
7
8
9
10
#对ea所在地址进行反汇编,得到汇编指令,flags:combination of the GENDSM_ flags, or 0
idc.generate_disasm_line(ea, flags)
#获取上一条指令地址
idc.prev_head(ea)
#获取下一条指令地址
idc.next_head(ea)
#对ea所在地址的机器码进行反汇编,返回指令长度
idc.create_insn(ea)
#获取操作数,n指定第几个操作码,从0开始
idc.print_operand(ea, n)

基本块

1
2
f_blocks = idaapi.FlowChart(idaapi.get_func(ea), flags=idaapi.FC_PREDS)  #获取start_ea所在函数的所有基本块,可以通过遍历f_blocks中的基本块得到每个基本快的信息
idaapi.FlowChart(idaapi.get_func(ea), flags=idaapi.FC_PREDS).size #获取函数基本快数量

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#获取函数起始地址
start_ea = idc.get_func_attr(ea, FUNCATTR_START)
#获取函数尾地址/下一个函数的起始地址
end_ea = idc.get_func_attr(ea, FUNCATTR_END)
end_ea = idc.find_func_end(ea)
#获取上一个函数起始地址
idc.get_prev_fchunk(ea)
idc.get_prev_func(ea)
#获取下一个函数起始地址
idc.get_next_fchunk(ea)
idc.get_next_func(ea)
#获取函数名
idc.get_func_name(ea)
#遍历段及其函数:
for segea in Segments():
for funcea in idautils.Functions(segea, SegEnd(segea)):
#add other operation
#添加函数
idaapi.add_func(ea)
#删除函数
ida_funcs.del_func(ea)
#set function comment
#repeatable - 1: get repeatable comment, 0: get regular comment
idaapi.set_func_cmt(ea, comment, repeatable)

1
2
3
4
#获取一个段的起始地址
idc.get_segm_start(ea)
#获取一个段的结束地址
idc.get_segm_end(ea)

其他

  1. 获取ea所在地址的1、2、4、8字节机器码:

    1
    2
    3
    4
    idc.get_wide_byte(ea) 
    idc.get_wide_word(ea)
    idc.get_wide_dword(ea)
    idc.get_qword(ea)
  2. 获取processor name:

    1
    ida_ida.inf_get_procname()
  3. 设置processor type:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    '''
    @param level: the power of request:
    - SETPROC_COMPAT - search for the processor type in the current module
    - SETPROC_ALL - search for the processor type in all modules
    only if there were not calls with SETPROC_USER
    - SETPROC_USER - search for the processor type in all modules
    and prohibit level SETPROC_USER
    - SETPROC_FATAL - can be combined with previous bits.
    means that if the processor type can't be
    set, IDA should display an error message and exit.
    '''
    idaapi.set_processor_type(processor, level)
  4. 获取指定数量的bytes

    1
    idc.get_bytes(ea,size)

参考

https://www.hex-rays.com/products/ida/support/ida74_idapython_no_bc695_porting_guide.shtml
https://www.hex-rays.com/products/ida/support/idapython_docs/idc-module.html
https://d1nn3r.github.io/2019/06/10/IDAPython/