mcpField
G
ghidra-headless

ghidra-headless

github.com/trailofbits安全522518 次安装15 周前更新
代码仓库

关于 ghidra-headless

ghidra-headless 是使用 Ghidra analyzeHeadless 自动分析二进制文件的技能,面向逆向工程和安全审计人员。它可反编译代码并导出函数、字符串、调用图和符号等结果。

主要功能

  1. 01批量分析二进制文件
  2. 02反编译函数为 C 伪代码
  3. 03导出函数、字符串和符号
  4. 04生成函数调用图
  5. 05配置处理器架构与分析参数

适用场景

  1. 01审查二进制文件的伪代码
  2. 02排查未知程序或固件
  3. 03提取字符串和函数签名
  4. 04分析调用关系与控制流

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/trailofbits/skills-curated --skill ghidra-headless

安装后在 Claude Code 中输入/ghidra-headless确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

scripts/
find-ghidra.sh
ghidra-analyze.sh
scripts/ghidra_scripts/
ExportAll.java
ExportCalls.java
ExportDecompiled.java
ExportFunctions.java
ExportStrings.java
ExportSymbols.java

详细介绍

Ghidra 无头分析

使用 Ghidra 的 analyzeHeadless 工具执行自动化逆向工程。 导入二进制文件、运行分析、反编译为 C 代码,并提取有用信息。

适用场景

  • 将二进制文件反编译为 C 伪代码以供审查
  • 从可执行文件中提取函数签名、字符串或符号
  • 分析调用图以了解二进制文件的控制流
  • 对未知二进制文件或固件映像进行初步分析
  • 批量分析多个二进制文件以进行比较
  • 在无法访问源代码的情况下审计编译后的代码

不适用场景

  • 有源代码可用——直接阅读源代码
  • 需要交互式调试——使用 GDB、LLDB 或 Ghidra GUI
  • 二进制文件是 .NET 程序集——使用 dnSpy 或 ILSpy
  • 二进制文件是 Java 字节码——使用 jadx 或 cfr
  • 需要动态分析——使用调试器或沙箱

快速参考

任务命令
使用所有导出项进行完整分析{baseDir}/scripts/ghidra-analyze.sh -s ExportAll.java -o ./output binary
反编译为 C 代码{baseDir}/scripts/ghidra-analyze.sh -s ExportDecompiled.java -o ./output binary
列出函数{baseDir}/scripts/ghidra-analyze.sh -s ExportFunctions.java -o ./output binary
提取字符串{baseDir}/scripts/ghidra-analyze.sh -s ExportStrings.java -o ./output binary
获取调用图{baseDir}/scripts/ghidra-analyze.sh -s ExportCalls.java -o ./output binary
导出符号{baseDir}/scripts/ghidra-analyze.sh -s ExportSymbols.java -o ./output binary
查找 Ghidra 路径{baseDir}/scripts/find-ghidra.sh

前置条件

  • 必须安装 Ghidra。在 macOS 上:brew install --cask ghidra
  • 必须提供 Java(OpenJDK 17+)

此技能会自动在常见安装路径中查找 Ghidra。如果 Ghidra 安装在非标准位置,请设置 GHIDRA_HOME 环境变量。

主包装脚本

{baseDir}/scripts/ghidra-analyze.sh [options] <binary>

负责处理项目的创建和清理,并为 analyzeHeadless 提供更简单的 接口。

选项:

  • -o, --output <dir> — 结果输出目录(默认:当前目录)
  • -s, --script <name> — 要运行的分析后脚本(可重复指定)
  • -a, --script-args <args> — 为最后指定的脚本传递参数
  • --script-path <path> — 额外的脚本搜索路径
  • -p, --processor <id> — 处理器/架构(例如:x86:LE:32:default)
  • -c, --cspec <id> — 编译器规范(例如:gcc、windows)
  • --no-analysis — 跳过自动分析(速度更快,但信息更少)
  • --timeout <seconds> — 每个文件的分析超时时间
  • --keep-project — 分析后保留 Ghidra 项目
  • --project-dir <dir> — Ghidra 项目目录(默认:/tmp)
  • --project-name <name> — 项目名称(默认:自动生成)
  • -v, --verbose — 输出详细信息

内置导出脚本

ExportAll.java

运行摘要、反编译、函数列表、字符串和有趣模式导出。不包含调用图或符号——如有需要,请单独运行 ExportCalls.java 和 ExportSymbols.java。最适合初步分析。

输出文件:

  • {name}_summary.txt — 概览:架构、内存分区、函数数量
  • {name}_decompiled.c — 将所有函数反编译为 C
  • {name}_functions.json — 函数列表,包含签名和调用关系
  • {name}_strings.txt — 找到的所有字符串(纯文本;如需 JSON,请使用 ExportStrings.java)
  • {name}_interesting.txt — 符合安全相关模式的函数
{baseDir}/scripts/ghidra-analyze.sh -s ExportAll.java -o ./analysis firmware.bin
ExportDecompiled.java

将所有函数反编译为 C 伪代码。

输出: {name}_decompiled.c

ExportFunctions.java

将函数列表导出为 JSON,包含地址、签名、参数和 调用关系。

输出: {name}_functions.json

ExportStrings.java

提取所有字符串(ASCII、Unicode)及其地址。

输出: {name}_strings.json

ExportCalls.java

导出函数调用图,展示调用方和被调用方之间的关系。包含完整调用图、潜在入口点和最常被调用的函数。

输出: {name}_calls.json

ExportSymbols.java

导出所有符号:导入、导出和内部符号。

输出: {name}_symbols.json

常见工作流

分析未知二进制文件
mkdir -p ./analysis
{baseDir}/scripts/ghidra-analyze.sh -s ExportAll.java -o ./analysis unknown_binary
cat ./analysis/unknown_binary_summary.txt
cat ./analysis/unknown_binary_interesting.txt
分析固件
{baseDir}/scripts/ghidra-analyze.sh \
    -p "ARM:LE:32:v7" \
    -s ExportAll.java \
    -o ./firmware_analysis \
    firmware.bin
快速列出函数
{baseDir}/scripts/ghidra-analyze.sh --no-analysis -s ExportFunctions.java -o . program
cat program_functions.json | jq '.functions[] | "\(.address): \(.name)"'
查找特定模式
# After running ExportDecompiled, search for patterns
grep -n "password\|secret\|key" output_decompiled.c
grep -n "strcpy\|sprintf\|gets" output_decompiled.c

架构/处理器 ID

-p 选项常用的处理器 ID:

架构处理器 ID
x86 32 位x86:LE:32:default
x86 64 位x86:LE:64:default
ARM 32 位ARM:LE:32:v7
ARM 64 位AARCH64:LE:64:v8A
MIPS 32 位MIPS:BE:32:default 或 MIPS:LE:32:default
PowerPCPowerPC:BE:32:default

故障排除

未找到 Ghidra
{baseDir}/scripts/find-ghidra.sh
# Or set GHIDRA_HOME if in non-standard location
export GHIDRA_HOME=/path/to/ghidra_11.x_PUBLIC
分析耗时过长
{baseDir}/scripts/ghidra-analyze.sh --timeout 300 -s ExportAll.java binary
# Or skip analysis for quick export
{baseDir}/scripts/ghidra-analyze.sh --no-analysis -s ExportSymbols.java binary
内存不足

运行前设置:

export MAXMEM=4G
检测到的架构有误

明确指定处理器:

{baseDir}/scripts/ghidra-analyze.sh -p "ARM:LE:32:v7" -s ExportAll.java firmware.bin

提示

  1. 从 ExportAll.java 开始 — 它会提供全部内容;摘要有助于快速了解情况
  2. 查看 interesting.txt — 自动突出显示与安全相关的函数
  3. 使用 jq 解析 JSON — JSON 导出内容专为机器读取而设计
  4. 反编译并非完美无误 — 可将其作为参考,并与反汇编结果交叉核对
  5. 大型二进制文件需要时间处理 — 使用 --timeout,并考虑使用 --no-analysis 进行快速扫描

评论

支持 Markdown