我阅读了头部分析仪的文档。它用于对现有二进制文件执行分析。我知道-postscript标志允许输入分析脚本。我有一个正常工作的Java脚本。但是,我想使用python 3进行分析。我想像这样运行:

./analyzeHeadless ghidra-project-directory -import binary-file -postscript yourpythonscript


是否可以运行python脚本进行分析?另外,是否有任何文档可用于执行此操作?


编辑:

我编写了以下脚本,它确实可以正常工作(但它不能给我
发现DecompInterface的错误):

import ghidra.app.util.headless.HeadlessScript;
import ghidra.app.decompiler.ClangNode;
import ghidra.app.decompiler.ClangToken;
import ghidra.app.decompiler.ClangLine;
import ghidra.app.decompiler.ClangTokenGroup;
import ghidra.app.decompiler.DecompInterface;
import ghidra.app.decompiler.DecompileResults;
import ghidra.program.model.address.Address;
import ghidra.program.model.listing.CodeUnit;
import ghidra.program.model.listing.Function;
import ghidra.program.model.listing.FunctionIterator;
import ghidra.program.model.listing.InstructionIterator;
import ghidra.program.model.listing.Program;
import ghidra.program.model.listing.Variable;
import ghidra.program.model.pcode.HighFunction;
import ghidra.program.model.pcode.HighSymbol;
import ghidra.program.model.pcode.HighVariable;
import ghidra.program.model.pcode.LocalSymbolMap;
import ghidra.program.model.pcode.PcodeOp;
import ghidra.program.model.pcode.Varnode;
import ghidra.program.model.symbol.Symbol;
import ghidra.program.model.symbol.Reference;
import ghidra.program.model.symbol.ReferenceIterator;
import ghidra.util.task.ConsoleTaskMonitor;

args = getScriptArgs()

print(args)

p = currentProgram
print(p)

filename = "/projects/zephyr/Ruturaj/ghidra_learning/" + p.getName() + ".txt"
print(filename)

#di = DecompInterface()
#print(di)



评论

AFAIK Ghidra依靠不支持Python 3的Jython。您必须使用Python2。

谢谢@IgorSkochinsky,我会在答案中记下这一点

#1 楼

我发现python脚本可以与无头分析器脚本一起使用。

使用以下命令可以运行它,就像java文件一样:

./analyzeHeadless ghidra-project-directory -import binary-file -postscript yourpythonscript


显然为Java定义的所有类都可以直接在python脚本中使用。

特定类可以与from import statements一起导入,例如在Java中如下所示:

import ghidra.program.model.listing.Variable;


并使用python:

from ghidra.program.model.listing import Variable;


导入variable类。可以像Java一样导入变量类(请参见上面的import语句)。但是,那么您必须使用整个路径名来访问它。例如:

something = ghidra.program.model.listing.Variable()


因此,总而言之,可以通过导入类而使用python编写相同的脚本,而不会出现任何问题。希望这对某人有所帮助。


编辑:

正如@igor在评论中所说,它仅适用于python 2.7(因为ghidra
依赖于Jython)。对于python 3.x,可以使用
ghidra_bridge之类的东西