摘要

比着大佬写的文章系统的学习下IDAPython,做下笔记,供自己以后查询

大佬的文章,👇

https://www.cnblogs.com/iBinary/p/14642662.html
https://www.cnblogs.com/iBinary/p/14672540.html
https://www.cnblogs.com/iBinary/p/14801928.html

IDAPython参考学习文档

IDA中获取界面中地址函数

作用 老版函数 新版函数
获取当前指令地址(光标点击的那个,灰色阴影那行) idc.ScreenEA() idc.get_screen_ea()
整个IDA中的最小地址 idc.MinEA() idc.StartEA() idc.BeginEA() ida_ida.inf_get_min_ea()
整个IDA中的最大地址(其实是最大地址 + 1) idc.MaxEA() ida_ida.inf_get_max_ea()
光标选择块的开始地址 idc.SelStart() idc.read_selection_start()
光标选择块的结束地址(结束地址 + 1) idc.SelEnd() idc.read_selection_end()

image-20211208195126744

数值获取及打补丁操作

获取数据

在IDA中想要获取某个地址处的数据可以采用以下函数

作用 老版函数 新版函数
获取BYTES类型 ida_bytes.get_many_bytes(addr, len) ida_bytes.get_bytes(addr, len)
获取BYTE类型 idc.Byte(addr) idc.get_wide_byte(addr)
获取WORD类型 idc.Word(addr) idc.get_wide_word(addr)
获取DWORD类型 idc.Dword(addr) idc.get_wide_dword(addr)
获取QWORD类型 idc.Qword(addr) idc.get_qword(addr)

Patch打补丁

作用 老版函数 新版函数
打补丁BYTE idc.PatchByte(addr,value) ida_bytes.patch_byte(addr,value)
打补丁WORD idc.PatchWord(addr,value) ida_bytes.patch_word(addr,value)
打补丁DWORD idc.PatchDword(addr,value) ida_bytes.patch_dword(addr,value)
打补丁QWORD idc.PatchQword(addr,value) ida_bytes.patch_qword(addr,value)

汇编相关指令操作

作用 老版函数 新版函数
获取地址处的汇编语句 idc.GetDisasm(addr)
更高级的获取.带有标志. 一般是给一个0 idc.GetDisasmEx(addr,flags) idc.generate_disasm_line(addr,flags)
获取指定位置的操作数mov ebp, esp. ebp索引是0,esp索引是1 idc.GetOpnd(addr,index) idc.print_operand(addr,index)
获取地址处汇编指令的操作指令 mov ebp,esp 获取mov idc.GetMnem(addr) idc.print_insn_mnem(addr)
获取基地址 idaapi.get_imagebase()
获取操作数的类型 idc.GetOpType(ea,index) idc.get_operand_type(addr,index)
call printf; 调用此函数,index填0的话,返回的就是printf的地址。 and esp, 0FFFFFFF8h;index填1的话,返回的就是0xfffffff8 idc.GetOperandValue(addr,index) get_operand_value(addr,index)
获取下一行汇编的地址 idc.NextHead idc.next_head(ea)
获取上一行汇编的地址 idc.PrevHead idc.PrevHead(ea)

image-20211208203329972

段相关操作

作用 老版函数 新版函数
获取段的名字 idc.SegName(addr) idc.get_segm_name(addr)
获取段的开始地址 idc.SegStart(addr) idc.get_segm_start(addr)
获取段的结束地址 idc.SegEnd(addr) idc.get_segm_end(addr)
返回一个列表记录所有段的地址 idautils.Segments()
获取第一个段 idc.FirstSeg() idc.get_first_seg()
获取下一个段 参数是当前段的任意地址 返回的是下一个段的地址 idc.NextSeg(addr) idc.get_next_seg(addr)

image-20211208204731476

函数相关操作

作用 老版函数 新版函数
获取指定地址之间的所有函数 Functions(startaddr,endaddr)
获取指定地址的函数名 idc.GetFunctionName(addr) idc.get_func_name(addr)
获取函数的注释 idc.GetFunctionCmt get_func_cmt(ea, repeatable) 1是地址 2是0或1 1是获取重复注释 0是获取常规注释
设置函数注释 idc.SetFunctionCmt set_func_cmt(ea, cmt, repeatable)
弹框让用户选择函数,返回的是函数的地址 idc.ChooseFunction(title) idc.choose_func(title)
返回: addr 距离函数的偏移形式 idc.GetFuncOffset(addr) idc.get_func_off_str(addr)
寻找函数结尾,如果函数存在则返回结尾地址,否则返回-1 idc.FindFuncEnd(addr) idc.find_func_end(addr)
设置函数结尾 ida_funcs.func_setstart(addr,newstartaddr) ida_funcs.set_func_start(addr, newstart)
设置函数开头 ida_funcs.func_setstart(addr,newstartaddr) ida_funcs.set_func_start(addr, newstart)
设置地址处的名字 idc.MakeName(addr, name) 与之同名了还有Ex函数 idc.set_name(ea, name, SN_CHECK) Ex函数也使用set_name
获取前一个函数的地址 idc.PrevFunction idc.get_prev_func(ea)
获取下一个函数的地址 idc.NextFunction idc.get_next_func

image-20211208211856738

image-20211208212151547

搜索功能

搜索

作用 老版函数 新版函数
查找二进制找到返回地址没找到返回-1(BADADDR) idc.FindBinary idc.find_binary(ea, flag, searchstr, radix=16, from_bc695=False)
返回data的地址,而不是code(注意不是指具体的数据,而是指的data类型) idc.FindData idc.find_data 或者ida_search.find_data
返回code的地址,而不是data idc.FindCode idc.find_code 可以使用 ida_search.find_code 也可以使用
跳转到ea位置 idc.Jump ida_kernwin.jumpto(ea)

校验

数据校验函数is_xxxx传入的都是flag,因为需要先获取某个地址处的flag,然后再将获取的flag传入is_xxxx

作用 老版函数 新版函数
获取标志 idc.GetFlags(ea) ida_bytes.get_full_flags(ea)
判断是否是代码,传入标志,根据标志返回True or False idc.isCode(f) ida_bytes.is_code(f)
同上 只不过是判断是否是数据 idc.isData(f) ida_bytes.is_data(f)

image-20211208215616799