drvova/pi-reverse

GitHub: drvova/pi-reverse

一个零依赖的静态二进制逆向分析 MCP 服务器,支持多格式解析、反汇编、伪代码生成及恶意软件能力检测。

Stars: 3 | Forks: 1

pi

pi-reverse

面向 pi agent 的静态二进制逆向工程 MCP 服务器。

## 功能 ### 格式检测与解析 | 格式 | Magic | Sections | Imports | Exports | 反汇编 | 伪代码 | 源码重建 | |---|---|---|---|---|---|---|---| | ELF 32-bit | `\x7fELF` (class 1) | yes | `.so` 引用 | — | x86 伪反汇编 | 类 C | C stub | | ELF 64-bit | `\x7fELF` (class 2) | yes | `.so` 引用 | — | x86 伪反汇编 | 类 C | C stub | | PE 32-bit | `MZ` + `PE\0\0` (machine 0x14c) | yes | IAT (DLL + 函数) | — | x86 伪反汇编 | 类 C | C stub | | PE 64-bit | `MZ` + `PE\0\0` (machine 0x8664) | yes | IAT (DLL + 函数) | — | x86 伪反汇编 | 类 C | C stub | | Mach-O | `\xFE\xED\xFA` / `\xCE\xFA\xED` | detected | — | — | — | — | — | | Java .class | `\xCA\xFE\xBA\xBE` | yes | class 引用 | — | JVM bytecode (200+ opcodes) | 类 Java | .java | | JAR / J2ME | `PK\x03\0x04` + `.jar` | entries | manifest + 引用 | — | JVM bytecode (200+ opcodes) | 类 Java | .java | | JAD | `.jad` 扩展名 | — | metadata | — | — | — | — | | Raw / 未知 | fallback | — | — | — | x86 伪反汇编 | 类 C | C stub | ### 架构检测 | 架构 | ELF | PE | |---|---|---| | x86 | 0x03 | 0x014c | | x86_64 | 0x3e | 0x8664 | | ARM | 0x28 | 0x01c0 | | AArch64 | 0xb7 | 0xaa64 | | MIPS | 0x08 | — | | RISC-V | 0xf3 | — | ### Section 解析 - Section 名称、虚拟地址、文件偏移量、大小、标志 (W/A/X) - 每个 section 的熵值计算 - 可写+可执行 section 检测(loader、unpacker、JIT、shellcode staging) - 高熵 section 检测(> 7.2 = 加壳/压缩/固件 blob) - 可执行代码区域识别 - 通过虚拟地址和文件偏移量提取 section 字节 ### Import 提取 - ELF:共享库引用(来自 `.dynstr` 的 `.so` 字符串) - PE:导入地址表(来自 IAT 的 DLL 名称 + 函数名称) - Java:来自常量池的 class 引用 - JAR:manifest metadata + 所有 class 引用 ### 字符串提取 - ASCII 字符串(4+ 个可打印字符) - UTF-16LE 字符串(4+ 个可打印字符) - 可配置的最大数量(`max_strings` 参数) ### 熵分析 - 滑动窗口熵值(256 字节窗口,香农熵) - 每个 section 的熵值 - 加壳/加密检测阈值(> 7.4 = 可能已加壳/加密) - 用于可视化熵值分布的熵窗口映射 ### 反汇编 **x86/x86_64 伪反汇编器**(34 个 opcodes): - 算术:`add`, `sub`, `xor`, `and`, `or`, `inc`, `dec`, `neg`, `mul`, `div`, `imul` - 栈:`push`, `pop`, `mov`, `lea` - 控制流:`jmp`, `je`, `jne`, `jl`, `jle`, `jg`, `jge`, `jb`, `jbe`, `ja`, `jae`, `call`, `ret`, `nop` - 内存:`int3`, `int 0x80`, `syscall`, `leave` - 寄存器与立即数操作数解码 - 地址标注 **JVM bytecode 反汇编器**(200+ 个 opcodes): - 常量:nop, aconst_null, iconst_*, lconst_*, fconst_*, dconst_*, bipush, sipush, ldc, ldc_w, ldc2_w - 加载:iload*, lload*, fload*, dload*, aload*, iaload, laload, faload, daload, aaload, baload, caload, saload - 存储:istore*, lstore*, fstore*, dstore*, astore*, iastore, lastore, fastore, dastore, aastore, bastore, castore, sastore - 栈:pop, pop2, dup, dup_x1, dup_x2, dup2, dup2_x1, dup2_x2, swap - 算术:iadd, ladd, fadd, dadd, isub, lsub, fsub, dsub, imul, lmul, fmul, dmul, idiv, ldiv, fdiv, ddiv, irem, lrem, frem, drem, ineg, lneg, fneg, dneg, ishl, lshl, ishr, lshr, iushr, lushr, iand, land, ior, lor, ixor, lxor, iinc - 转换:i2l, i2f, i2d, l2i, l2f, l2d, f2i, f2l, f2d, d2i, d2l, d2f, i2b, i2c, i2s - 比较:lcmp, fcmpl, fcmpg, dcmpl, dcmpg - 分支:ifeq, ifne, iflt, ifge, ifgt, ifle, if_icmpeq, if_icmpne, if_icmplt, if_icmpge, if_icmpgt, if_icmple, if_acmpeq, if_acmpne, goto, jsr, ret, tableswitch, lookupswitch, ifnull, ifnonnull - 方法调用:invokevirtual, invokespecial, invokestatic, invokeinterface, invokedynamic - 对象:new, newarray, anewarray, arraylength, athrow, checkcast, instanceof, monitorenter, monitorexit - Wide, multianewarray, ifnull, ifnonnull - 字段访问:getstatic, putstatic, getfield, putfield - 类型解析与分支目标标注 ### 伪代码生成 - 从原生 x86 反汇编生成**类 C 伪代码**:寄存器赋值、算术运算、函数调用、条件分支、循环(后向跳转检测) - 从 JVM bytecode 生成**类 Java 伪代码**:方法签名、字段访问、方法调用、类型转换、数组操作、控制流 ### 源码重建 - 从 bytecode 重建 **Java `.java` 文件**:class 声明、字段、构造函数、具有正确 Java 类型的方法、return 语句、方法调用、字段访问、类型转换 - 从原生分析重建 **C `.c` 文件**:基于反汇编生成的函数 stub、字符串引用、import 声明 ### 算法指纹识别 | 类别 | 模式 | |---|---| | AES | `AES`, `aes`, `rijndael`, `sbox` | | RSA | `RSA`, `rsa`, `modexp`, `publickey` | | 哈希 | `sha1`, `sha256`, `md5` | | CRC/Checksum | `crc32`, `checksum`, `adler` | | 压缩 | `inflate`, `deflate`, `gzip`, `zlib`, `lzma` | | 网络 | `socket`, `datagram` | | J2ME UI | `javax.microedition.lcdui`, `midlet`, `canvas`, `displayable` | | GPU/寄存器 | `mmio`, `register`, `reg_`, `opcode`, `microcode`, `firmware`, `shader` | | 控制流 | 后向分支检测(目标地址 < 当前地址的 `goto`, `jmp`, `if`) | | 寄存器/opcode 字符串 | 来自字符串表的 `0x`, `reg`, `mmio` 候选项 | | 高熵 sections | 加壳/压缩/固件 blob 候选项(熵值 > 7.2) | | 可执行区域 | 带有文件偏移量和大小的代码 section 识别 | ### IOC 提取 | IOC 类型 | Regex 模式 | |---|---| | URLs | `https?://[A-Za-z0-9._~:/?#\[\]@!$&'()*+,;=%-]{4,}` | | IPv4 地址 | `\b(?:(?:25[0-5]|2[0-4]\d|1?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|1?\d?\d)\b` | | 域名 | `\b(?:[A-Za-z0-9-]{2,63}\.)+(?:com|net|org|io|ru|cn|biz|info|top|xyz|online|site|dev|nl)\b` | | 注册表路径 | `\bHK(?:LM|CU|CR|U|CC)\\[A-Za-z0-9_\\ .{}-]{4,}`(不区分大小写) | | 文件路径 | `\b[A-Z]:\\[A-Za-z0-9_ .\\/\-]{4,}`(不区分大小写) | 每次分析最多提取 256 个 IOC 候选项。 ### 能力检测 | 能力 | 指标 | |---|---| | 持久化 | `currentversion\run`, `runonce`, `startup`, `createservice`, `schtasks`, `systemd`, `launchdaemon`, `midlet-push` | | 进程注入 / 内存篡改 | `virtualalloc`, `virtualallocex`, `writeprocessmemory`, `createremotethread`, `ntmapviewofsection`, `setwindowshookex`, `ptrace`, `process hollow` | | 网络 / C2 | `internetopen`, `winhttp`, `wsastartup`, `connect`, `socket`, `recv`, `send`, `javax.microedition.io.connector`, `socket://`, `http://`, `https://` | | 凭据或浏览器数据访问 | `lsass`, `dpapi`, `cryptunprotectdata`, `login data`, `cookies`, `keychain`, `wallet`, `password` | | 反分析 / 沙箱感知 | `isdebuggerpresent`, `checkremotedebuggerpresent`, `ntqueryinformationprocess`, `vmware`, `virtualbox`, `qemu`, `sandbox`, `debugger`, `frida` | | 加密 / 勒索软件原语 | `cryptencrypt`, `bcrypt`, `aes`, `rsa`, `chacha`, `salsa20`, `curve25519`, `ransom`, `.locked` | | Java 反射 / 动态加载 | `class.forname`, `getdeclaredmethod`, `invoke(`, `classloader`, `defineclass`, `reflection` | | J2ME 敏感能力 | `midlet-permissions`, `javax.microedition.io.file.fileconnection`, `javax.wireless.messaging`, `pushregistry`, `recordstore` | | 驱动 / 固件逆向目标 | `ioctl`, `deviceiocontrol`, `mmio`, `pci`, `bar0`, `register`, `opcode`, `microcode`, `firmware`, `shader` | | 可写+可执行 section | 从 section 标志检测(W+X = loader、unpacker、JIT、shellcode staging) | 每个能力类别最多匹配 8 个指标。 ### YARA 种子字符串 提取匹配以下内容的字符串(6-96 字符):`.dll`、`http`、`reg`、`mutex`、`cmd`、`powershell`、`midlet`、`opcode`、`microcode`。最多提取 12 个种子字符串。 ### NanoPython 脚本 | 函数 | 描述 | |---|---| | `summary()` | 格式、架构、文件大小、SHA-256 哈希值 | | `sections()` | Section 表(名称、虚拟地址、偏移量、大小、标志、熵值) | | `imports()` | Import 列表 | | `algorithms()` | 算法指纹 | | `iocs()` | IOC 候选项(URL、IP、域名、注册表、路径) | | `capabilities()` | 恶意软件能力指标 | | `find_strings('needle')` | 通过子字符串过滤提取的字符串 | | `grep('needle')` | 跨反汇编 + 伪代码 + 字符串搜索 | | `print('text')` | 输出字面文本 | ### 分析模式 | 模式 | 输出 | |---|---| | `overview` | 格式、架构、sections、imports、熵值、算法/IOC/能力摘要 | | `strings` | 所有提取的 ASCII 和 UTF-16LE 字符串 | | `disasm` | 反汇编 + 伪代码 | | `all` | 所有内容:概览 + 字符串 + 反汇编 + 算法 + IOC + 能力 + YARA 种子 | | `source` | 重建的源代码(.java 或 .c) | | `reconstruct` | 带有完整报告的重建源码 | ### SHA-256 哈希 每个被分析的二进制文件都会通过 `node:crypto` 计算 SHA-256 哈希值。 ## 安装 添加到 `~/.pi/agent/settings.json`: ``` { "packages": [ "git:github.com/drvova/pi-reverse" ] } ``` 然后添加到 `~/.pi/agent/mcp.json`: ``` { "mcpServers": { "pi-reverse": { "command": "bun", "args": ["~/.pi/agent/git/github.com/drvova/pi-reverse/src/index.ts"] } } } ``` 重启你的 pi 会话。`reverse_analyze` 工具即可使用。 ### 独立运行 ``` git clone https://github.com/drvova/pi-reverse.git cd pi-reverse bun src/index.ts --cli /bin/ls --mode overview ``` ## 用法 ### MCP 工具:`reverse_analyze` | 参数 | 类型 | 默认值 | 描述 | |---|---|---|---| | `path` | string | (必填) | 要分析的二进制文件路径 | | `mode` | string | `overview` | `overview`, `strings`, `disasm`, `all`, `source`, `reconstruct` | | `max_strings` | number | 160 | 要提取的最大字符串数量 | | `max_disassembly` | number | 256 | 最大反汇编行数 | | `max_bytes` | number | 67108864 | 要读取的最大字节数(0 = 不限制) | | `script` | string | — | 针对该报告运行的 NanoPython 脚本 | | `generate_source` | boolean | false | 生成重建的源代码 | ### CLI ``` bun src/index.ts --cli /bin/ls --mode overview bun src/index.ts --cli /bin/ls --mode all --generate-source bun src/index.ts --cli ./app.class --mode all --max-disasm 50 bun src/index.ts --cli ./malware.exe --script "iocs() capabilities()" ``` ### 自我测试 ``` bun src/index.ts --self-test ``` 验证:熵值计算、字符串提取、x86 反汇编、SHA-256 哈希。 ## 架构 ``` src/ index.ts MCP server (stdio JSON-RPC) + CLI + analyzeBinary orchestrator + formatReport parsers.ts ELF, PE, Java class, JAR/ZIP, JAD parsers (44 functions) utils.ts sha256, entropy, string extraction, x86 disasm, algorithm/IOC/capability extraction, source reconstruction, nanopython (13 functions) types.ts ReverseReport, BinarySection, EntropyWindow, ReconstructedSource, AnalyzeOptions interfaces ``` 无 npm 依赖。仅使用 `node:crypto`、`node:fs`、`node:path`、`node:readline` 以及 Bun 的 `inflateSync` 进行 JAR 解析中的 DEFLATE 解压。 ## License MIT
标签:DAST, MCP, MITM代理, Wayback Machine, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 反汇编, 恶意软件分析, 自动化攻击, 逆向工程, 静态分析