kirkderp/rbinmcp
GitHub: kirkderp/rbinmcp
一个基于 Rust 的 MCP 服务器,将 radare2 和 Ghidra 的逆向分析能力整合为 AI agent 可调用的工具集,专注于低成本、高效率的二进制文件分类与恶意软件分析。
Stars: 2 | Forks: 0
# 恶意 Binary MCP
`rbinmcp` 是一个用于二进制分析、逆向工程和恶意软件分类的 Rust MCP 服务器。它专为 AI agent 打造,具有紧凑的输出、重点明确的跟进工具以及源码导航功能,旨在保持较低的分析 token 成本。
该项目专注于二进制处理。生产级 MCP 接口可帮助 agent 检查二进制文件、收集证据、比较工件并低成本导航代码库,同时维护这些工具。
## 它提供了什么
- 通过 `triage_binary` 进行快速首轮二进制分类
- 通过 `static_view` 进行静态 PE、ELF 和 Mach-O 解析
- 基于 radare2 的会话、元数据、搜索、反汇编、反编译、xrefs(交叉引用)、追踪以及紧凑的函数投影
- 基于 Ghidra 的导入、缓存项目检查、反编译、CFG(控制流图)、xrefs、P-code、调用点事实以及针对性分析切片
- `file`、`strings`、`objdump`、`radiff2` 以及 Rust `binwalk` crate 的原生包装器
- 用于熵分析、编译器和加壳提示、加密常量、DLL 导出形状、MBA 简化和 VM 字节码辅助工具的纯 Rust 分析
- 用于工具发现、后端状态、工作流、错误指导、仓库导航、验证建议和本地 Ghidra/r2 参考查找的 AI agent 可用性辅助工具
从 MCP 客户端运行 `list_tools` 以获取权威的实时工具列表。当前的服务器接口是根据已注册的处理程序生成的,并通过测试进行固定。
## 从这里开始
在分析未知二进制文件时,请首先使用这些工具:
- `get_backend_status` - 确认可用的可选后端
- `list_tools` 或 `lookup_tool` - 发现准确的实时接口
- `triage_binary` - 文件哈希、格式、节区、导入、函数统计、字符串、xref 密集型函数和调用图摘要
- `static_view` - 无需打开 r2 即可快速获取 PE/ELF/Mach-O 元数据
- `r2_open` 然后 `r2_function_view` - 廉价的函数分类和紧凑的控制流上下文
- `ghidra_import` 然后 `ghidra_decompiler_calls` - 导入一次,然后查询重点的反编译器投影
- `ghidra_callsite_facts` - 当伪代码可能具有误导性时,提供基于列表的调用参数证据
## 工具家族
### 编排
- `triage_binary` 为一个二进制文件构建紧凑的多后端概览。
- `int_convert` 转换十进制、十六进制、二进制和八进制值,并附带可打印的 ASCII 上下文。
### 静态解析
- `static_view` 通过 `goblin` 读取 PE、ELF 和 Mach-O 元数据。
- 支持的静态模式包括格式信息、节区、导入、导出、重定位、库和入口点。
- `export_hash_resolve` 针对本地 PE/DLL 导出语料库和可选候选项解析 API/导出哈希。
### 原生工具
- `file_identify` 包装 `file(1)` 以获取人类可读的文件类型和 MIME 类型。
- `strings_extract` 包装 `strings(1)`,提供结构化的限制和偏移量。
- `objdump_view` 暴露按模式驱动的头部、反汇编、节区转储和归档成员视图。
- `objdump_search_disasm` 搜索 objdump 反汇编并返回上下文匹配项。
- `binary_diff` 包装 `radiff2` 用于面向代码、图形和字节的二进制比较。
- `binwalk_scan` 使用 Rust `binwalk` crate 进行嵌入式签名扫描。
### radare2 工具
- 会话生命周期:`r2_open`、`r2_close`、`r2_sessions` 和 `r2_cmd`。
- 元数据和清单:`r2_metadata`、`r2_find`、`r2_classes`、`r2_imports_grouped` 和 `r2_lookup_address`。
- 代码视图:`r2_disassemble`、`r2_decompile` 和 `r2_function_view`。
- 引用和流:`r2_xrefs`、`r2_trace_data_flow`、`r2_value_trace` 和 `r2_var_xrefs`。
- 聚焦的二进制投影:`r2_path_digest`、`r2_artifact_summary`、`r2_field_xrefs`、`r2_jump_table_slices` 和 `r2_esil_accesses`。
- 字节和表达式辅助工具:`r2_get_bytes` 和 `r2_calculate`。
对于首轮函数分类,首选 `r2_function_view` 的 `analyze` 模式,然后在缩小问题时使用 `cfg`、`refs`、`vars`、`profile` 或 `strings` 模式。
### Ghidra 工具
- 可用性和缓存:`ghidra_check`、`ghidra_import`、`ghidra_project_binaries`、`ghidra_binary_metadata` 和 `ghidra_delete_binary`。
- 清单和搜索:`ghidra_inventory`、`ghidra_xrefs`、`ghidra_search_bytes`、`ghidra_read_bytes` 以及通过清单提供的符号/字符串/数据模式。
- 代码视图:`ghidra_decompile`、`ghidra_decompile_meta`、`ghidra_disassemble`、`ghidra_pcode`、`ghidra_cfg` 和 `ghidra_decompiler_cfg`。
- 反编译器投影:`ghidra_decompiler_calls`、`ghidra_decompiler_block_behavior`、`ghidra_decompiler_memory` 和 `ghidra_decompiler_divergence`。
- 函数证据:`ghidra_callsite_slices`、`ghidra_callsite_facts`、`ghidra_function_checkpoints`、`ghidra_function_dossier`、`ghidra_path_digest`、`ghidra_variables` 和 `ghidra_thunk_target`。
- 专门的逆向工程视图:`ghidra_dynamic_dispatch_table`、`ghidra_context_api_slots`、`ghidra_jump_table_field_summary`、`ghidra_field_flow`、`ghidra_field_lineage`、`ghidra_indirect_jump_slices` 和 `ghidra_local_buffer_slices`。
- 持久化项目编辑:`ghidra_rename_function`、`ghidra_set_function_prototype`、`ghidra_set_bookmark`、`ghidra_set_comment`、`ghidra_create_label` 和 `ghidra_create_function`。
导入由 SHA-256 缓存支持。大多数读取工具使用带有 `analyzeHeadless -process -noanalysis` 的热路径,因此昂贵的导入和分析工作对于每个二进制文件只进行一次。
对于大型目标,首先使用 `ghidra_decompiler_calls`,然后使用 `ghidra_decompiler_block_behavior`、`ghidra_decompiler_memory` 或 `ghidra_callsite_facts` 进行收窄。
### 分析工具
- `entropy_profile` 评估节区熵和加壳可能性。
- `compiler_packer_detect` 识别编译器、运行时、加壳程序和保护程序提示。
- `crypto_detect` 扫描字节以查找常见的加密常量。
- `dll_export_profile` 分析 DLL 导出、调度形状、生命周期提示和插件/宿主指示符。
`rbm-analysis` crate 还包含用于 MBA 简化和 VM 字节码/操作码分析的可重用 Rust 辅助工具。除非投影对活跃的二进制处理工作有用,否则这些内部结构将保留在专用的 MCP 工具之后。
### AI-Agent 可用性和参考辅助工具
这些工具被刻意保留,尽管它们本身不是二进制分析工具,但它们可以在使用和维护 `rbinmcp` 时降低上下文成本:
- 工具发现:`list_tools`、`lookup_tool`、`lookup_r2_cmd` 和 `get_workflow`
- 运行时帮助:`get_backend_status`、`get_architecture`、`get_ghidra_info` 和 `lookup_error`
- 源码导航:`get_repo_overview`、`get_crate_overview`、`get_module_overview`、`get_file_overview`、`get_test_overview`、`search_repo_functions`、`search_repo_types`、`search_repo_tests`、`search_tool_handlers` 和 `suggest_validation`
- 参考索引:`get_ghidra_reference_info`、`refresh_ghidra_reference`、`lookup_ghidra_reference`、`get_r2_reference_info`、`refresh_r2_reference` 和 `lookup_r2_reference`
在更改 Ghidra Java 脚本、r2 命令投影或特定于后端的假设之前,请使用参考辅助工具。
## 架构
该仓库是一个 Rust workspace:
- `crates/rbm-server` - MCP 服务器、工具注册、轻量级 MCP 适配器和跨后端服务
- `crates/rbm-core` - 配置、缓存路径、常见错误、输出保护和共享实用工具类型
- `crates/rbm-r2` - 基础 radare2 会话、命令、元数据、反汇编、搜索、追踪和投影逻辑
- `crates/rbm-ghidra` - Ghidra 项目缓存、`analyzeHeadless` 编排、热路径提取器和类型化结果模型
- `crates/rbm-native` - 原生工具和子进程执行的包装器
- `crates/rbm-static` - 通过 `goblin` 进行静态 PE/ELF/Mach-O 解析
- `crates/rbm-analysis` - 纯 Rust 分析辅助工具和结构化二进制启发式规则
- `ghidra_scripts/` - Ghidra 热路径工具使用的 Java postScripts
在 `rbm-server` 中,`src/tools/*_live.rs` 应保持精简。工具负责处理适配 MCP 参数和错误。跨后端编排归属于 `src/services/`。后端 crate 拥有基础执行和分析逻辑。
## 安装
必需项:
- Rust stable 1.85 或更新版本
可选的运行时后端:
- 用于 `r2_*` 工具的 `radare2`
- 用于 `ghidra_*` 工具的 Ghidra
- 用于原生包装器的 `file`、`strings`、`objdump` 和 `radiff2`
构建 release 服务器:
```
git clone https://github.com/kirkderp/rbinmcp.git
cd rbinmcp
cargo build --release --bin rbm-server
```
构建的二进制文件位于:
```
target/release/rbm-server
```
可选的本地安装:
```
cargo install --path crates/rbm-server
```
## 运行
`rbm-server` 目前支持 stdio 传输:
```
target/release/rbm-server --transport stdio --log-level info
```
用于本地开发:
```
cargo run --release --bin rbm-server -- --transport stdio --log-level debug
```
通用 MCP 客户端命令:
```
{
"command": "/absolute/path/to/rbinmcp/target/release/rbm-server",
"args": ["--transport", "stdio", "--log-level", "info"]
}
```
## 配置
环境变量:
- `RBINMCP_CACHE_DIR` - 覆盖缓存根目录
- `GHIDRA_INSTALL_DIR` - Ghidra 安装根目录
- `RBINMCP_GHIDRA_SCRIPTS_DIR` - 覆盖捆绑的脚本目录
- `RBINMCP_GHIDRA_TIMEOUT` - 标准 Ghidra 调用超时(以秒为单位),默认为 `60`
- `RBINMCP_GHIDRA_IMPORT_TIMEOUT` - Ghidra 导入超时(以秒为单位),默认为 `900`
- `RBINMCP_R2_OPEN_TIMEOUT` - radare2 打开超时(以秒为单位),默认为 `120`
- `RBINMCP_NATIVE_TIMEOUT` - 原生工具超时(以秒为单位),默认为 `60`
默认的缓存根目录是平台用户缓存目录加上 `rbinmcp`,除非设置了 `RBINMCP_CACHE_DIR`。
缓存内容:
- `overflow/` 用于由输出保护写入的大型 MCP 响应
- `ghidra/` 用于按 SHA-256 划分的 Ghidra 项目
- `r2_sessions/` 用于 r2 会话状态
- `tmp/` 用于临时工具文件
## 推荐工作流
快速分类:
1. `get_backend_status`
2. `file_identify`
3. `triage_binary`
4. 带有 `mode=info` 的 `static_view`
5. `strings_extract`
r2 函数分析:
1. `r2_open`
2. 带有 `mode=functions` 的 `r2_metadata`
3. 带有 `mode=analyze` 的 `r2_function_view`
4. 带有 `mode=cfg` 或 `mode=refs` 的 `r2_function_view`
5. 仅在缩小目标范围后使用 `r2_disassemble` 或 `r2_decompile`
Ghidra 反编译器工作流:
1. `ghidra_check`
2. `ghidra_import`
3. `ghidra_project_binaries`
4. 带有 `mode=functions` 的 `ghidra_inventory`
5. `ghidra_decompiler_calls`
6. `ghidra_callsite_facts` 获取基于精确列表调用设置
7. 当反编译器 CFG 无效、超时或过度变形时使用 `ghidra_cfg`
加壳或分阶段二进制文件工作流:
1. `entropy_profile`
2. `binwalk_scan`
3. `compiler_packer_detect`
4. `r2_path_digest` 或 `ghidra_path_digest`
5. 当怀疑存在哈希/API 调度程序时使用 `ghidra_dynamic_dispatch_table`
二进制比较工作流:
1. 对两个文件执行 `file_identify`
2. 带有 `mode=code` 的 `binary_diff`
3. 带有 `mode=graph` 的 `binary_diff`
4. 带有 `mode=bytes` 的 `binary_diff`
维护工作流:
1. `get_repo_overview`
2. 针对工具名称使用 `search_tool_handlers`
3. 在编辑前使用 `get_file_overview`
4. 使用 `suggest_validation` 选择测试
5. 在更改特定于后端的 API 之前使用 `lookup_ghidra_reference` 或 `lookup_r2_reference`
## 开发
核心检查:
```
cargo fmt --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps
```
构建所有 workspace crate:
```
cargo build --workspace
```
仅在安装了匹配的外部后端时运行被忽略的集成套件:
```
cargo test -p rbm-r2 --features integration-r2 -- --ignored
cargo test -p rbm-ghidra --features integration-ghidra -- --ignored
```
该 workspace 使用严格的 linting:
- Rust edition 2024
- 拒绝 `clippy::all`、`clippy::pedantic`、`clippy::nursery` 和 `clippy::cargo`
- 拒绝 `dbg!`、`todo!`、`unimplemented!`、未记录文档的 unsafe 块以及 unsafe 函数中的 unsafe 操作
- 允许 `multiple_crate_versions`,因为所需的工具 crate 当前会拉取不兼容的传递依赖线
## 设计原则
公共 MCP 接口针对 AI agent 的二进制分析进行了优化。工具应生成紧凑、确定性的证据,这些证据可以链接到后续调用中,而无需强制客户端读取无限制的载荷。
- 首选聚焦的投影,而不是原始的后端转储
- 保持 schema 稳定和累加
- 对大型结果使用摘要、计数、预览和分页
- 当仍然需要特定于后端的命令时,保留 `r2_cmd` 等应急出口
- 保持源码导航和参考查找足够廉价,以便在活跃的维护期间使用
## 安全与许可
- 安全报告:参见 [SECURITY.md](SECURITY.md)
- 许可证:[MIT](LICENSE)
标签:binwalk, CFG控制流图, CMS检测, DLL 劫持, ELF解析, Ghidra, LLM安全工具, Mach-O解析, MBA化简, MCP服务器, PE解析, radare2, Rust语言, URL提取, Wayback Machine, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 交叉引用, 人工智能代理, 反汇编, 反编译, 可视化界面, 大语言模型, 密码学常数识别, 文件比对, 混淆分析, 熵分析, 网络安全, 虚拟机字节码, 逆向工程, 通知系统, 隐私保护, 静态分析