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
4、查看当前函数调用了哪些函数
ea = ScreenEA()
for inst in FuncItems(ea):
refs = list(CodeRefsFrom(inst, 0))
if refs:
print hex(inst), 'calling...', GetFunctionName(refs[0])
5、统计PE文件中指令的出现频率
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: #输出结果
print k, ':', v