idapython 使用
- idapro 7.5
本篇笔记来总结一下近期写idapython时使用到的一些idapython的函数用法
-
通过变量名字找变量的二进制地址
addr = get_name_ea_simple("outputfile") 返回地址(int型)
-
寻找程序的起始地址和结束地址
min_ea = inf_get_min_ea() #起始地址 max_ea = inf_get_max_ea() #结束地址
-
寻找程序中指定段的起始地址和结束地址
seg = get_segm_by_name(".text") #寻找.text段 text_start = seg.start_ea #.text段的起始地址 text_end = seg.end_ea #.text段的结束地址
-
数据交叉引用
例如.got段中有名为outputfile的变量,通过数据交叉引用查看它在程序中的引用地址 outlist = DataRefsTo(opt_addr) 输入一个地址,返回一个可迭代对象,可以通过将outlist类型转换为list或者通过循环来查看里面的内容
-
寻找程序中某个字符串的引用地址
例如想找到含有“output”的地址 while cur_addr < end_addr: cur_addr = idc.find_text(cur_addr,SEARCH_DOWN,0,0,"optarg")#FindText # 注意第五个参数需要写成字符串的形式,使用字符串变量的话会报错 if cur_addr == BADADDR: continue else: print(cur_addr) cur_addr = idc.next_head(cur_addr)
-
获取二进制中的所有函数
funclist = Functions()
-
通过某个地址来找到该地址所在的函数
func = idaapi.get_func(addr1)
-
根据某个地址来找到该地址所在函数的函数名称
funcname = get_func_name(addr1)
-
编译函数中所有的基本块
fc = idaapi.FlowChart(func, flags=idaapi.FC_PREDS) for block in fc:#函数的所有块 j = block.start_ea #块的起始地址 while j < block.end_ea:#block.end_ea表示下一个块的起始地址 print(j) j = idc.next_head(j,block.end_ea)#寻找下一条指令
-
基本块指令的一些操作
通过上面的代码可以来遍历基本块中的每条指令 获得指令的汇编代码,输入是指令的地址 asm = idc.GetDisam(j) 获取指令操作符 operandstr = print_insn_mnem(j)
-
基本块的前驱和后继关系
获取一个基本块的所有前驱基本块 for pred in block.preds(): print(pred.start_ea) 获取一个基本块的所有后继基本块 for succ in block.succs(): print(succ.start_ea)
-
获取switch case中每个case的地址
在此之前,得到jmp eax(jump表)在程序中的地址 jmpaddr a = idaapi.get_switch_info(jmpaddr) loc = a.jumps element_num = a.get_jtable_size() element_size = a.get_jtable_element_size() for i in range(element_num): #跳转表数组中每一项的地址 table_entry = loc+i*element_size jmpto_entry = a.elbase + idc.get_wide_dword(table_entry) #得到case在程序中的位置
本文为笔者在近期工作学习中所使用到的一些idapython的函数,如有代码错误或者标注不清的地方,希望大家在评论区批评指正,谢谢!