我是IDAPython的新手。基本上,我想使用ida python脚本遍历IDB文件中的所有功能及其说明。最终目标是从idapro导出功能及其说明。

from idautils import *
from idaapi import *

ea = BeginEA()
for funcea in Functions(SegStart(ea), SegEnd(ea)):
    functionName = GetFunctionName(funcea)
    print functionName


使用上述脚本,我正在检索函数名称,现在我还想打印每个函数的汇编指令。我知道可能必须使用GetDisasm(ea),不确定如何使用API​​。

TIA

#1 楼

请注意,它将仅打印那些被IDA自动分析识别或手动定义的功能,与您的代码段完全相同。此代码段未经调试,使用风险自负。

from idautils import *
from idaapi import *
from idc import *

for segea in Segments():
    for funcea in Functions(segea, SegEnd(segea)):
        functionName = GetFunctionName(funcea)
        for (startea, endea) in Chunks(funcea):
            for head in Heads(startea, endea):
                print functionName, ":", "0x%08x"%(head), ":", GetDisasm(head)


如果要将指令提取为二进制,可以使用idc.NextHead函数获取指令边界。

代码中提到的函数块与我们在IDA的图形视图中看到的不同(如果函数不连续,则该函数有多个块
):称为“基本块”,请通过链接查看更正确的定义。

评论


谢谢!这就是我想要的。顺便说一句,有什么办法可以像我在IDA图形视图中那样获得大块的指令集?

– Dev.K.
17年2月23日在16:57

@ Dev.K。这些块称为“基本块”。据我所知,没有IDAPython API可以使用它,但是所有块的起始指令都可以通过对它们的代码引用来找到。

– w s
17年2月23日在17:00

@ Dev.K。查看更新的答案,更正确的基本块定义参考

– w s
17-2-23在17:34



除了遍历所有段,还可以调用idautils.Functions()。默认行为将遍历IDB中定义的所有功能。

– NirIzr
18-09-26在0:49