ghidra:如何使用无头分析器运行 python 3 脚本

逆向工程 吉德拉
2021-07-03 02:51:22

我阅读了无头分析器的文档它用于对现有二进制文件进行分析。我知道该-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)
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 一样导入(参见上面的导入语句)。但是,您必须使用整个路径名才能访问它。例如:

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

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

编辑:

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