最近,我正在使用Ghidra,但找不到用于获取给定功能的控制流程图的API。有人可以帮我吗?

提前谢谢您。

编辑:它与另一个问题(链接)不同,因为我要的是API。

评论

如何在Ghidra中显示功能的CFG的可能重复项?

我编辑了。我要的是API,所以不是重复的。

嗨,欢迎来到RE.SE!您能更具体地说明要使用流程图吗?布局?创建自己的?该API非常庞大ghidra.re/ghidra_docs/api/index-all.html

嗨!给定一个功能,我需要提取其CFG,以便计算其边缘和节点以计算圈复杂度和其他度量。我已经浏览了Ghidra的文档,但没有找到所需的文件。

我使用了calculateCyclomaticComplexity函数来计算循环复杂度,但是我发现没有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 .:您可以做的另一件事是研究使用此BasickBlock模型的calculateCyclomaticComplexity方法的代码,我想我可能会这样做。

编辑:
我认为是个好消息。我找到了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()

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



评论


太好了,您对我有很大帮助,非常感谢!

–本尼
19年5月17日在17:43

别客气!顺便说一句,我发现了另一个有用的信息,请在报告的问题中查看以下答案:github.com/NationalSecurityAgency/ghidra/issues/…由于我仍无法弄清楚如何正确创建和配置,我正在使用该块模型DecompInterface类的实例

–毛里西奥·桑菲利波(Mauricio Sanfilippo)
19年5月20日在13:19



@MauricioSanfilippo为您完成了上面的代码。我使用TaskMonitor.DUMMY作为第三个参数,并传递了一个函数objrct,但是没有任何东西可以为我分解。您找到解决方案了吗?

–hEShaN
7月19日20:10

@hEShaN不,我不知道如何使用DecompInterface。但是我采用了SimpleBlockModel方法,该方法对我来说很好用,而且似乎更简单。您可以阅读github.com/NationalSecurityAgency/ghidra/issues/…。我创建了一些脚本来获取和遍历图形,如果需要,可以与您共享。它主要是临时的,但是可以用,如果它们对您不起作用,也许您可​​以改进它们

–毛里西奥·桑菲利波(Mauricio Sanfilippo)
7月20日21:27

非常感谢你。您是否有指向这些脚本的链接。再次感谢!

–hEShaN
7月21日2:12