有时候答案不在源码仓库里,而在一个已经打好的构建包里:上个月发出去的 Electron 应用、测试机上留着的 APK、某个没打 tag 的旧版本原生二进制。像"source map 到底有没有被打进去""这两个构建之间改了什么"这类问题,需要有人直接打开产物本身。

打开网易新闻 查看精彩图片

REA 全称 "reverse engineer anything"(逆向任何东西),是一个 MCP 服务器兼 CLI,给编码智能体提供干这活的工具。它的 README 把自己描述为用智能体做逆向工程,"从应用行为一直到原生二进制",并且完全在本地运行。作者把它注册进 Claude Code,作为名为rea的 MCP 服务器,同时配上它的技能文件reverse-engineer-anything。

服务器和技能是两件事

所有东西都跑在你自己的机器上,重型引擎也得你自己装。REA 分两部分,技能文件明确说了一方存在不代表另一方就位:MCP 服务器以rea-agents之名发布在 npm 上,提供工具;技能是一组指令,教智能体什么时候该用 REA、先调哪个工具、结果怎么汇报。装技能不会注册服务器,注册服务器也不会安装分析引擎。

技能里还写明了什么时候不该用 REA:对一个完整的源码仓库做常规分析,用普通的仓库工具就行。作者说这和他的经验一致——REA 是给已发布的产物和运行时行为用的,不是用来读你手上已有的代码。

安装只认官方来源

README 提醒,相似的仓库名或抄来的 README 都不能让一个下载变成官方版本,并列出三个官方来源:morluto/rea仓库、rea.tools 网站、以及rea-agentsnpm 包。运行环境要求 Node.js 22.x(22.23.4 或更高)、24.x(24.22.1 或更高)或 26.12.1 及以上。

安装流程分几步:

  • 先干跑预览:npx -y rea-agents@latest setup --client claude_code --dry-run,只打印会改动的路径、备份和要装的技能,不写任何东西。
  • 正式应用:npx rea-agents setup --client claude_code,为指定客户端注册 MCP 服务器并安装技能;不带参数运行则交互式选择客户端。
  • 检查就绪状态:npx rea-agents doctor --client claude_code --skill --json以 JSON 报告注册和技能状态。它无法证明正在运行的智能体已连上,所以装完要重启 Claude Code。
  • 或者手动注册并锁定版本:claude mcp add --scope local rea -- npx -y rea-agents@6.7.0 mcp。锁定版本意味着升级是一个决定,而不是一次意外。

作者自己的注册用的是手动形式,锁定到已安装的版本,并加了一个环境变量指向本机的 Hopper 安装路径。其他人的路径会不一样。其他引擎各有自己的变量,比如GHIDRA_INSTALL_DIR和JAVA_HOME。

引擎是自带制。原生反编译需要 Hopper、Ghidra 或 IDA;Android 分析需要一个无头 JADX MCP JAR(版本 0.7.1,通过REA_JADX_MCP_JAR指定)以及 Java 17 或更新版本;固件提取在 Linux 上用 Binwalk 或 Unblob。静态 JavaScript 和 .NET 检查完全不需要引擎,适合作为第一批目标。REA 的安装流程不会装无关软件,IDA、Hopper 这类商业工具必须由你自己持有授权。

它能分析什么

技能的第一条规则是按目标路由:先看用户给了什么,再从对应的第一个工具开始。作者心里有一张对照表,第一次调用取决于产物类型,之后一切跟着证据走。

  • 原生二进制open_binary绑定目标,然后用聚焦工具搜字符串、列过程、反编译、追踪调用方与被调用方。对 Mach-O,observe_native_calls能记录哪些函数被执行,但它会在 LLDB 下启动目标,也就是真的把程序跑起来。
  • Electron 与 JavaScriptanalyze_javascript_application读取 ASAR 或解包后的目录树,包括 source map,并构建模块图。
  • Androidinspect_android_package读取清单和包身份,随后是类搜索、方法反编译和引用追踪。APK 全程不会被启动。
  • 托管代码与固件inspect_managed_artifact在不执行的情况下检查 .NET 程序集;inspect_firmware_regionsextract_firmware处理镜像,提取结果写入你指定的新文件夹。
  • 网页与运行中的应用list_browser_targetslist_electron_targets挂到你已打开的页面上,做被动观察。

要证据,不要感觉

作者最喜欢 REA 的一点是它怎么汇报。每个工具都返回一条带 ID 的 Evidence 记录,技能要求智能体把观察到的、推断出的、以及仍然未知的三者分开。一个反编译出来的函数是对分析输出的观察,不是原始源码;静态结果永远不能证明代码真的运行过。最终答案里的每个论断都应该指回一个 Evidence ID。

面对宽泛的问题,技能要求给出一份发现台账:每条结论关联其 Evidence ID、证据类型、搜索边界以及仍未确定的部分。针对空白也有工具:record_unknown记录一个未解问题,compare_artifacts、compare_functions、find_changed_behavior这类比较工具把静态差异当作候选,而不是证据。

工作流一:我的 Electron 构建到底打进了什么

这是作者用得最多的流程。把智能体指向你自己构建的应用打包好的 ASAR,问一个范围很窄的问题,比如 source map 或调试开关有没有混进生产版本。对大应用,技能建议先要 "summary",再用返回的parent_evidence_id配合inspect_analysis_view逐页翻模块、一次读一项,不必重跑分析。

想在磁盘上留完整记录而不是塞进智能体上下文时,也可以从 shell 走。命令来自技能的恢复指南:rea analyze-javascript-application输出 JSON,用 jq 包成 summary 视图,再交给rea inspect-analysis-view查看。

工作流二:比较两个发布版本

当某个 bug 在两个版本之间出现、而 tag 又缺失时,作者把两个产物都交给智能体,问某个功能附近改了什么。对原生代码,它分别打开两个二进制,按字符串或名字找到函数并比较函数证据;对 JavaScript,它比较模块图。答案是一串带证据的候选变更,作者再通过实际运行两个构建来确认。工具缩小搜索范围,但不替代测试。

工作流三:观察我自己拥有的页面

运行时观察是被动设计:你来操作应用,REA 记录它能看到的。你先在回环地址上开调试端口启动浏览器或 Electron 应用,再把该端点传进请求。REA 列出符合条件的页面,抓取你要的内容,比如脚本、网络形态和控制台输出。它从不点击、导航或执行页面 JavaScript,并且刻意排除凭据、cookie、授权头、存储值和原始 WebSocket 或 JSON 正文。当手上同时有来自包的静态证据和来自页面的运行时证据时,reconcile_javascript_runtime会把两者对上,遇到不一致就报告,而不是猜。

只在允许的地方用

范围界定先于第一次工具调用。逆向工具是双用途的,智能体会让它更快,风险也随之抬高。REA 的 README 说它用于合法研究、教育、互操作、软件保存,以及分析你拥有或获授权检查的软件;破解副本、窃取的密钥、未授权的密钥共享和绕过授权都不被许可。作者在此基础上给自己加了几条规矩:

  • 只分析自己构建的、或有书面许可测试的软件。客户在电话里说一句"行"不算书面许可。
  • 读许可证。有些终端用户协议即使对已付费软件也禁止逆向,而且各国法律不同。
  • 运行时工作放在测试机或独立配置里。原生调用观察会真的执行目标。
  • 发现的密钥绝不粘进聊天、工单或帖子里。构建泄露了密钥就轮换并报告给所有者。
  • 锁定版本,只从官方来源安装。

在这些界线之内,REA 是作者今年为"关于构建而非源码"的问题加过的最有用的智能体工具。它把"我觉得旧版本是这么干的"变成一串带证据的论断,这种答案才能拿来行动。