akiselev/ghidra-cli
GitHub: akiselev/ghidra-cli
一款用 Rust 编写的高性能 Ghidra 命令行工具,通过 bridge 架构实现无头自动化逆向分析并支持与 AI 代理集成。
Stars: 165 | Forks: 17
# Ghidra CLI
一个高性能的 Rust CLI,用于自动化 Ghidra 逆向工程任务,专为直接使用和 AI 代理集成(如 Claude Code)而设计。
## 功能
- **直接 bridge 架构** - CLI 直接连接到运行在 Ghidra JVM 内部的 Java bridge
- **自动启动 bridge** - 导入/分析命令会自动启动 bridge
- **快速查询** - 将 Ghidra 保留在内存中,实现亚秒级的响应时间
- **全面分析** - 函数、symbols、types、strings、cross-references
- **类型系统** - 创建/编辑 struct、enum、typedef;添加/删除 struct 字段
- **函数签名** - 编辑返回类型、calling convention、完整的 C 签名;重新指定变量类型
- **二进制 patch** - 修改字节、NOP 指令、导出 patch
- **Call graph** - 生成 caller/callee 图,导出为 DOT 格式
- **搜索功能** - 查找 string、字节、函数、加密模式
- **脚本执行** - 运行 Java/Python Ghidra 脚本,支持内联或从文件执行
- **批量操作** - 从文件执行多个命令
- **灵活输出** - 人类可读、JSON 或格式化 JSON 格式
- **过滤** - 强大的基于表达式的过滤(例如,`size > 100`)
## 架构
```
┌─────────────────┐ ┌──────────────────────────────────────┐
│ CLI Command │──TCP──▶ │ GhidraCliBridge.java │
│ ghidra ... │ │ (GhidraScript in analyzeHeadless) │
│ --project X │ │ ServerSocket on localhost:dynamic │
└─────────────────┘ └──────────────────────────────────────┘
```
CLI 直接连接到运行在 Ghidra JVM 内部的 Java bridge。这提供了:
- **一致的状态** - 所有操作使用单个 Ghidra 进程
- **快速查询** - 没有每个命令的 JVM 启动开销
- **自动启动** - bridge 在需要时自动启动
- **项目级隔离** - 每个项目都有其专属的 bridge 进程和端口文件,支持多个二进制文件的并发分析
- **最小依赖** - 仅需 Ghidra + Java(无需 Python/PyGhidra)
## 安装说明
### 从源码构建
```
git clone https://github.com/akiselev/ghidra-cli
cd ghidra-cli
cargo install --path .
```
### 前置条件
- **Ghidra 10.0+** - 从 [ghidra-sre.org](https://ghidra-sre.org) 下载
- **Java 17+** - Ghidra 所需
- **Rust 1.70+** - 用于从源码构建
设置 Ghidra 的安装路径:
```
export GHIDRA_INSTALL_DIR=/path/to/ghidra
# 或通过 CLI 配置:
ghidra config set ghidra_install_dir /path/to/ghidra
```
## 快速开始
```
# 检查安装
ghidra doctor
# 导入并分析 binary(bridge 自动启动)
ghidra import ./binary --project myproject --program mybinary
ghidra analyze --project myproject --program mybinary
# 查询函数(使用运行中的 bridge)
ghidra function list
# 反编译函数
ghidra decompile main
# 查找感兴趣的字符串
ghidra find string "password"
# 获取 cross-references
ghidra x-ref to 0x401000
# 生成 call graph
ghidra graph callers main --depth 3
```
## 命令
### 项目与程序管理
```
ghidra project create
# Create project
ghidra project list # List projects
ghidra project delete # Delete project
ghidra import --project # Import binary (auto-starts bridge)
ghidra analyze --project
# Run analysis
```
### 函数分析
```
ghidra function list # List all functions
ghidra function list --filter "size > 100" # Filter by size
ghidra decompile # Decompile function
ghidra decompile main --with-vars --with-params # Include variable/param details
ghidra disasm --instructions 20 # Disassemble instructions
ghidra function set-signature --signature "int foo(int x, char *y)"
ghidra function set-return-type --type void
ghidra function set-calling-convention --convention __cdecl
ghidra function set-var-type --var local_10 --type "MyStruct *"
```
### Symbols 与 Types
```
ghidra symbol list # List symbols
ghidra symbol create # Create symbol
ghidra symbol rename # Rename symbol
ghidra type list # List data types (with kind: struct/enum/typedef/...)
ghidra type get # Get type details (fields, enum members, typedef base)
ghidra type create # Create empty struct
ghidra type add-field --name fd --type int # Add struct field
ghidra type del-field --name fd # Remove struct field
ghidra type create-enum --values "A=0,B=1" # Create enum
ghidra type typedef # Create typedef alias
ghidra type rename # Rename type
ghidra type delete # Delete type
```
### Cross-References
```
ghidra x-ref to # References TO address
ghidra x-ref from # References FROM address
```
### 搜索
```
ghidra find string "pattern" # Find strings
ghidra find bytes "90 90 90" # Find byte patterns
ghidra find function "*crypt*" # Find functions by name
ghidra find crypto # Find crypto constants
ghidra find interesting # Find interesting patterns
```
### Call Graph
```
ghidra graph calls # Full call graph
ghidra graph callers # Who calls this? (--depth optional)
ghidra graph callees # What does this call? (--depth optional)
ghidra graph export dot # Export to DOT format
```
### 二进制 Patch
```
ghidra patch bytes "90 90" # Patch bytes
ghidra patch nop --count 5 # NOP out instructions
ghidra patch export -o patched.bin # Export patched binary
```
注意:`patch nop --count` 目前可由 CLI 解析,但 runtime 使用单地址 NOP 行为。
### 注释
```
ghidra comment get # Get comment
ghidra comment set "note" --comment-type EOL # Set comment
ghidra comment list # List all comments
```
注意:由于 client/bridge 参数键不匹配,`--comment-type` 目前会回退到 `EOL`。
### 脚本
```
ghidra script list # List available scripts
ghidra script run myscript.py # Run script file
ghidra script python "print(currentProgram)" # Inline Python
```
### 批量操作
```
ghidra batch commands.txt # Run commands from file
```
### 统计信息
```
ghidra stats # Program statistics
ghidra summary # Program summary
```
## Bridge 管理
bridge 会将 Ghidra 保留在内存中。它会在需要时自动启动,但你也可以手动控制它:
```
# 启动 bridge 并加载程序
ghidra start --project myproject --program mybinary
# 检查 bridge 状态
ghidra status --project myproject
# 所有命令自动使用 bridge
ghidra function list --project myproject # Fast!
ghidra decompile main --project myproject # Fast!
# 停止 bridge
ghidra stop --project myproject
# 使用不同的程序重启
ghidra restart --project myproject --program otherbinary
```
### 多项目支持
每个项目都有其专属的 bridge 进程和端口文件,允许进行并发分析:
```
# 同时处理多个项目
ghidra import ./binary_a --project projA
ghidra analyze --project projA --program binary_a
ghidra import ./binary_b --project projB
ghidra analyze --project projB --program binary_b
# 独立查询每个项目
ghidra function list --project projA
ghidra function list --project projB
```
## 输出格式
当连接到终端时,默认输出是人类可读的。当通过管道传输(非 TTY)时,输出会自动检测并切换为紧凑的 JSON 以供机器消费。可以使用标志进行覆盖:
- **默认 (TTY)**:紧凑的人类可读格式(专为人类和 AI 代理设计)
- **默认 (管道)**:用于机器解析的紧凑 JSON
- **--json**:用于机器解析的紧凑 JSON
- **--pretty**:格式化打印的 JSON(缩进、多行)
使用标志覆盖:
```
# 强制 JSON 输出(紧凑,单行)
ghidra function list --json
# 强制 pretty JSON(缩进,多行)
ghidra function list --pretty
# 选择特定字段
ghidra function list --fields "name,address,size"
```
### 输出格式设计
格式检测发生在 CLI 边界。bridge 始终返回紧凑的 JSON 以提高 IPC 效率。CLI 会根据 TTY 检测或显式标志,在输出边界应用格式转换(人类可读、格式化 JSON)。这种设计保持了稳定的 IPC 协议和单一的格式决策点。
## 过滤
使用表达式过滤结果:
```
ghidra function list --filter "size > 100"
ghidra function list --filter "name ~ 'main'"
ghidra strings list --filter "length > 20"
```
## AI 代理集成
Ghidra CLI 专为与 Claude Code 等 AI 编码助手无缝协作而设计。其结构化的输出和全面的命令集使其成为自动化逆向工程工作流的理想选择。
AI 代理工作流示例:
1. `ghidra import suspicious.exe --project analysis` + `ghidra analyze --project analysis` - 导入、分析、启动 bridge
2. `ghidra find interesting` - AI 分析可疑模式
3. `ghidra decompile ` - AI 检查特定函数
4. `ghidra x-ref to ` - AI 追踪数据流
5. `ghidra patch nop ` - AI patch 反调试代码
6. `ghidra patch export -o patched.bin` - 导出已 patch 的二进制文件
## 问题排查
### 常见问题
#### 缺少 X11 库 (Linux/WSL)
如果你看到类似 `libXtst.so.6: cannot open shared object file` 的错误,请安装 X11 库:
```
# Arch Linux / WSL with Arch
sudo pacman -S libxtst
# Ubuntu / Debian / WSL with Ubuntu
sudo apt install libxtst6
# Fedora / RHEL
sudo dnf install libXtst
```
#### Java 版本问题
Ghidra 需要 JDK 17 或更高版本(不能仅是 JRE):
```
# Arch Linux
sudo pacman -S jdk21-openjdk
# Ubuntu / Debian
sudo apt install openjdk-21-jdk
# 验证安装
java -version # Should show 17+ and include "JDK"
```
#### WSL 专项注意事项
即使在无头(headless)模式下运行,WSL 也需要 X11 库,因为在初始化期间会加载 Java AWT:
1. 安装 X11 库(见上文)
2. 如果使用 WSL1,建议升级到 WSL2 以获得更好的兼容性
3. Bridge 的端口/PID 文件存储在 `~/.local/share/ghidra-cli/` 中
#### 运行 Doctor
使用 doctor 命令验证你的安装:
```
ghidra doctor
```
它会检查:
- Ghidra 安装目录
- analyzeHeadless 的可用性
- 项目目录配置
- 配置文件状态
## 贡献
欢迎贡献!请随时提交 issue 和 pull request。
## 许可证
GPL-3.0 许可证 - 详情请参阅 [LICENSE](LICENSE)。
标签:AI智能体, Ghidra, JS文件枚举, Rust, URL提取, 云资产清单, 反编译, 可视化界面, 网络流量审计, 自动化分析, 跨站脚本, 逆向工程, 通知系统