hoho087/rev-calc-mcp
GitHub: hoho087/rev-calc-mcp
一个面向 LLM 的 MCP 服务器,为逆向工程、二进制分析和安全研究提供确定性计算工具集,弥补大模型在底层二进制运算上的不足。
Stars: 0 | Forks: 0
# rev-calc-mcp
一个模型上下文协议(MCP)服务器,为大型语言模型提供确定性的逆向工程、二进制分析、漏洞利用和安全研究计算。
这个项目在理念上与 [`math-mcp`](https://github.com/EthanHenrickson/math-mcp) 类似,但侧重于 AI 助手在推理二进制文件、补丁、地址、编码、Windows 常量、校验和和漏洞利用开发原语时经常出错的计算。
## 功能特性
- 整数打包/解包、有符号转换和符号扩展
- 地址对齐和页偏移辅助工具
- PE VA/RVA/文件偏移映射和 PE 节解析
- 相对分支位移计算
- 为 jumps、calls、NOPs、INT3 和 RET 生成补丁字节
- 通过 `iced-x86` 进行 x86/x64 反汇编和内联 Hook 可行性检查
- 位段提取和标志位解码
- Windows 常量解码,包括 PAGE 标志、PE 节标志、IOCTL、NTSTATUS、HRESULT 和 Win32 错误
- Pwn 辅助工具,用于循环模式、打包/解包、基地址计算、坏字符、glibc safe-linking、chunk 大小和 tcache 索引
- hex、base64、URL 编码、UTF-16LE、XOR 和单字节 XOR 暴力破解的编码辅助工具
- 哈希、熵、CRC32 和 internet 校验和辅助工具
## 面向 LLM 的设计说明
该服务器有意设计得严格且明确,以便 AI 代理能够可靠地调用工具。
- 大整数应作为字符串传递,例如 `"0x7ff612341000"` 或 `"18446744073709551615"`。
- 字节数组表示为十六进制字符串,例如 `"48 8b 05 18 57 0a 00"` 或 `"488b0518570a00"`。
- 工具名使用下划线而不是点,例如 `integer_pack_int` 而不是 `core.integer.pack_int`,以提供更好的 MCP 客户端兼容性。
- 输出为 JSON 格式的文本,通常包含十进制和十六进制形式。
- 反汇编工具在相关处需要明确的 `bitness`(位数):`16`、`32` 或 `64`。
## 安装
将此仓库克隆或放置在您机器上的某个位置,然后安装依赖并构建:
```
cd D:\mcp-dev\rev-calc-mcp
npm.cmd install
npm.cmd run build
```
## MCP 配置
将服务器添加到您的 MCP 客户端配置中。
TOML 配置示例:
```
[mcp_servers.rev_calc]
command = "node"
args = ["D:\\mcp-dev\\rev-calc-mcp\\build\\index.js"]
```
JSON 样式配置示例:
```
{
"rev_calc": {
"command": "node",
"args": ["D:\\mcp-dev\\rev-calc-mcp\\build\\index.js"]
}
}
```
将路径替换为系统中此项目的实际路径。
## 开发
```
npm.cmd run build
npm.cmd test
npm.cmd run dev
```
## 可用工具
### Integer 工具
| 工具 | 描述 | 主要参数 |
|---|---|---|
| `integer_pack_int` | 将整数打包为选定位宽和端序的字节 | `value`, `bits`, `endian`, `signed` |
| `integer_unpack_int` | 将字节解包为有符号或无符号整数 | `bytes`, `endian`, `signed` |
| `integer_to_signed` | 将无符号值解释为有符号的 N 位整数 | `value`, `bits` |
| `integer_to_unsigned` | 将有符号值转换为 N 位无符号表示 | `value`, `bits` |
| `integer_sign_extend` | 将较小的有符号整数符号扩展为更大的位宽 | `value`, `from_bits`, `to_bits` |
示例:
```
{
"tool": "integer_pack_int",
"arguments": {
"value": "0x12345678",
"bits": 32,
"endian": "little"
}
}
```
预期结果包含:
```
{
"bytes_hex": "78 56 34 12",
"value_hex": "0x12345678"
}
```
### Alignment 工具
| 工具 | 描述 | 主要参数 |
|---|---|---|
| `align_up` | 向上对齐到边界 | `value`, `alignment` |
| `align_down` | 向下对齐到边界 | `value`, `alignment` |
| `page_base` | 获取包含该地址的页的基地址 | `address`, `page_size` |
| `page_offset` | 获取地址在页内的偏移量 | `address`, `page_size` |
示例:`page_offset("0x12345678")` 返回 `0x678`。
### Address 和 PE 工具
| 工具 | 描述 | 主要参数 |
|---|---|---|
| `address_va_to_rva` | 将 VA 转换为 RVA | `va`, `image_base` |
| `address_rva_to_va` | 将 RVA 转换为 VA | `rva`, `image_base` |
| `address_rva_to_file_offset` | 使用节表将 PE RVA 映射到文件偏移 | `rva`, `sections`, `strict`, `size_of_headers` |
| `address_file_offset_to_rva` | 使用节表将 PE 文件偏移映射到 RVA | `file_offset`, `sections`, `size_of_headers` |
| `address_va_to_file_offset` | 使用映像基址和节表将 VA 映射到文件偏移 | `va`, `image_base`, `sections`, `strict`, `size_of_headers` |
| `address_pe_parse_sections` | 从文件字节解析 PE 头和节表 | `file` |
Section 对象使用此结构:
```
{
"name": ".text",
"virtualAddress": "0x1000",
"virtualSize": "0x6000",
"rawDataPtr": "0x400",
"rawDataSize": "0x6000"
}
```
### Branch 工具
| 工具 | 描述 | 主要参数 |
|---|---|---|
| `branch_rel8` | 计算有符号 8 位相对位移 | `src`, `target`, `instr_len` |
| `branch_rel32` | 计算有符号 32 位相对位移 | `src`, `target`, `instr_len` |
| `branch_check_rel_range` | 检查目标是否可通过 rel8 或 rel32 到达 | `src`, `target`, `bits`, `instr_len` |
对于 x86/x64 `call rel32` 和 `jmp rel32`,默认指令长度为 `5`。
### Patch 工具
| 工具 | 描述 | 主要参数 |
|---|---|---|
| `patch_make_jmp_rel32` | 生成 `E9 + rel32` 跳转字节 | `src`, `target` |
| `patch_make_call_rel32` | 生成 `E8 + rel32` 调用字节 | `src`, `target` |
| `patch_make_nop` | 生成 NOP 字节;支持 Intel 多字节 NOP | `length`, `style` |
| `patch_make_int3` | 生成 `0xCC` 断点字节 | `length` |
| `patch_make_ret` | 生成 `C3` | 无 |
| `patch_make_ret_imm16` | 生成 `C2 imm16` | `imm16` |
| `patch_make_jmp_abs64` | 生成 `mov rax, imm64; jmp rax` | `target` |
| `patch_make_call_abs64` | 生成 `mov rax, imm64; call rax` | `target` |
注意:`patch_make_jmp_abs64` 和 `patch_make_call_abs64` 会破坏 `RAX`。
### 反汇编和 Inline Hook 工具
| 工具 | 描述 | 主要参数 |
|---|---|---|
| `disasm_disasm_bytes` | 使用 `iced-x86` 反汇编 x86/x64 字节 | `bytes`, `bitness`, `ip`, `syntax` |
| `disasm_instruction_lengths` | 解码指令长度 | `bytes`, `bitness`, `ip` |
| `disasm_calc_overwrite_len` | 计算给定补丁长度需要覆盖多少条完整指令 | `instruction_lengths`, `patch_length` |
| `disasm_check_patch_boundary` | 检查补丁是否会截断指令 | `instruction_lengths`, `patch_length` |
| `disasm_analyze_inline_hook_basic` | 分析 rel32 可达性、覆盖长度、指令边界、RIP 相对风险以及分支/调用重定位风险 | `src`, `target`, `bytes`, `instruction_lengths`, `bitness`, `patch_length` |
示例:
```
{
"tool": "disasm_analyze_inline_hook_basic",
"arguments": {
"src": "0x1000",
"target": "0x2000",
"bytes": "48 8b 05 18 57 0a 00 90",
"bitness": 64,
"patch_length": 5
}
}
```
这可以检测到被覆盖的指令是 RIP 相对的,可能需要进行 Trampoline 重定位。
### Bit 工具
| 工具 | 描述 | 主要参数 |
|---|---|---|
| `bits_bit_test` | 检查是否设置了某一位 | `value`, `bit` |
| `bits_extract_bits` | 从整数中提取位段 | `value`, `start`, `length` |
| `bits_decode_flags` | 使用调用方提供的标志表解码位掩码 | `value`, `flags` |
### Windows 工具
| 工具 | 描述 | 主要参数 |
|---|---|---|
| `windows_decode_page_protection` | 解码 Windows `PAGE_*` 内存保护常量 | `value` |
| `windows_decode_section_characteristics` | 解码 PE 节特征 | `value` |
| `windows_decode_ioctl` | 解码 Windows IOCTL / `CTL_CODE` 值 | `code` |
| `windows_encode_ioctl` | 编码 Windows IOCTL / `CTL_CODE` 值 | `device_type`, `function`, `method`, `access` |
| `windows_decode_memory_allocation_type` | 解码 Windows `MEM_*` 分配/类型常量 | `value` |
| `windows_decode_file_access` | 解码文件访问和通用访问掩码标志 | `value` |
| `windows_decode_ntstatus` | 解码 NTSTATUS 的 severity、facility、code 和常见名称 | `value` |
| `windows_decode_hresult` | 解码 HRESULT 的 severity、facility、code 和常见名称 | `value` |
| `windows_decode_win32_error` | 解码常见的 Win32 错误码 | `value` |
示例:`windows_decode_ioctl("0x222003")` 解码 `DeviceType`、`Function`、`Method` 和 `Access`。
### Pwn 工具
| 工具 | 描述 | 主要参数 |
|---|---|---|
| `pwn_cyclic_create` | 创建 Metasploit 风格的循环模式 | `length` |
| `pwn_cyclic_find` | 在 Metasploit 风格的循环模式中查找偏移 | `needle`, `max_length`, `endian` |
| `pwn_cyclic_create_de_bruijn` | 创建 De Bruijn 循环模式 | `length`, `alphabet`, `n` |
| `pwn_cyclic_find_de_bruijn` | 在 De Bruijn 循环模式中查找偏移 | `needle`, `max_length`, `alphabet`, `n`, `endian` |
| `pwn_calc_base` | 从泄漏地址和符号偏移计算模块基地址 | `leak_addr`, `symbol_offset` |
| `pwn_calc_symbol_addr` | 从基地址和偏移计算符号地址 | `base`, `symbol_offset` |
| `pwn_badchar_check` | 检查 payload 中的坏字符 | `payload`, `badchars` |
| `pwn_safe_linking_encode` | 编码 glibc safe-linking 指针 | `ptr`, `pos` |
| `pwn_safe_linking_decode` | 解码 glibc safe-linking 指针 | `encoded`, `pos` |
| `pwn_p32` | 将整数打包为小端序 uint32 | `value` |
| `pwn_p64` | 将整数打包为小端序 uint64 | `value` |
| `pwn_u32` | 解包小端序 uint32 | `bytes`, `signed` |
| `pwn_u64` | 解包小端序 uint64 | `bytes`, `signed` |
| `pwn_glibc_chunk_size` | 为请求大小计算 glibc malloc chunk 大小 | `request`, `ptr_size` |
| `pwn_glibc_tcache_index` | 计算 glibc tcache bin 索引 | `size`, `input_kind`, `ptr_size` |
| `pwn_one_gadget_constraint_helper` | one_gadget 约束的检查清单辅助工具 | `constraints`, `known_facts` |
### 编码工具
| 工具 | 描述 | 主要参数 |
|---|---|---|
| `encoding_hex_encode` | 将文本、hex 或 base64 输入转换为 hex | `input`, `input_format`, `text_encoding` |
| `encoding_hex_decode` | 将 hex 输入转换为文本、hex 或 base64 | `hex`, `output_format`, `text_encoding` |
| `encoding_base64_encode` | 将文本、hex 或 base64 输入转换为 base64 | `input`, `input_format`, `text_encoding` |
| `encoding_base64_decode` | 将 base64 输入转换为文本、hex 或 base64 | `base64`, `output_format`, `text_encoding` |
| `encoding_url_encode` | URL 编码文本 | `text` |
| `encoding_url_decode` | URL 解码文本 | `text` |
| `encoding_utf16le_decode` | 从 hex 解码 UTF-16LE 字节 | `hex` |
| `encoding_xor_with_key` | 使用重复密钥对数据进行或 (XOR) | `data`, `key` |
| `encoding_xor_single_byte_bruteforce` | 暴力破解单字节 XOR 并对候选结果排序 | `data`, `top` |
示例:
```
{
"tool": "encoding_base64_encode",
"arguments": {
"input": "6869",
"input_format": "hex"
}
}
```
预期输出包含 `"base64": "aGk="`。
### Data 工具
| 工具 | 描述 | 主要参数 |
|---|---|---|
| `data_hash_data` | 使用 MD5、SHA1 或 SHA256 对输入字节进行哈希 | `data`, `algorithm` |
| `data_hash_file` | 使用 MD5、SHA1 或 SHA256 对本地文件进行哈希 | `path`, `algorithm` |
| `data_entropy` | 计算字节的香农熵 | `data` |
| `data_crc32` | 计算 CRC32 | `data` |
| `data_internet_checksum` | 计算反码 internet 校验和 | `data` |
## 安全提示
`data_hash_file` 会读取调用方提供的路径。这对于本地逆向工程工作流非常有用,但如果您将此服务器公开给不受信任的客户端,请考虑将文件读取限制在允许的工作区内。
## 当前范围
此 MCP 服务器旨在提供计算和分析原语。它不会尝试自行利用目标、修改磁盘上的二进制文件或附加到进程。
当前的反汇编支持侧重于通过 `iced-x86` 进行 x86/x64 反汇编。ARM、MIPS 和 RISC-V 等其他架构将需要额外的后端,例如 Capstone。
## 致谢
- [`iced-x86`](https://github.com/icedland/iced) / [`iced-x86` 的 npm 版本](https://www.npmjs.com/package/iced-x86):用作 `disasm_disasm_bytes`、`disasm_instruction_lengths` 和 inline hook 分析辅助工具的 x86/x64 反汇编后端。
- [`math-mcp`](https://github.com/EthanHenrickson/math-mcp):为 AI 助手构建小型、确定性的 MCP 计算工具的灵感来源。
标签:AI安全, Chat Copilot, CRC32, DLL 劫持, Exploit, LLM工具, MCP, MITM代理, PE文件解析, Pwn, ROP链, TypeScript, Windows常量, x64, x86, 二进制分析, 二进制安全, 云安全运维, 云资产清单, 偏移量计算, 哈希计算, 地址对齐, 大语言模型, 子域名变形, 安全插件, 密码学, 手动系统调用, 模型上下文协议, 汇编分析, 漏洞分析, 漏洞利用开发, 编码解码, 网络安全, 网络校验和, 自动化攻击, 补丁生成, 路径探测, 逆向工程, 隐私保护