进阶 约 25 分钟 2026-10-17 04:50:29 · 12 阅读

reverse-engineer-anything 技能实操:让 AI 代理带证据地逆向闭源软件

REA 是什么,这个技能管什么用

你在某个桌面应用里看到一个很想要的功能——比如某编辑器的批量重命名、某客户端的智能预加载——但它是闭源的,没有源码可翻。morluto/rea 这个 28 万 star 的开源项目(npm 包名 rea-agents,MIT 协议,本文写作时 npm 最新版 6.5.0,本站产品档案)给的就是这条路:一个 MCP 服务器加一套工作法,让 Claude Code、Codex、Cursor 这类编码代理直接检查二进制、Electron 应用、.NET 程序集和网站,把「这功能怎么实现的」回答到字节级,并且每条结论后面挂着可复查的证据(Evidence)。

本篇讲的是仓库里的第一块拼图:.agents/skills/reverse-engineer-anything 这个 Agent Skill。它是一份装进代理的「逆向工程作业指导书」,教 AI 在什么时候连 REA、拿到目标先做什么、结论怎么写才不算编。先看它在仓库里的位置,和它的姊妹技能是什么分工:

两个技能在 REA 仓库里的位置与分工

两个技能的目录位置、体积与定位(依据仓库 main 分支整理)

有一句原文值得先记住,它决定了这个技能的适用边界:安装这个技能只提供指令(Installing this skill supplies instructions),它不注册 REA 的 MCP 服务器、不安装分析引擎、也不给正在运行的代理添加工具。工具从哪来、断了怎么修,是 setup 命令的事;技能本体只负责让 AI「用得对」。

另一个边界是:它明确说普通的完整源码仓库分析不要用 REA(Skip REA for ordinary source-repository architecture analysis)。有源码就直接读源码,逆向是给「只有发行物、没有源码」的场景准备的。

装技能之前,先把环境对齐

REA 的硬性前提写在 README 里:Node.js 22.x(≥22.19)、24.x(≥24.11)或 26+,外加 npm。这是真实门槛,不是「建议配置」——本文在 Node v20.16.0 的机器上实测过:

$ npx -y rea-agents@latest doctor --client codex --json
{
  "code": "UNKNOWN",
  "message": "URL.parse is not a function"
}

npm 对 engines 不满足只打 EBADENGINE 警告、不拦截安装,但 doctor 一启动就撞上 URL.parse is not a function——这个 API 是 Node 22 之后才有的。也就是说引擎声明缺了就是缺了,警告拦不住运行时报错。

有趣的是分层的:同在这台 Node 20 机器上,不需要 MCP 注册的纯静态分析命令却能完整跑通(后面第五节有完整实测)。先把这两条路径的差别记在心里,排查问题时能省不少时间:

Node 20 上 doctor 与 analyze 两条路径的实测对比

同一台机器、同一个包版本,两条命令一败一成的实测记录

Linux 用户还有一条 README 明写的前提:Ghidra、JADX、固件工具的启动和静态 JavaScript/Electron 分析,都要求 PATH 上有一个 procps 兼容的 ps 命令(多数发行版装 procps 或 procps-ng 就有),缺了会在监管子进程启动前直接拒绝执行。

快速开始:三步接入

环境对了之后,官方入口只有一条命令:

npx rea-agents setup

setup 是交互式的:选你的代理(支持 Claude Code、Claude Desktop、Codex、Cursor、Gemini CLI、Windsurf、Devin、OpenCode、VS Code、Copilot CLI 等,SKILL.md 里列了 15 个客户端 ID)、审查它提议的改动、批准。它会注册 REA 的 MCP 服务器并顺带安装配套的工作流指令(也就是本篇讲的技能本体),写配置前先备份。装完重启代理。想长期用命令行,可以全局装:

npm install --global rea-agents
rea --help

原生二进制分析(Hopper/Ghidra/IDA 那条线)要先配 provider;纯 JavaScript/Electron 静态分析不需要任何原生引擎。README 给的第一句示范提问长这样:

Understand how search works in the Notes app, show me the evidence, and build a similar feature for my project.

把 Notes 换成你的目标应用、把 search 换成你想懂的功能就行。

技能本体:六节工作法

setup 装进代理的技能文件(SKILL.md,metadata.version 为 42,仓库 main 分支)分六节,构成一条从「连不连」到「怎么收尾」的完整作业流。整张图如下:

六节工作法结构图

六节工作法:每节管一件事,标题与要点整理自 SKILL.md 原文

第一节「Connect only when needed」反的是过度准备:工具都在就直接奔目标,不要每次调查前都跑一遍诊断。真断了才去读 references/connection-and-recovery.md,而且先分清断因——注册缺失/过期要修配置;注册正常但会话里没工具,是代理要重连,doctor 证明不了当前代理已连上;缺某个 provider 只影响需要它的任务,静态 JavaScript 检查既不用 Hopper 也不用 Ghidra。修配置的动作也有纪律:先跑 npx -y rea-agents@latest setup --client codex --dry-run --json 拿到只读计划(会列出要写的路径、备份、技能替换),人批准后再 --yes 应用。

技能原文还有一条安全边界值得单独摘出来:REA setup 永不安装或升级无关软件——Node.js、npm、Homebrew、Java、Ghidra、IDA、JADX、Binwalk、Unblob 都在「永不碰」清单上。缺什么由使用者自己补,setup 只修自己的注册。

拿到目标先路由:19 类目标选工具

第二节「Route the target first」是全篇最实用的一段:用户丢过来什么,第一个工具就用什么,不要拿锤子找钉子。节选如下:

目标路由表节选

按目标类型选第一个工具,节选自 SKILL.md 路由清单

这张表背后是整个 REA 工具目录:SKILL.md 里点名了 33 个工具名(analyze_javascript_application、open_binary、inspect_android_package、inspect_wasm_artifact、inspect_evm_interface、inspect_sqlite_database 等),覆盖原生二进制、离线 ELF 布局、Go/Rust 二进制、WASM、EVM 字节码、SQLite 快照、抓包文件、Android 资源、Flutter 应用等十余类目标。其中 Go 和 Rust 二进制检查是内置的,不需要装 Go 或 Rust;SQLite 快照检查则要求 Node 24.15+ 或 26+ 提供原生 SQLite 限额。

对已有 IDA 配置的用户有一条专门提醒:用 open_binary 传原始二进制加 provider_id: "ida",不要传 .idb 或 .i64 数据库文件。

摘要优先与证据翻页:一次真实实测

第三节「Work summary-first」处理的是大目标的分析礼仪:先要摘要(detail: summary),再按返回的 Evidence ID 翻页下钻,不在响应超限时反复重跑同一分析。这套机制长什么样,用一个最小实测看最直接。本文在一个只有两个 JS 文件的小目录上跑了 CLI 版分析(这条命令不需要 MCP 注册,SKILL.md 把它列为 MCP 不可用时的兜底通道):

# 准备最小 fixture:package.json + src/main.js(require 了 electron 和 ./render.js)+ src/render.js
npx -y rea-agents@latest analyze-javascript-application /absolute/path/to/app --json

命令完整跑通,返回一份 Evidence JSON。它的结构和关键实测值如下:

Evidence JSON 实测结构

实测返回的字段结构:evidence_id、模块图、统计、边界声明

几个细节值得点出来。fixture 里那行 require("electron") 被识别成 electron-main:package-entrypoint:src/main.js 节点——静态分析连入口角色都标了出来。statistics 一栏给了 visited_ast_nodes: 57、findings: 5 这样的量化计数。最有人味的是 limitations 数组:六条边界声明的第一条原文是——

CommonJS and ESM binding relationships were recovered from inert syntax and resolved only within the inventoried artifact container.

翻译过来:模块绑定关系是从惰性语法恢复的、只在盘点到的容器内解析——静态结论不冒充运行时观察。这正是第四节「Plan broader investigations」的要求落到实处的样子:每条结论区分观察、推断、未知,引用 Evidence ID,不许暗示静态分析观察到了执行。

翻页机制对应三个工具:会话内用 inspect_analysis_view 按保留的父 Evidence ID 取局部视图;不知道父 ID 时用 get_evidence_bundle 按 SHA-256 或操作类型过滤定位;要完整导出用 export_evidence_bundle 写到指定路径。MCP 报 transport 资源受限时不要重跑,取同会话保留的摘要即可。

宽问题怎么拆、怎么收尾

调查跨多个功能或子系统时,技能要求七步走:把请求变成「问题+所需证据」的清单;先盘点已有会话和分析数据库、复用状态不重复分析;从最小的有用概览开始、按假设批量推进;结论用与问题匹配的证据类型支撑(静态答不了的才上运行时观察);可并行时给每个 worker 划定互不重叠的范围;维护一个把每条结论挂到 Evidence ID 的台账;收尾前复查清单,答了/部分答了/没答逐项标注,宽调查不许在问题没答完时宣称完成。

第五、六节是两条小纪律:references/ 下的六份指南(native、JavaScript、Android、runtime、evidence 各一份)按目标读对应的那份,不全读;调查结束用平实语言解释发现、逐条挂证据,打开了的原生会话用 close_binary 关掉。

边界与已知限制

把散在文档里的硬限制集中列一遍,都是白纸黑字的官方口径:

Node.js 22.19/24.11/26 是硬门槛,Node 20 上 doctor 直接报 URL.parse is not a function(本文实测);原生分析需要 Hopper、Ghidra 或 IDA 之一,setup 可经批准装 Hopper,但永不代装其他引擎;Android 检查需要自带无头 JADX 和完整 JDK;抓包里的 packet 检查限 Linux、要求 util-linux 的 prlimit 和 TShark;WASM 检查要求 WABT 1.0.42;qlog 支持从 aioquic 1.5.0 JSON 0.3 起。技能本身不给运行中的代理加工具——工具注册是 setup 的事,技能只教用法。

还有一条来自官方 README 顶部的安全提示:只从 morluto/rea 仓库、rea.tools 站点或 rea-agents npm 包这三个官方渠道获取 REA,名字相似的仓库或复制的 README 不构成官方身份。

来源与延伸

本文依据 morluto/rea 仓库 main 分支的 .agents/skills/reverse-engineer-anything/SKILL.md(23.5KB 全文)、README 及 npm rea-agents 6.5.0 实测输出整理,命令与引文出自原文;实测环境 Node v20.16.0 / npm 11.17.0 / Linux x64。相关阅读可看本站对 rea-changelog-update 技能的姊妹篇。

评论 (0)