关于 ghidra
ghidra 是利用 Ghidra 的 analyzeHeadless 工具进行自动化逆向分析的技能,面向安全研究人员和分析人员,可反编译二进制文件并导出函数、字符串、符号、调用图和摘要。
主要功能
- 01运行 Ghidra 无头分析
- 02将函数反编译为 C 伪代码
- 03导出函数、字符串和符号
- 04生成函数调用图
- 05标记安全相关函数
- 06设置处理器架构和分析选项
适用场景
- 01分析未知二进制文件
- 02按指定架构检查固件
- 03提取字符串和符号用于调查
- 04检查调用关系和安全相关函数
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mitsuhiko/ agent-stuff --skill ghidra安装后在 Claude Code 中输入/ghidra确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
scripts/find-ghidra.shghidra-analyze.shscripts/ghidra_scripts/ExportAll.javaExportCalls.javaExportDecompiled.javaExportFunctions.javaExportStrings.javaExportSymbols.java详细介绍
Ghidra 无头分析技能
使用 Ghidra 的 analyzeHeadless 工具执行自动化逆向工程。导入二进制文件、运行分析、反编译为 C 代码,并提取有用信息。
快速参考
| 任务 | 命令 |
|---|---|
| 使用所有导出功能执行完整分析 | ghidra-analyze.sh -s ExportAll.java -o ./output binary |
| 反编译为 C 代码 | ghidra-analyze.sh -s ExportDecompiled.java -o ./output binary |
| 列出函数 | ghidra-analyze.sh -s ExportFunctions.java -o ./output binary |
| 提取字符串 | ghidra-analyze.sh -s ExportStrings.java -o ./output binary |
| 获取调用图 | ghidra-analyze.sh -s ExportCalls.java -o ./output binary |
| 导出符号 | ghidra-analyze.sh -s ExportSymbols.java -o ./output binary |
| 查找 Ghidra 路径 | find-ghidra.sh |
先决条件
- 必须安装 Ghidra。在 macOS 上:
brew install --cask ghidra - 必须提供 Java(OpenJDK 17+)
该技能会自动在常见安装路径中查找 Ghidra。如果 Ghidra 安装在非标准位置,请设置 GHIDRA_HOME 环境变量。
主包装脚本
./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
全面导出——运行所有其他导出脚本并生成摘要。最适合初始分析。
输出文件:
{name}_summary.txt- 概览:架构、内存段、函数数量{name}_decompiled.c- 所有函数反编译后的 C 代码{name}_functions.json- 包含签名和调用关系的函数列表{name}_strings.txt- 找到的所有字符串{name}_interesting.txt- 符合安全相关模式的函数
./scripts/ghidra-analyze.sh -s ExportAll.java -o ./analysis firmware.bin
ExportDecompiled.java
将所有函数反编译为 C 伪代码。
输出: {name}_decompiled.c
./scripts/ghidra-analyze.sh -s ExportDecompiled.java -o ./output program.exe
ExportFunctions.java
将函数列表导出为 JSON,包含地址、签名、参数和调用关系。
输出: {name}_functions.json
{
"program": "example.exe",
"architecture": "x86",
"functions": [
{
"name": "main",
"address": "0x00401000",
"size": 256,
"signature": "int main(int argc, char **argv)",
"returnType": "int",
"callingConvention": "cdecl",
"isExternal": false,
"parameters": [{"name": "argc", "type": "int"}, ...],
"calls": ["printf", "malloc", "process_data"],
"calledBy": ["_start"]
}
]
}
ExportStrings.java
提取所有字符串(ASCII、Unicode)及其地址。
输出: {name}_strings.json
./scripts/ghidra-analyze.sh -s ExportStrings.java -o ./output malware.exe
ExportCalls.java
导出函数调用图,显示调用方/被调用方关系。
输出: {name}_calls.json
包括:
- 完整调用图
- 可能的入口点(没有调用方的函数)
- 调用频率最高的函数
ExportSymbols.java
导出所有符号:导入符号、导出符号和内部符号。
输出: {name}_symbols.json
常见工作流
分析未知二进制文件
# Create output directory
mkdir -p ./analysis
# Run comprehensive analysis
./scripts/ghidra-analyze.sh -s ExportAll.java -o ./analysis unknown_binary
# Review the summary first
cat ./analysis/unknown_binary_summary.txt
# Look at interesting patterns (crypto, network, dangerous functions)
cat ./analysis/unknown_binary_interesting.txt
# Check specific decompiled functions
grep -A 50 "encrypt" ./analysis/unknown_binary_decompiled.c
分析固件
# Specify ARM architecture for firmware
./scripts/ghidra-analyze.sh \
-p "ARM:LE:32:v7" \
-s ExportAll.java \
-o ./firmware_analysis \
firmware.bin
快速列出函数
# Just get function names and addresses (faster)
./scripts/ghidra-analyze.sh --no-analysis -s ExportFunctions.java -o . program
# Parse with jq
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
分析多个二进制文件
for bin in ./samples/*; do
name=$(basename "$bin")
./scripts/ghidra-analyze.sh -s ExportAll.java -o "./results/$name" "$bin"
done
架构/处理器 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 |
查找所有可用处理器:
ls "$(dirname $(./scripts/find-ghidra.sh))/../Ghidra/Processors/"
故障排除
未找到 Ghidra
# Check if Ghidra is installed
./scripts/find-ghidra.sh
# Set GHIDRA_HOME if in non-standard location
export GHIDRA_HOME=/path/to/ghidra_11.x_PUBLIC
./scripts/ghidra-analyze.sh ...
分析耗时过长
# Set a timeout (seconds)
./scripts/ghidra-analyze.sh --timeout 300 -s ExportAll.java binary
# Skip analysis for quick export
./scripts/ghidra-analyze.sh --no-analysis -s ExportSymbols.java binary
内存不足
编辑 analyzeHeadless 脚本或设置:
export MAXMEM=4G
检测到的架构错误
明确指定处理器:
./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