IDAPython脚本(7.5以上) IDAPython是很强大的功能. 但是在7.5支持python3之后很多函数都改变了. 所以从头开始学一下.
IDAPython官方函数文档 : IDAPython官方文档函数查询
IDC函数官方文档查询 : IDC函数
IDA版本与版本之间的差异化函数查询 : IDA版本函数差异化
指令相关
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 from idaapi import *from ida_dbg import *from ida_bytes import *prev_1 = prev_head(0x00007FF6A1AA2577 , 1 ) prev_2 = prev_head(0x00007FF6A1AA257a , 0x00007FF6A1AA2578 ) print (hex (prev_1), hex (prev_2))>> 0x7ff6a1aa2573 0xffffffffffffffff next_1 = next_head(0x00007FF6A1AA257a , 1 ) next_2 = next_head(0x00007FF6A1AA257a , 0x00007FF6A1AA2580 ) >> 0xffffffffffffffff 0x7ff6a1aa257b a = generate_disasm_line(0x00007FF6A1AA2585 ) print (a)>> b'\x01\x05movzx\x02\x05 \x01)\x01!eax\x02!\x02)\x01\t,\x02\t \x01*\x01 byte ptr\x02 \x01\t[\x02\t\x01!r10\x02!\x01\t]\x02\t\x02*' a = print_insn_mnem(0x00007FF6A1AA2585 ) print (a)>> movzx a = print_operand(0x00007FF6A1AA2585 , 0 ) print (a)>> b'\x01)\x01!eax\x02!\x02)' print (hex (get_operand_value(0x00007FF6A1AA2577 , 1 )))print (type (get_operand_value(0x00007FF6A1AA2577 , 1 )))>> 0x10 >> <class 'int' > a = get_strlit_contents(0x00007FF6A1AC28A8 , 4 , 0 ) b = get_strlit_contents(0x00007FF6A1AC28A8 , 4 , 1 ) print (a)print (b)>> b'Erro' >> b'\xe7\x89\x85\xe6\xbd\xb2' a = set_cmt(0x00007FF6A1AA2577 , "this is a comment" , True ) print (a)>> True a = set_name(0x00007FF6A1AC28A8 , "err" ) print (a)>> True print (hex (get_screen_ea()))>> 0x7ff6a1ac28a8 print (FlowChart(get_func(0x00007FF6A1AA21B0 )).size)>> 149
功能+调试相关:
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 add_bpt(0x00007FF6A1AA2577 ) del_bpt(0x00007FF6A1AA2577 ) enable_bpt(0x00007FF6A1AA2577 , False ) load_and_run_plugin("idapython" , 3 ) def condition (): print (">>> rip:" , get_reg_val("rip" )) return True add_bpt(0x00007FF6011D2581 ) set_bpt_cond(0x00007FF6011D2581 , "condition()" ) a = XrefsTo(0x00007FF6011D2577 , flags=0 ) for addr in a: print (hex (addr.frm)) get_byte(addr) get_word(addr) get_dword(addr) get_qword(addr) get_wide_byte(addr) get_wide_word(addr) get_wide_dword(addr) get_wide_qword(addr) patch_byte(addr, val) patch_word(addr, val) patch_dword(addr, val) patch_qword(addr, val) get_reg_val("rip" ) set_reg_val("rax" , 0x10 ) start_process() continue_process() run_to(addr) wait_for_next_event(EVENT_TYPE, flags) step_over() wait_for_next_event(WFNE_SUSP, -1 ) wait_for_next_event(WFNE_SUSP, -1 ) wait_for_next_event(WFNE_ANY | WFNE_CONT, -1 )
常用的脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import idaapiimport idcdef dump_bytes_before_address (address, output_file='output.zip' ): start_addr = 0x538 with open (output_file, 'wb' ) as f: for addr in range (start_addr, address): byte = idaapi.get_byte(addr) f.write(byte.to_bytes(1 , byteorder='little' )) print (f"Dumped bytes before address {hex (address)} to {output_file} " ) address_to_dump = 0x1597C3 dump_bytes_before_address(address_to_dump)
1 2 3 4 5 6 7 import idcstart = 0x140093020 count = 16 for i in range (count): idc.create_data(start + i * 4 , idc.FF_DWORD, 4 , idc.BADADDR)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import ida_bytesstart = 0x140093020 count = 16 output = [] for i in range (count): ea = start + i * 4 val = ida_bytes.get_dword(ea) output.append(val) print (output)
IDAPython核心有如下3个python模块:
idc模块负责提供IDC中所有的函数功能。
idautils提供大量的实用函数,其中许多函数可生成各种数据库相关对象(如函数或交叉引用)的python列表。
idaapi 允许使用者通过类的形式,访问更多底层的数据 。
ida_bytes 专门负责读写二进制字节/数据 的模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import idcdef clear (start_ea,end_ea ): s_o_h=[0x74 ,0x05 ,0x75 ,0x03 ,0xe8 ,0x11 ,0x00 ] while start_ea<end_ea: if idc.get_bytes(start_ea,7 )==bytes (s_o_h): for i in range (7 ): idc.patch_byte(start_ea+i,0x90 ) start_ea+=1 start_ea=0x00411DC0 end_ea=0x00411E1E clear(start_ea,end_ea) print ("ok" )