mcpField
G
ghidra

ghidra

github.com/mitsuhiko安全3.2k630 次安装4 周前更新
代码仓库

关于 ghidra

ghidra 是利用 Ghidra 的 analyzeHeadless 工具进行自动化逆向分析的技能,面向安全研究人员和分析人员,可反编译二进制文件并导出函数、字符串、符号、调用图和摘要。

主要功能

  1. 01运行 Ghidra 无头分析
  2. 02将函数反编译为 C 伪代码
  3. 03导出函数、字符串和符号
  4. 04生成函数调用图
  5. 05标记安全相关函数
  6. 06设置处理器架构和分析选项

适用场景

  1. 01分析未知二进制文件
  2. 02按指定架构检查固件
  3. 03提取字符串和符号用于调查
  4. 04检查调用关系和安全相关函数

安装

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

$npx skills add https://github.com/mitsuhiko/agent-stuff --skill ghidra

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

包含的文件

除 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 代码,并提取有用信息。

快速参考

任务命令
使用所有导出功能执行完整分析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
PowerPCPowerPC: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

提示

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

评论

支持 Markdown