IDA脚本编程 基础信息 地址 1 2 3 idc.get_screen_ea() idc.get_inf_attr(INF_MAX_EA) idc.get_inf_attr(INF_MIN_EA)
段 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 idc.get_segm_name(ea) idc.get_segm_start(ea) idc.get_segm_end(ea) idautils.Segments() idc.get_first_seg() idc.get_next_seg() idc.get_segm_attr(ea,attr) idc.get_segm_attr(ea,attr,value) ida_segment.get_segm_by_name('.text' ) for i in idautils.Segments(): print (f"%s:\t0x%x\t0x%x" %( idc.get_segm_name(i), idc.get_segm_start(i), idc.get_segm_end(i))) sg = ida_segment.get_segm_by_name('.text' ) print (sg.start_ea,sg.end_ea,sg.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 25 26 27 28 29 30 31 32 33 34 35 idc.get_func_name(ea) idc.get_next_func(ea) idc.get_prev_func(ea) idautils.Functions(start,end) idc.get_func_attr(func,FUNCATTR_FLAGS) for func in idautils.Functions(): print (hex (func), idc.get_func_name(func),sep=':' ) func = idaapi.get_func(ea) print (func.start_ea, func.end_ea)for func in idautils.Functions(): flags = idc.get_func_attr(func, FUNCATTR_FLAGS) if flags & FUNC_NORET: print (hex (func), get_func_name(func), "FUNC_NORET" ) if flags & FUNC_FAR: print (hex (func), get_func_name(func),"FUNC_FAR" ) if flags & FUNC_LIB: print (hex (func), get_func_name(func),"FUNC_LIB" ) if flags & FUNC_STATIC: print (hex (func), get_func_name(func),"FUNC_STATIC" ) if flags & FUNC_FRAME: print (hex (func), get_func_name(func),"FUNC_FRAME" ) if flags & FUNC_USERFAR: print (hex (func), get_func_name(func),"FUNC_USERFAR" ) if flags & FUNC_HIDDEN: print (hex (func), get_func_name(func),"FUNC_HIDDEN" ) if flags & FUNC_THUNK: print (hex (func), get_func_name(func),"FUNC_THUNK" ) if flags & FUNC_LIB: print (hex (func), get_func_name(func),"FUNC_BOTTOMBP" )
操作数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 idc.get_operand_type(curr_addr,n) insn = ida_ua.insn_t() idaapi.decode_insn(insn, curr_addr) if insn.Op1.type == idaapi.o_displ: print ("第一个操作数的类型是利用寄存器和位移的寻址操作!" ) """ o_void 没有任何操作数 retn o_reg 寄存器 o_mem 直接寻址内存 ds:dword_xxxxxx o_phrase 利用基址寄存器和变址寄存器的寻址操作 [edi_ecx] o_displ 利用寄存器和位移的寻址操作 [edi+18h] o_imm 确定的数值 0Ch o_far 直接访问远端地址 o_near 直接访问近端地址 """
搜索 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 idc.FindBinary(ea,flag,searchstr,radix=16 ) pattern = '55 48 89 E5' addr = ida_ida.inf_get_min_ea() for x in range (0 ,5 ): addr = idc.find_binary(addr, SEARCH_DOWN|SEARCH_NEXT, pattern) if addr != idc.BADADDR: print (hex (addr), idc.GetDisasm(addr)) """ flag参数的含义: SEARCH_UP 向上搜索 SEARCH_DOWN 向下搜索 SEARCH_NEXT 获取下一个已经找到的对象 SEARCH_CASE 是否区分大小写 SEARCH_REGEX 正则搜索 SEARCH_NOBRK SEARCH_NOSHOW 是否显示搜索进度 SEARCH_UNICODE 将所有搜索字符串视为unicode SEARCH_IDENT SEARCH_BRK """
寄存器操作 1 2 idc.get_reg_value('rax' ) idaapi.set_reg_value('rax' ,1234 )
xmm寄存器 1 2 3 4 def read_xmm_reg (name ): rv=idaapi.regval_t() idaapi.get_reg_val(name,rv) return (struct.unpack('Q' ,rv.bytes ())[0 ])
调试内存操作 1 2 3 4 5 6 7 8 idc.read_dbg_bytes(addr) idc.read_dbg_memory(addr,size) idc.read_dbg_dword(addr) idc.read_dbg_qword(addr) idc.patch_dbg_byte(addr,val) idc.run_to(addr) idc.wait_for_next_event(wfne,timeout)
本地内存操作 1 2 3 4 5 6 7 8 idc.get_qword(addr) idc.patch_qword(addr,val) idc.patch_dword(addr,val) idc.patch_word(addr,val) idc.patch_byte(addr,val) idc.patch_bytes(addr,val) idc.get_db_byte(addr) idc.get_bytes(addr,size)
反汇编操作 1 2 3 4 5 6 7 8 9 10 ea=here() GetDisasm(ea) idc.next_head(ea) idc.prev_head(ea) if idaapi.BADADDR!=ea: print ("valid success" ) idc.print_insn_mnem(ea) idc.print_operand(ea,n)
交叉引用分析 1 2 for ref in idautils.XrefsTo(ea): print (hex (ref.frm))
OLLVM批量断点设置 1 2 3 4 5 6 7 8 fn=0x401f60 ollvm_tail=0x405d4b f_blocks=idaapi.FlowChart(idaapi.get_func(fn),flags=idaapi.FC_PREDS) for block in f_blocks: for succ in block.succs(): if succ.start_ea==ollvm_tail: print (hex (block.start_ea)) idc.add_bpt(block.start_ea)
杂项 1 2 3 4 5 idc.add_bpt(0x409437 ) idaapi.get_imagebase() idc.create_insn(addr) ida_funcs.add_func(addr) ida_bytes.create_strlit(addr)
函数遍历 1 2 for func in idautils.Functions(): print ("0x%x,%s" %(func,idc.get_func_name(func)))
基本块 基本块遍历 1 2 3 4 fn=... f_blocks=idaapi.FlowChart(idaapi.get_func(fn),flags=idaapi.FC_PREDS) for block in f_blocks: print (hex (block.start_ea))
基本块前驱 1 2 for pred in block.preds(): print (hex (pred.start_ea))
基本块后继 1 2 for succ in block.succs(): print (hex (succ.start_ea))
指令遍历 1 2 for ins in idautils.FuncItems(0x401000 ): print (hex (ins))
条件断点 编写断点函数脚本,IDA底部导入该函数。
1 2 3 def bp (): rax=idc.get_reg_value('rax' ) return rax==16949
设置普通断点,在call rand
后设置。右键‘Edit Break…’中点击‘Condition’中‘…’。输入‘bp()’,并选择语言为Python。