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, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 可视化界面, 网络流量审计, 逆向工程, 通知系统, 静态分析