REA 逆向分析引擎拆解实录:从 npm 包到本地引擎的完整逻辑
【免费下载链接】reaReverse engineer anything with agents, from app behavior down to native binaries.项目地址: https://gitcode.com/GitHub_Trending/rea2/rea
REA 解决的是"AI Agent 做不了逆向活"的问题:安装 npm 包rea-agents后,Agent 和终端共用同一个 CLI + MCP 服务器,把原生二进制、JavaScript/Electron 应用、.NET 程序集、安卓 APK 和网页的分析能力接到本地工作流里,结果附带证据与局限,全程在本机运行。
它到底能干什么
一个 npm 包,把 Hopper、Ghidra、IDA 这类重量级逆向工具变成 Agent 可调用的 MCP 工具目录。
- 📦 CLI 与 MCP 双通道共享同一套分析工作流,行为一致
- 🖥️ 本地静态分析:JavaScript 应用分析无需任何原生分析引擎
- 🧾 每个结论附带证据、局限性与未知项,可复现可对比
- 🎯
setup一条命令注册 MCP 服务并下发工作流技能包
仓库结构走读
仓库顶层是六个各司其职的目录。src/是核心 TypeScript 源码,scripts/rea.mjs 负责分发;bridge/放跑在外部工具进程里的适配代码;scripts/是构建、验证与 CI 检查脚本;tests/是 Vitest 测试与边界测试套件;docs/是官方文档与契约;third_party/记录上游工具(pwntools、pwndbg、evmole 等)的边界说明。
src/内部的依赖方向是一条因果链,完整定义见 docs/architecture.mermaid。最外面是入口与适配:src/main.ts 加src/main/管理 MCP stdio 服务器的启动、会话与优雅关闭,src/server/把 MCP 请求翻译成内部工具调用。往里是src/application/,约两百个文件的"工作流大脑",管理会话路由、证据账本与快照缓存,也包含Doctor健康检查和Setup引导安装。再往里是 Provider 适配层,每种分析目标一个模块,负责把统一的工作流翻译成对应引擎的方言:
| 模块 | 分析对象 | 外部依赖 |
|---|---|---|
| src/hopper/ | Mach-O/ELF/PE 原生二进制 | Hopper(Unix 套接字协议) |
| src/ghidra/ | 原生二进制 + 函数反编译 | 本机 Ghidra + JDK |
| src/ida/ | IDA 当前目标(只读) | 上游 ida-pro-mcp |
| src/browser/ | 网页、Electron、CDP 捕获 | Chrome 系浏览器 / Playwright |
| src/dotnet/ | .NET 程序集(PE/CLI) | 无,纯静态元数据解析 |
| src/android/ | APK 静态分析 | 自带 headless JADX |
| src/firmware/ | Linux 固件分区 | Binwalk / Unblob 适配 |
| src/process/ | 受控进程行为捕获 | 本地 PTY 后端 |
最内层是 src/contracts/ 与 src/domain/:前者用 Zod 定义所有工具对外可见的输入输出 Schema,后者是两百多个纯函数模块——证据比较、规范化摘要、应用图计算都在这里,无副作用,是结果"可审计"的根基。
如何让 Agent 用得上 Hopper 与 Ghidra
问题在于:Hopper、Ghidra 各有各的进程模型和 API,Node.js 没法从外面直接指挥它们。REA 的方案是把一小段代码"住"进引擎进程内部,对外只开一条认证过的本地私有通道。
以 Hopper 为例:bridge/hopper_bridge.py 通过 Hopper 自带的 Python 启动选项在其进程内运行;src/hopper/BridgeLauncher.ts 在注入脚本时写入随机会话套接字路径和一次性 token,桥脚本在 Hopper 的专用 Python 线程里监听本地套接字,用 HMAC 校验请求,再把 REA 的操作翻译成 Hopper 的 Python API。Ghidra 侧则是 bridge/ghidra/ReaGhidraBridge.java 打包成 HeadlessScript,在 headless 进程里负责清单、反编译、交叉引用与控制流图,同样经私有 Unix 套接字与 Node 侧对话。效果是 Node 侧的 Provider 只需要实现一种套接字协议,换引擎不用改上层。
之所以要配进程治理,是因为外部引擎本质上是子进程:src/process/统一管理进程组、超时 deadline、私有工作目录与清理,避免分析工具"跑野";macOS 侧的原生 UI 捕获由 bridge/native/ReaNativeUI.swift 这类辅助进程补齐。
分发器如何把 CLI 与 MCP 接到同一套引擎
两条使用通道共享一个引擎,才能避免"终端里能做、Agent 里不能做"的双份维护。scripts/rea.mjs 按参数分流:rea mcp加载dist/main.js进入长会话模式,其余参数加载 CLI 一次性适配层,两条分支都会先校验编译产物存在。MCP 服务器在 src/main/ 管理进程生命周期,src/server/负责工具注册与结果封装;CLI 的每条命令是独立进程,但两者走的是同一套应用层工作流和证据契约。[package.json](https://link.gitcode.com/i/5b4094046be9f9dac6d1a7978ceb8a3c)里rea与rea-agents两个命令名都指向这个分发器,发布时 npm 只打包files清单里的dist/、桥接脚本与技能包,仓库的测试和文档不会混进用户机器。
跑起来
npx rea-agents setup—— 选择你的编码 Agent 并审批配置变更,REA 的 MCP 服务与工作流技能包写入配置,原有配置有备份;- 对 Agent 提出任务,例如"弄清目标应用的搜索功能如何工作并展示证据"——Agent 通过 MCP 调用逆向工具,回答里带证据与局限;
npx -y rea-agents@latest analyze-javascript-application /绝对路径/应用 --json—— 纯静态逆向分析,无需任何原生引擎,输出应用图、模块导入关系及证据;- 配好 Hopper 或 Ghidra 后,
rea analyze /绝对路径/二进制 --provider ghidra --json进入原生二进制分析,结果含快照、函数与交叉引用。
诊断是独立入口:rea doctor --json按任务范围检查引擎可用性与注册状态,rea doctor --provider <id> --json定位单个 Provider 的问题;必需检查失败时退出码为 1。
设计取舍
- 分发器 + 分层架构:scripts/rea.mjs 一个入口分流,底下入口适配、应用、Provider、契约/领域四层职责分明;替换分析引擎只需换一层 Provider 和一段桥接代码,上层工作流零改动。
- 桥接插件模式:不改造外部工具,把认证过的代码送进对方进程,用私有套接字对话;外部引擎升级不污染 Node 侧,
src/process/的进程组与超时治理保证子进程可控,这是多引擎接入能稳定并行的前提。 - 证据优先的纯函数领域层:src/domain/ 无副作用,结论可比较、可复现、可对比,错误契约见 docs/mcp-contracts.md——这正是"给 Agent 用"的工具与"给人看"的 GUI 的本质差异 🔧
顺着 docs/architecture.mermaid 的依赖链读 src/,每条请求如何变成一条可审计的证据链就一目了然了。
【免费下载链接】reaReverse engineer anything with agents, from app behavior down to native binaries.项目地址: https://gitcode.com/GitHub_Trending/rea2/rea
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考