PS:AI 落地点击预约直播。
REA(Reverse Engineer Anything)火了。10 月 12 日冲到 12.1 万 Star,官方 README 现在已经挂出 20 万 Star 的致谢横幅。网上的讨论大多停留在"AI 能克隆软件了"这个层面,热闹归热闹,但没几个人讲清楚它内部是怎么设计的。这个周末我把仓库的 src 目录结构、官方架构图(docs/architecture.mermaid)和 MCP 工具设计文档(docs/tool-design.md)完整读了一遍。说实话,比"能拆 App"更值得学的,是它的工程架构。今天这篇,带你一层一层拆。PS:AI 更多案例深入免费学习去这里,扫码直达:
1.打开 AITutor 新一代 AI 原生学习伙伴:www.aiaitutor.com 2.在首页输入"你想学习的AI知识” 就能看到更详细更丰富案例。3.包含了图文、视频、播客、闪卡、代码、测验等9种学习模态。
01 先看全貌:一个 TypeScript 项目,七层结构
REA 全部用 TypeScript 写成,MIT 协议。别被"接了几个逆向工具"的描述骗了,它内部的 layering 做得相当讲究。按照官方架构图,自上而下可以分成这么几层:- 入口层:scripts/rea.mjs 可执行分发器,加上 CLI 和 MCP Server 两个入口
- 装配层:src/composition/,负责构造 provider 和会话工厂
- 应用层:src/application/,CLI 和 MCP 共享的工作流都在这里
- Provider 层:src/hopper/、src/ghidra/、src/ida/、src/browser/ 等二十多个适配模块
- 进程地基:src/process/ 和 Windows 原生边界
- 契约层:src/contracts/,所有对外 schema
一句话总结它的设计哲学:不造轮子,造桥。底层分析能力全部复用 Ghidra、Hopper、IDA、JADX 这些成熟工具,REA 自己只做三件事:调度、契约、证据。02 入口层:一个分发器,两副面孔
REA 对外有两个面孔:一次性命令行(CLI)和常驻的 MCP stdio 服务器。很多项目会把这个做成两套逻辑,最后 CLI 和 MCP 行为不一致,坑用户也坑自己。REA 的做法是:scripts/rea.mjs 只负责路由,判断这次调用是 mcp 模式还是 one-shot 模式,然后分别交给 src/main.ts(MCP 服务器适配器)或 src/cli.ts(CLI 适配器)。而这两个入口,最终都汇到同一个 src/application/ 应用层。也就是说,Agent 通过 MCP 调用的工具,和你在终端里敲的 CLI 命令,走的是同一套工作流、同一份契约。官方 README 里也明确说了:CLI commands use the same workflows。这个"单一路径"设计,是保证行为一致性的根。03 装配层:工厂模式,一个引擎挂了不拖累全局
src/composition/ 是我觉得最值得抄作业的一层。它负责构造所有的 provider 实例和会话工厂,核心规则有两条:- 构造时不启动引擎、不获取目标,只创建新鲜的 typed provider
- 可选适配器独立加载,单个失败必须保留其他成功的同伴
第二条特别关键。REA 要对接的外部工具太多了,Hopper、Ghidra、IDA、JADX、Binwalk、TShark、adb,随便哪一台机器上都不可能全装。如果装填逻辑写得粗糙,缺一个工具整个服务就起不来。REA 用独立可选加载把这件事做成了标配:你装了什么,就开放什么能力,缺的工具只会让对应能力显示不可用,不会影响其他分析链路。对于 WASM、EVM 这种纯静态描述符,装配层也做成了 named contract 加工厂加可重试生命周期的标准件。新增一个分析能力,有明确的模板可以套。04 会话与路由:确定性选择,拒绝悄悄降级
逆向分析有个天然的麻烦:同一个二进制,Ghidra 能拆,Hopper 能拆,IDA 也能拆。Agent 调一次 open_binary,到底谁来干活?- BinarySession:一个目标对应一个不可变的深度绑定,分析过程中不会中途换引擎
- AnalysisProviderRegistry:候选 provider 排序后做确定性选择,官方原话是 no fallback
- SessionProviderRouter:主引擎之外的辅助能力,走独立的 disjoint 路由
"no fallback" 这四个字值得展开说。很多工具类项目喜欢做兜底:首选引擎失败了就偷偷换次选。在逆向场景里这是灾难,因为不同引擎的反编译结果、符号命名、覆盖率都不一样,中途换引擎等于证据链断掉。REA 宁可明确告诉你"这个能力当前不可用",也不悄悄降级出一个似是而非的结果。配合 BinarySessionRecords 和 AnalysisSnapshotCache,同一个目标的分析结果有快照、有缓存、有提交后的通知机制。这套东西,本质上是在给 Agent 的记忆做工程化兜底。05 引擎适配层:三种接法,各显神通
Provider 层是 REA 最厚的一层,光原生分析引擎就有三种完全不同的接法:- Hopper:bridge/hopper_bridge.py 直接跑在 Hopper 进程内部,把操作翻译成 Hopper Python API,外面通过 Unix socket 协议通信,BridgeLauncher 负责拉起,HopperClient 负责收发
- Ghidra:bridge/ghidra/ReaGhidraBridge.java 打包成 HeadlessScript,用无头模式做清单、反编译、交叉引用和控制流图,传输层 Unix 和 Windows 都支持
- IDA:不自己造协议,直接适配上游的 ida-pro-mcp 契约,可以绑定活着的 GUI 实例,也可以托管无头数据库
看出门道了吗?对每个引擎,REA 都选择了那个生态里最稳的接入点,而不是强行统一抽象。Hopper 有嵌入式 Python 就进进程,Ghidra 有官方 headless 就走脚本,IDA 有成熟的 MCP 实现就直接复用。浏览器方向也一样务实:src/browser/ 走 CDP 和 Playwright 做被动观察,src/inspector/ 用 V8 Inspector 做被动发现,source map 解码单独跑在限制堆内存的 Node 进程里。进程捕获、GDB/MI 持久会话、固件的 Binwalk 和 Unblob、Android 的无头 JADX,每一类目标都有一个明确的、有边界的适配器。06 工具设计:六种形态,和一条铁律
MCP 工具一多,最容易变成一锅粥。REA 专门写了份 tool-design.md,把工具收敛成六种形态:形态 | 干什么 | 返回什么 |
|---|
inspect | 查一个目标的事实 | 相关字段、位置、能力可用性 |
search / list | 候选发现 | 稳定排序和上下文 |
trace | 跨证据追关系 | 带类型的边、支撑事实、未解决路径 |
compare | 成对比较 | 身份、可比较范围、差异 |
workflow | 组合出常见结果 | 内联答案加贡献证据 |
observe / capture | 运行时行为 | 权限、副作用、生命周期、清理状态 |
比形态更重要的是文档里那条铁律:Missing coverage is unknown, not absence。没查到,就是 unknown,绝不写成"不存在"。配合这条铁律的,是把 observed(观测到的)、derived(推导的)、inferred(推断的)三种关系严格分开,未解决的边和部分结果都要保留。每一条结论后面都跟着证据引用、覆盖率和局限性说明。为什么这件事重要?因为 Agent 最大的毛病就是自信地胡说。REA 在契约层面把"我不知道"做成了一等公民,Agent 拿到的每个结果都带着证据等级,胡编的空间被结构性压缩了。这是我读完全部文档后,最想给做 Agent 工具的朋友推荐的一点。07 地基与工程质量:不像爆款,像基建
往下看地基,src/process/ 管理所有外部进程的完整生命周期:进程组私有根目录、超时 deadline、有界的文件读取、跑完清理。Windows 侧甚至单独写了 Node-API 原生插件,处理 NTFS 准入、受保护的 DACL 和 Job Object 的原子分配。- 配置全部走 src/config/ 的 Zod 校验,环境变量解析失败在启动时就暴露
- 错误有统一的 schema,文档目录里躺着一份自动生成的错误目录(error-contract.schema.json)
- 测试用 Vitest,fixtures 里备好了假的启动器、桥接器和 CDP 接缝,不装真引擎也能跑测试
- 有专门的 src/evaluation/ 做发布评估,直接给 Agent 的会话录像打分
- 文档即代码:docs 目录下 60 多篇指南,每个目标类型一份,还配了 VitePress 站点
src/domain/ 层全部是无副作用的纯函数,证据、比较、应用图谱都在这里。副作用被压到适配器和进程层,核心逻辑可以随便测。08 点评:为什么说它是 Agent 工具项目的范本
拆完整个架构,我认为 REA 给所有想做"Agent + 专业工具"项目的人,立了四个样板:单一路径:CLI 和 MCP 共用一套应用层,行为一致性靠结构保证,不靠文档提醒- 确定性优于小聪明:provider 选择确定性、no fallback、缺覆盖标 unknown,每一步都在对抗 Agent 的不确定性
- 证据一等公民:observed、derived、inferred 三分,证据链进契约,这才是"Agent 可用"和"Agent 敢用"的区别
- 边界感:进程所有权、超时、清理、Windows 原生隔离,把"AI 在你电脑上跑工具"这件事的风险控制在了工程层面
- 当然也要看到边界。REA 官方在贡献指南里写得很清楚:不集成专门绕过商业加壳和代码虚拟化的工作流,不做反调试对抗,不做 DRM 和授权绕过。它把自己的位置划在了合法研究、教育、互操作性和软件保护这一侧。玩可以,别越界。
如果你对企业级 AI 原生研发体系(Skills、SDD、Harness、Loop、知识飞轮、治理度量)感兴趣,去 AITutor 领取福利。AITutor 福利:AITutor 每个人的 AI 原生学习伙伴,业界最丰富 AI 实践和案例,4500+ 门多模态 AI 课程、7×24 小时 AI 导师已全面开放,快来免费体验吧。- 打开 AITutor,新一代 AI 原生学习伙伴:www.aiaitutor.com
- 在首页输入「你想学习的 AI 知识」,就能看到更详细、更丰富的案例
- 包含图文、视频、播客、闪卡、代码、测验等 9 种学习模态
PS:AI 落地点击预约直播。
09 加我微信
扫码加我👇有很多不方便公开发公众号的我会直接分享在朋友圈,欢迎你扫码加我个人微信来看👇
加星标★,不错过每一次更新!
⬇戳”阅读原文“,立即体验 AITutor