Ghidra 控制流图

逆向工程 接口 控制流图 吉德拉
2021-06-23 22:27:55

最近我在使用 Ghidra,但我没有找到 API 来获取给定函数的控制流图。有人能帮我吗?

先感谢您。

编辑:它与另一个问题(链接不同,因为我要求提供 API。

1个回答

我正在寻找同样的东西,现在我发现类 PcodeSyntaxTree 有一个名为 getBasicBlocks() 的方法,它返回一个 PcodeBlockBasic 元素数组。第二个类具有 getIn 和 getOut 等方法,它们分别检索传入和传出节点(基本块)。所以我认为使用这种方法应该是以编程方式与CFG交互的接口。但遗憾的是我还没有弄清楚如何获得这个 PcodeSyntaxTree 对象,但会继续调查。

我希望这可以帮助你一点!

链接:http : //ghidra.re/ghidra_docs/api/ghidra/program/model/pcode/PcodeSyntaxTree.html http://ghidra.re/ghidra_docs/api/ghidra/program/model/pcode/PcodeBlockBasic.html

PS.:你可以做的其他事情是研究calculateCyclomaticComplexity 方法的代码,它使用这个BasickBlock模型,我想我可能会这样做。

编辑:我认为是个好消息。我找到了 DecompleResults 类,它有方法 getHighFunction() 返回一个 HighFunction 对象。HighFunction 类扩展到 PcodeSyntaxTree,因此它也有 getBasicBlocks 方法。从那时起,您可以继续。

DecompileResults 类包含在 ghidra.app.decompiler 以及 DecompInterface 中,它具有返回 DecompileResults 对象的 decompileFunction() 方法。

https://github.com/NationalSecurityAgency/ghidra/blob/master/Ghidra/Features/Decompiler/src/main/java/ghidra/app/decompiler/DecompInterface.java

// Make calls to the decompiler: 
// *   DecompileResults res = ifc.decompileFunction(func,0,taskmonitor);

链接:https : //github.com/NationalSecurityAgency/ghidra/blob/master/Ghidra/Features/Decompiler/src/main/java/ghidra/app/decompiler/DecompInterface.java

https://ghidra.re/ghidra_docs/api/ghidra/app/decompiler/DecompileResults.html https://ghidra.re/ghidra_docs/api/ghidra/program/model/pcode/HighFunction.html

编辑2:

我可以想象这样的事情(在 python api 中):

import ghidra.app.decompiler as decomp

interface = decomp.DecompInterface()

# decompileFunction(function, timeout, monitor)
# according to documentation, function is a Function object, timeout is int,
# and monitor is an OPTIONAL ARGUMENT of TaskMonitor type. 
# However, it doesn't say anything about a default value for this argument 
# and omitting the arg in the call falls in an error.

results = interface.decompileFunction(func, 0, taskMonitor)
hf = results.getHighFunction()

bbList = hf.getBasicBlocks()

# ...
# ...
# ...