IDApython

前言

之前用的是 IDA7.0 ,每次要写idapython的时候就看这个网站备忘倒也还算方便,但是自从换了7.5,好多idapython的写法都变了,每次不记得就得查官方的API变动
很是麻烦,还是记一下IDA7.5下的一些常用的函数

常用的函数接口

PS: idc 前缀的函数可省略不写 idc

地址获取

1
2
3
4
5
6
7
def hex(n)  #一般用来把得来的地址转换成16进制好看

def ida_ida.inf_get_min_ea() #获取反汇编窗口中代码段的最小地址

def ida_ida.inf_get_max_ea() #获取反汇编窗口中代码段的最大地址

def idc.get_segm_end(addr) #获取程序中某段的结束地址

数值获取

1
2
3
4
5
6
7
8
9
def idc.get_wide_byte(addr) #以字节为单位获取地址处的值(以下类似)

def idc.get_wide_word(addr)

def idc.get_wide_dword(addr)

def idc.get_qword(addr)

def ida_bytes.is_loaded(addr) #判断地址处的数值是否有效

操作码获取

1
2
3
4
5
6
7
8
9
10
def GetDisasm(addr) #输出某地址处的反汇编字符串(包括注释)

def idc.print_operand(addr,n) #获取某地址处的操作数(第一个参数是地址,第二个是操作数索引)

def idc.print_insn_mnem(addr) #输出某地址处的指令

def idc.get_operand_type(addr,n) #输出指定操作数的类型
#操作数是寄存器返回1;无返回0;其他类型返回其对应的数值

def ida_bytes.get_full_flags(addr) #取某地址的一些列标志位,可用来判断属于code还是data

数据判断

1
2
3
4
5
6
7
8
9
def ida_bytes.is_code(f) #判断是否为代码

def ida_bytes.is_data(f) #判断是否为数据

def ida_bytes.is_head(f) #判断标记地址是否为指令头部

def ida_bytes.is_tail(f) #判断标记地址是否为指令尾部

def ida_bytes.is_unknown(f) #判断标记地址是否为未知

搜索操作

搜索失败时返回-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def idc.get_operand_value(addr,n) #输出跟指定操作数相关的数据值

def ida_search.find_code(addr,flag)) #从当前地址查找第一个指令并返回指令地址

def ida_search.find_data(addr,flag) #从当前地址查找第一个数据项并返回数据地址

'''
flag取值有:
SEARCH_DOWN 向下搜索

SEARCH_UP 向上搜索

SEARCH_NEXT 获取下一个找到的对象。

SEARCH_CASE 指定大小写敏感度

SEARCH_UNICODE 搜索 Unicode 字符串。
'''

修改操作

1
2
3
4
5
def ida_bytes.patch_byte(addr) #以字节为单位修改

def ida_bytes.patch_word(addr)

def ida_bytes.patch_dword(addr)

Comments