Ghidra 控制流图
我正在寻找同样的东西,现在我发现类 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() 方法。
// 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()
# ...
# ...
# ...