IDAPython是运行于交互式反汇编器IDA的插件,用于实现IDA的Python编程接口。IDA在逆向工程领域具有广泛的应用,尤其是二进制文件静态分析,其强大的反汇编功能一直处于业内领先水平。IDAPython插件使得Python脚本程序能够在IDA中运行并实现自定义的软件分析功能,通过该插件运行的Python脚本程序可以访问整个IDA数据库,并且可以方便地调用所有IDC函数和使用所有已安装的Python模块中的功能。
1、列出当前PE文件中所有函数
for ea in Segments(): #遍历所有段
for function in Functions(SegStart(ea), SegEnd(ea)): #遍历该段中所有函数
print hex(function), GetFunctionName(function) #输出函数起势地址和函数名
2、 反汇编当前鼠标所在函数的所有指令
ea = ScreenEA() #获取鼠标当前位置
for inst in FuncItems(ea): #遍历本函数所有地址
print hex(inst), GetDisasm(inst) #输出每条指令及其地址
3、查看PE文件所有函数及其被调用情况 ea = ScreenEA() #鼠标当前位置 callers = dict() for function_ea in Functions(SegStart(ea), SegEnd(ea)): #遍历所有函数 function_name = GetFunctionName(function_ea) #获取函数名 refs = CodeRefsTo(function_ea,0) #哪些函数调用了本函数 refs = list(refs) if refs: #把结果保存到字典中 callers[function_name] = set(map(GetFunctionName, refs)) for k, v in callers.items(): #输出结果 print k, ':', v ea = ScreenEA() for inst in FuncItems(ea): refs = list(CodeRefsFrom(inst, 0)) if refs: times = dict() for seg_startEA in Segments(): if SegName(seg_startEA)!='.text': #只考虑代码段 continue for instEA in Heads(seg_startEA, SegEnd(seg_startEA)): if isCode(GetFlags(instEA)): #只考虑代码 mnem = GetMnem(instEA) times[mnem] = times.get(mnem, 0)+1 times = sorted(times, key=lambda x: x[1], reverse=True) #按出现频率从高到低排序 for k, v in times: #输出结果
4、查看当前函数调用了哪些函数
5、统计PE文件中指令的出现频率