关于 ghidra-headless
ghidra-headless 是使用 Ghidra analyzeHeadless 自动分析二进制文件的技能,面向逆向工程和安全审计人员。它可反编译代码并导出函数、字符串、调用图和符号等结果。
主要功能
- 01批量分析二进制文件
- 02反编译函数为 C 伪代码
- 03导出函数、字符串和符号
- 04生成函数调用图
- 05配置处理器架构与分析参数
适用场景
- 01审查二进制文件的伪代码
- 02排查未知程序或固件
- 03提取字符串和函数签名
- 04分析调用关系与控制流
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ trailofbits/ skills-curated --skill ghidra-headless安装后在 Claude Code 中输入/ghidra-headless确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
scripts/find-ghidra.shghidra-analyze.shscripts/ghidra_scripts/ExportAll.javaExportCalls.javaExportDecompiled.javaExportFunctions.javaExportStrings.javaExportSymbols.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 |
| PowerPC | PowerPC: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
提示
- 从 ExportAll.java 开始 — 它会提供全部内容;摘要有助于快速了解情况
- 查看 interesting.txt — 自动突出显示与安全相关的函数
- 使用 jq 解析 JSON — JSON 导出内容专为机器读取而设计
- 反编译并非完美无误 — 可将其作为参考,并与反汇编结果交叉核对
- 大型二进制文件需要时间处理 — 使用
--timeout,并考虑使用--no-analysis进行快速扫描
评论
支持 Markdown