前言
之前用的是 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