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, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 交叉引用, 人工智能代理, 反汇编, 反编译, 可视化界面, 大语言模型, 密码学常数识别, 文件比对, 混淆分析, 熵分析, 网络安全, 虚拟机字节码, 逆向工程, 通知系统, 隐私保护, 静态分析