逆向工程这件事,工具链的成熟度远超大多数人的想象:Hopper、Ghidra、IDA Pro 三款反汇编器能把一个 stripped binary 拆成函数列表、控制流图和伪代码。但这条工具链有一个共同的缺口——它们都是给人用的。交互靠 GUI,操作靠鼠标点选,输出是屏幕上的一段高亮汇编。当编码智能体(Claude Code、Codex、Cursor 这类)想参与这项工作时,它面对的是一个它点不动的界面。
GitHub 上的 morluto/rea 项目(REA,Reverse Engineer Anything)试图补上这一层。它把三款反汇编器连同 JavaScript/Electron 应用分析、.NET 程序集检查、固件与 APK 静态分析打包成一套 MCP(Model Context Protocol)服务,公开了 126 个工具,让编码智能体通过统一的协议直接驱动这些引擎。项目采用 MIT 协议,npm 包 rea-agents 于 2026 年 7 月首发,目前迭代到 v4.1.0。10 月 6 日它冲上 GitHub Trending 全语言榜第 3 位,日增 star 数接近 3000,fork 数超过 1100。

三引擎,一个入口
REA 的核心架构问题只有一个:Hopper、Ghidra、IDA 是三套完全不同的软件,分别用 Python API、Java HeadlessScript、私有 MCP 三种方式暴露自己,怎么让一个智能体不用关心差异?
它的答案是三层路由。最上层是入口适配:CLI(rea 命令)和 MCP stdio server 共享同一套应用层工作流,智能体走 MCP,人走终端,能力完全一致。中间层是会话路由器:每个分析目标(一个 Mach-O、一个 ELF、一个 PE)在会话内做一次不可变的深度绑定,由 AnalysisProviderRegistry 按排序规则做确定性选择,官方明确写的是"no fallback"——引擎选择不静默降级,选不了就报错。最底层是三个 provider 适配器:
- Hopper provider:通过一个运行在 Hopper 进程内的 Python bridge(
hopper_bridge.py)和 Unix socket 协议通信,支持 demo 模式,安装脚本可以在用户批准后自动装 Hopper; - Ghidra provider:要求 Ghidra 12.1.4 加 64 位 JDK 21,bridge 以 HeadlessScript 形式打包,暴露 inventory、函数分析、反编译和引用查询,另外支持在会话数据库里做原子性的函数命名和注释编辑——可执行字节保持不动;
- IDA provider:复用上游
ida-pro-mcp的注册,支持 attached(GUI 现状只读分析)和 headless(自有数据库托管)两种模式。
这种设计让"用什么引擎"变成配置问题而不是代码问题。README 里的调查示例把一次功能追踪拆成六步:open_binary 打开并识别二进制,search_strings/search_procedures 找离线搜索相关的线索,find_xrefs_to_name/xrefs 把线索连到可执行代码,get_call_graph/procedure_callees 重建控制流,procedure_pseudo_code/batch_decompile 反编译相关例程——前五步由 REA 的工具完成,第六步(把学到的机制用 TypeScript 和 SQLite 实现进你的项目)交还给智能体自己的文件编辑和测试工具。
每条结论都带证据和"不知道"
REA 与"让 AI 猜"式工具的分界线在证据系统。工具返回带 artifact 标识、provider 来源、文件位置、置信度和局限性的结构化 Evidence,而非自由文本。分析在目标的一份临时副本上运行,会话关闭时清掉临时工程;结果明确标注"Ghidra 观察到了什么、没能解析什么",反编译产出的是伪代码而非原始源码,文档里反复强调不会声称恢复原始源代码或自动克隆应用。
配套机制有两个值得展开。一是快照:rea analyze --snapshot app.json 把成功结果存为不可变分析文件,后续只有目标字节、操作、参数、引擎和设置全部匹配才复用,快照文件落盘为 owner-only 权限——这是把"分析结果"当成可版本管理的资产,而不是一次性的对话输出。二是开放问题追踪:调查中未解决的发现、相互矛盾的证据、待补的探针都作为 residual unknowns 记录,重建校验(reconstruction checks)的返回值是 pass/fail/unknown 三态,缺失证据不会被当成通过。六个引导式 MCP prompt(investigate_feature、compare_application_versions、verify_reconstruction、trace_crash、audit_residual_unknowns、prepare_bounded_process_capture)把这套流程固化成了可发现的工作流。
不只是二进制
二进制之外,REA 覆盖了几类常见的"没有源码"场景:
- JavaScript/Electron 应用:对目录或 ASAR 包做纯静态分析,不执行应用,恢复模块、imports、source maps、路由、IPC 通道和原生插件清单;Electron 侧可进一步做渲染进程观察与静态/运行时对账;
- 浏览器观察:通过 loopback CDP 连到已运行的 Chrome 系浏览器,八个被动工具检查页面结构、网络元数据、脚本证据和截图,不导航、不点击、不执行页面 JS,凭据和 cookie 不留存;
- .NET 程序集:静态读元数据和 CIL 指令、比对构建差异,不加载不运行程序集;
- 固件与 Android:Linux 固件区域检查用调用方自备的 Binwalk/Unblob;APK 静态分析用 headless JADX,不启动模拟器不执行 APK,涵盖 manifest 声明、类搜索、方法反编译和静态引用。
Mac 平台还有一组不启动 Hopper 的轻量工具:直接解码 Mach-O 的 Objective-C 类/元类记录、方法条目、ivar 偏移,以及简单 Swift conformance 和 vtable 描述符;编译过的 Assets.car、keyed archive、storyboard/nib 都能直接读出结构化内容。

安全边界与真实局限
把逆向工程交给 AI,第一个问题就是:我的应用会被传到哪个服务器?REA 的答案是本地运行——分析发生在受支持的本地主机上,不把目标上传到任何在线分析服务。浏览器观察和进程捕获都是显式声明目标和动作的受控操作,场景 JSON 里只允许出现密钥引用和环境变量名,不允许出现密钥值。
局限同样写在明面上。原生深度分析依赖三款商业或开源引擎的本地安装:Hopper 是独立商业软件(demo 模式有厂商限制),Ghidra 和 IDA 都是 bring-your-own。链式 fixup、外部绑定、认证指针、categories、泛型/弹性类表这些 Objective-C/Swift 元数据形态被明确列为不支持或部分覆盖。Windows 侧的 Ghidra 支持标注为实验性 P0:只覆盖本地 NTFS 上的非托管 x86-64 PE 应用,25 个只读操作,无修改权限。跨层特性追踪、去混淆、协议级行为推断都不在已验证范围内——文档对"静态观察到的东西不能推断运行时行为"反复划线。
对开发者意味着什么
对做安全研究的人,这基本是"AI 辅助逆向"工程化的一步:三引擎统一契约意味着工具链可以替换,证据系统意味着智能体的结论可以审计,快照意味着长调查可以断点续作。对应用开发者,它降低了"这个 App 的某个功能到底怎么实现的"这类参考性调查的成本——当然,法律边界(许可证、DRM、反编译条款)依然在每个使用者自己手上,REA 不会替你判断这个。
对智能体工具链生态,REA 代表了一个清晰的方向:GUI 软件的 AI 化不一定非要等厂商出官方 API,在引擎外面套一层协议适配器,把交互式操作翻译成带证据的原子查询,同样能把几十年的桌面工具接入智能体工作流。项目迭代速度很快(npm 两个月内发了 25 个版本中的大部分,提交记录里当天还有社区 PR 被合并), Roadmap 里的下一步是 Binary Ninja、Rizin、LIEF 支持和 LLDB/Frida 运行时观察。
仓库地址:https://github.com/morluto/rea
来源:REA 官方 README 与 docs/ 目录(architecture.mermaid、native-investigation.md、mcp-prompts.md)、GitHub API、trendshift.io