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。