有没有一种方法可以从命令行运行ghidra?

GUI界面非常沉重。 />
感谢

#1 楼

Ghidra反编译器已集成到Radar2中,后者是一个命令行反汇编程序(除其他外)。

您需要安装r2ghidra-dec软件包。然后可以使用afl命令打印功能列表,并使用pdg命令显示给定功能的Ghidra反编译输出。

例如:

[0x080484d0]> afl
0x080484d0    1 50           entry0
0x08048503    1 4            fcn.08048503
0x08048480    1 6            sym.imp.__libc_start_main
0x08048530    4 50   -> 41   sym.deregister_tm_clones
0x08048570    4 58   -> 54   sym.register_tm_clones
0x080485b0    3 34   -> 31   entry.fini0
0x080485e0    1 6            entry.init0
0x08048780    1 2            sym.__libc_csu_fini
0x08048520    1 4            sym.__x86.get_pc_thunk.bx
0x0804865f    1 63           sym.vuln
0x08048430    1 6            sym.imp.gets
0x08048714    1 4            loc.get_return_address
0x08048420    1 6            sym.imp.printf
0x08048784    1 20           sym._fini
0x08048720    4 93           sym.__libc_csu_init
0x08048510    1 2            sym._dl_relocate_static_pie
0x0804869e    1 118          main
0x08048490    1 6            sym.imp.setvbuf
0x08048450    1 6            sym.imp.getegid
0x080484b0    1 6            sym.imp.setresgid
0x08048460    1 6            sym.imp.puts
0x080485e6    3 121          sym.flag
0x080484a0    1 6            sym.imp.fopen
0x08048470    1 6            sym.imp.exit
0x08048440    1 6            sym.imp.fgets
0x080483e8    3 35           sym._init
[0x080484d0]> pdg @ sym.vuln

// WARNING: Variable defined which should be unmapped: var_4h
// WARNING: [r2ghidra] Removing arg arg_4h because it doesn't fit into ProtoModel

void sym.vuln(void)
{
    undefined4 uVar1;
    int32_t unaff_EBX;
    char *s;
    int32_t var_4h;

    sym.__x86.get_pc_thunk.bx();
    sym.imp.gets(&s);
    uVar1 = loc.get_return_address();
    sym.imp.printf(unaff_EBX + 0x19c, uVar1);
    return;
}


#2 楼

在这里查看我的答案。

您所要做的就是使用ghidra附带的./analyzeHeadless脚本:

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


您可以使用javapython 2.7。您可以在此处检查ghidra api。

您可以通过以下方式编写脚本(使用python):

from  ghidra.app.decompiler import DecompInterface
from ghidra.util.task import ConsoleTaskMonitor

# get the current program
# here currentProgram is predefined

program = currentProgram
decompinterface = DecompInterface()
decompinterface.openProgram(program);
functions = program.getFunctionManager().getFunctions(True)
for function in list(functions):
    print(function)
    # decompile each function
    tokengrp = decompinterface.decompileFunction(function, 0, ConsoleTaskMonitor())
    print(tokengrp.getDecompiledFunction().getC())


#3 楼

一种方法是在扩展GhidraScript类的Java类中使用Ghidra的CppExporter类。 Ghidra的源代码包含一些示例代码,可以在以下链接中找到:反编译器示例。
我选择了其中一个并对代码进行了一些改进。

下面的代码必须复制然后在一个名为Decompile.java
的文件中运行Ghidra的analyticsHeadless二进制工具。
<ghidra_root>/support/analyzeHeadless <ghidra_project_dir> <project_name> \
    -import <path_to_binary> -postscript <your_path>/Decompile.java <out_C_file_path>


注意:如果项目目录尚不存在,则可能必须创建它。

Decompile.java示例: >

#4 楼

我写了这个脚本,它使用二进制文件并将C源代码喷出到文件中。只需稍微修改ghidra的Ghidra / Features / Decompiler / ghidra_scripts / Decompile.java脚本即可。

https://github.com/h4sh5/ghidra-headless-decompile

评论


请在您的答案中提供解决方案的核心详细信息,而不仅要链接到实现此目的的代码。它将使其在将来作为参考更加有用。

–TMR232
19年8月5日在12:40