kirkderp/rbinr2
GitHub: kirkderp/rbinr2
rbinr2 是一个基于 Rust 和 radare2 的 MCP 服务器,将 39 个二进制静态分析工具标准化暴露给 MCP 客户端调用。
Stars: 5 | Forks: 0
# rbinr2
`rbinr2` 是一个基于 radare2 的 Model Context Protocol 服务器,用于二进制分析。
它作为 stdio MCP 服务器运行,在持久的 radare2 会话中打开二进制文件,并为元数据、反汇编、搜索、交叉引用 (xrefs)、字节提取、图形化和静态分诊提供命名工具。
其目标使用场景是从 MCP 客户端进行可重复的静态分析。为这些工具提供一个绝对的二进制文件路径以及一个地址、符号、标志或搜索模式。`rbinr2` 会保持 radare2 会话打开,直到您关闭它或服务器退出。
## 环境要求
- Rust 1.88 或更新版本
- `PATH` 中存在 radare2 5.9 或更新版本
- 一个能够运行 stdio 服务器的 MCP 客户端
检查运行时依赖项:
```
r2 -v
```
针对 `r2_decompile mode=code` 的可选反编译器支持,需要 r2 反编译器插件(例如 `r2ghidra` 或 `r2dec`)。`mode=meta` 无需这些插件即可工作。
## 安装
从本地检出版本构建:
```
git clone https://github.com/kirkderp/rbinr2
cd rbinr2
cargo install --path crates/rbm-server --locked
```
从 git 仓库构建:
```
cargo install --git https://github.com/kirkderp/rbinr2 --package rbm-server --locked
```
安装后的可执行文件名为 `rbinr2`。
直接运行:
```
RBM_CACHE_DIR=./rbinr2-cache rbinr2
```
该进程会通过 stdin 等待 MCP JSON-RPC 消息,并将响应写入 stdout。
## MCP 配置
stdio 服务器配置示例:
```
{
"mcpServers": {
"rbinr2": {
"command": "/absolute/path/to/rbinr2",
"args": [],
"env": {
"RBM_CACHE_DIR": "/absolute/path/to/rbinr2-cache"
}
}
}
}
```
为 `command` 使用绝对路径。当客户端可能会从不同的工作目录启动服务器时,请为 `RBM_CACHE_DIR` 使用绝对路径。
## 工作原理
```
MCP client
-> stdio JSON-RPC
-> rbinr2
-> one persistent radare2 process per binary
-> bounded r2 commands
-> JSON/text tool responses
```
`rbinr2` 会对二进制文件路径进行规范化处理,并在后续调用中复用同一个 radare2 会话。针对某个二进制文件的首次调用会执行 radare2 的启动分析。后续调用将使用已有的会话。
使用 `r2_close` 可关闭某个二进制文件会话。使用 `r2_sessions` 可列出所有打开的会话。
## 工具调用示例
MCP 客户端通过名称调用工具。以下示例展示了工具的调用参数。
使用 `r2_open` 打开二进制文件:
```
{
"binary_path": "/absolute/path/to/sample.exe"
}
```
使用 `r2_metadata` 读取二进制元数据:
```
{
"binary_path": "/absolute/path/to/sample.exe",
"mode": "info"
}
```
使用 `r2_metadata` 列出函数:
```
{
"binary_path": "/absolute/path/to/sample.exe",
"mode": "functions",
"limit": 25
}
```
使用 `r2_function_view` 检查函数:
```
{
"binary_path": "/absolute/path/to/sample.exe",
"addr": "entry0",
"mode": "profile"
}
```
使用 `r2_extract_bytes` 提取字节而无需写入文件:
```
{
"binary_path": "/absolute/path/to/sample.exe",
"addr": "entry0",
"count": 256
}
```
使用 `r2_close` 关闭会话:
```
{
"binary_path": "/absolute/path/to/sample.exe"
}
```
## 配置
| 变量 | 默认值 | 描述 |
| --- | --- | --- |
| `RBM_CACHE_DIR` | `./rbinr2-cache` | 用于受保护的溢出输出的缓存根目录。 |
| `RBM_R2_OPEN_TIMEOUT` | `120` | 打开新 radare2 会话的超时时间(秒)。 |
| `RBM_TOOL_TIMEOUT_SECS` | `30` | 执行每个 radare2 命令的超时时间(秒)。 |
## 工具参考
`rbinr2` 提供了 39 个 MCP 工具。
### 会话
| 工具 | 用途 |
| --- | --- |
| `r2_open` | 打开二进制文件并启动持久化的 radare2 会话。 |
| `r2_close` | 关闭单个二进制文件会话。 |
| `r2_sessions` | 列出已打开的会话。 |
### 元数据
| 工具 | 用途 |
| --- | --- |
| `r2_metadata` | 基于模式的元数据:信息、头信息、版本信息、入口点、区段、重定位、资源、库、导入、导出、符号、字符串以及函数。 |
| `r2_classes` | 列出类或检查单个类。 |
| `r2_vtables` | 通过 `avj` 返回有边界的原生 vtable 发现结果。 |
| `r2_types` | 读取 r2 类型系统数据:列表、函数、结构体、枚举、联合体、typedef、C 声明、视图、格式、强制转换、交叉引用、链接以及调用约定。 |
| `r2_imports_grouped` | 在 r2 提供调用方数据时,按使用类别对导入进行分组。 |
| `r2_plugins` | 列出 r2 的 asm、analysis、binary、hash 和反编译器功能。 |
| `r2_flags` | 读取标志、真实名称或标志空间,并支持过滤和分页。 |
| `r2_lookup_address` | 将地址解析为其标志、符号、模块和所属函数。 |
| `r2_address_info` | 通过 `aij` 返回 r2 的地址分类元数据。 |
| `r2_calculate` | 计算 r2 数学表达式,并返回十六进制、十进制和二进制结果。 |
### 反汇编
| 工具 | 用途 |
| --- | --- |
| `r2_disassemble` | 以 JSON 或文本形式反汇编有边界的指令窗口或包含指令的函数。 |
| `r2_opcodes` | 通过 `aoj` 返回结构化的操作码分析行。 |
| `r2_decompile` | 返回反编译器输出或精简的反编译器元数据。 |
| `r2_function_view` | 检查函数:分析、信息、签名、变量、配置、字符串、常量、被调用者、引用或控制流图 (cfg)。 |
| `r2_graph` | 导出原生的 r2 图表,包括函数、调用图、导入、引用、交叉引用和数据引用。 |
### 字节
| 工具 | 用途 |
| --- | --- |
| `r2_get_bytes` | 以十六进制字符串形式读取原始字节。 |
| `r2_extract_bytes` | 提取有边界的字节范围,包含 SHA-256、十六进制/ascii 预览、查找数据以及区段/文件偏移映射。 |
| `r2_block_hash` | 计算有边界的 r2 `ph` 哈希或熵值。 |
| `r2_pointer_scan` | 使用 `pxrj` 从有边界的内存范围中读取指针/类引用字。 |
| `r2_string_at` | 将指定地址处的字符串解码为 auto、ascii、utf16、utf32 或 pascal 格式。 |
### 搜索
| 工具 | 用途 |
| --- | --- |
| `r2_find` | 搜索函数、字符串、导入或字节。 |
| `r2_semantic_search` | 执行有边界的操作码类型、反汇编文本、宽字符串、数值、引用、ROP 或十六进制搜索。 |
| `r2_find_xrefs` | 在一次有边界的遍历中搜索并解析每个命中结果的交叉引用。 |
### 交叉引用与流
| 工具 | 用途 |
| --- | --- |
| `r2_xrefs` | 获取指向或来自于某个地址的交叉引用。 |
| `r2_global_xrefs` | 返回分页的全局交叉引用清单。 |
| `r2_trace_data_flow` | 在限定深度内正向或逆向遍历交叉引用。 |
| `r2_var_xrefs` | 通过 `afvxj` 列出函数变量的读/写交叉引用。 |
| `r2_esil_accesses` | 汇总基于 ESIL 推导的寄存器和内存访问。 |
| `r2_value_trace` | 在有边界的反汇编窗口中追踪种子寄存器或内存的值。 |
### 静态分诊
| 工具 | 用途 |
| --- | --- |
| `r2_security` | 返回 checksec 风格的加固字段或每个区段的熵值。 |
| `r2_path_digest` | 汇总在有限定边界的执行路径上的分支、调用、常量、标记、局部缓冲区和状态写入。 |
| `r2_artifact_summary` | 汇总解码后的分支工件、字符串、调用点和不支持的分支。 |
| `r2_field_xrefs` | 映射带有符号根追踪的原始内存字段引用。 |
| `r2_jump_table_slices` | 汇总计算得出的跳转表目标。 |
| `r2_windows_driver_dispatch` | 从 init 例程中恢复 Windows `DRIVER_OBJECT` 分发和通知回调锚点。 |
### 原始 r2 查询
| 工具 | 用途 |
| --- | --- |
| `r2_cmd` | 在输出受保护的前提下,执行单个只读的 r2 查询命令。 |
`r2_cmd` 会拒绝命令分隔符、shell 转义、写入、寻址和 eval 设置变更。如果有对应的命名工具,请优先使用命名工具。
## 使用说明
- `binary_path` 必须是绝对路径。
- 地址参数接受数字地址、符号和 r2 标志。
- 大多数工具在调用 r2 之前会对计数和限制进行钳制(限制范围)。
- `r2_extract_bytes` 返回字节、哈希、预览和映射数据。它不会将提取的字节写入磁盘。
- `r2_decompile mode=code` 依赖于已安装的 r2 反编译器插件。使用 `mode=meta` 获取不依赖插件的元数据。
- `r2_cmd` 仅用于只读查询。在常规工作流中请使用命名工具。
## 开发
构建并测试:
```
cargo fmt --check
cargo clippy --workspace --all-targets --locked -- -D warnings
cargo test --workspace --locked
```
从源码运行:
```
RBM_CACHE_DIR=./rbinr2-cache cargo run --bin rbinr2
```
全新本地安装:
```
cargo install --path crates/rbm-server --locked
```
## 项目结构
```
crates/
rbm-server/ MCP server, radare2 session management, and tool implementations
```
## 许可证
MIT。详见 [LICENSE](LICENSE)。
标签:MCP服务器, radare2, Rust, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 可视化界面, 网络流量审计, 逆向工程, 通知系统, 静态分析