ARTICLE · 1161758
【开源】看不到源码的 App,也能拆成能跑的代码
【开源】看不到源码的 App,也能拆成能跑的代码
界面就摆在你眼前,源码却一行都拿不到。这个卡了很多年的死结,正在被一个 MCP 解开。
有个场面,写代码的人多少都撞上过:看到别人 App 里一个功能做得很顺,想让自己的产品也有,可你手上只有一个安装包。
再换一个更常见的版本。同事离职,留下一个没有任何仓库、没有注释、不知文档在哪的二进制程序,领导说「你维护一下」。最狠的一次是客户直接丢来个装好的软件,一句话:「照着它做一个。」
过去只有两条路。要么开一堆工具,反汇编、翻字符串、手动还原调用链,一天下来只摸清一条分支;要么放弃,用自己的猜测重写一遍,再花几周对齐行为差异。两条路都很贵,而第一条路,对不熟悉逆向的人几乎是关着的。
REA 是什么:给 Agent 装一双透视眼
它叫 REA,全名 Reverse Engineer Anything,作者 morluto,TypeScript 写成,本质是一个 MCP 服务器:把逆向分析工具接到你的 AI Agent 上,让 Agent 自己去看、去问、去追。
据 GitHub 页面,该项目目前已有 6.1 万 Star、1.2 万 Fork,MIT 协议,官网在 rea.tools。
它不是让模型「猜」代码。它把真实的分析过程交给工具去执行,再把结论连同证据一起交回给 Agent。这个区别,决定了它给出来的东西能不能直接用。
二进制也能读:本地逆向引擎,交给 Agent 调
REA 最硬的一块是对原生二进制的分析。它不自己重造反汇编器,而是复用你机器上已经装好的引擎——Hopper、Ghidra、IDA 三选一,装过就能被 REA 调起来。
装好之后,Agent 拿到的不是一段模糊描述,而是伪代码、汇编、字符串、符号,以及调用与引用关系。你也可以自己从终端问同一个问题:
rea analyze /absolute/path/to/program \ --provider ghidra --json
想知道某个地址被谁引用,或者直接看那段地址的反编译结果,各有一条命令:
rea xrefs /absolute/path/to/program 0x1000 \ --provider ghidra --json
rea decompile /absolute/path/to/program 0x1000 \ --provider ghidra --json
再往上一步,rea trace 能把一个关键词在二进制里的整条路径串出来:从字符串,到引用它的函数,再到上一层的调用者。人手动翻这段链路通常要一个下午,交给它只要几十秒。
这里就是它和同类方案的第一处分岔:多数「AI 读代码」工具只处理源码,碰到没有源码的目标直接无能为力;REA 的起点,恰好是没有源码的那一侧。

没有逆向引擎也能开工:JS 和 Electron 走静态读
不是所有目标都值得上反汇编。REA 对 JavaScript 和 Electron 应用走的是纯静态分析——直接读文件,不运行程序,也不需要你先装 Hopper 或 Ghidra。
一个打包好的 Electron 应用,通常是一个 .asar 文件,外面裹着主进程、预加载脚本和一大堆压缩过的模块。REA 能把这层壳拆开,还原出模块清单、模块之间的导入关系、source map、路由表,以及渲染进程和主进程之间那条 IPC 通道。
那条通道恰恰是理解一个 Electron 应用的关键,也是最容易看漏的地方。
.asar 可以直接丢给通用入口:
rea inspect-artifact ./app.asar --json针对解包后的目录,也能跑一次完整分析:
npx -y rea-agents@latest \ analyze-javascript-application /path/to/app --json
和「先手动解包、再满目录搜关键词」的老做法相比,它的价值在于把模块关系一次给全。你搜一个函数名,得到的不只是定义,还有谁在调用它、通过哪条 IPC 传到主进程、最后落到了哪个原生插件上。

每个结论都带证据,否则等于没说
这一点最值得单独讲,也最容易被忽略。
让 AI 解释一段陌生代码,最尴尬的不是它答不出来,而是它答得极其流畅、却错得离谱。没有源码的时候更麻烦:你连对照物都没有,只能凭感觉判断它说得对不对。
REA 的返回里明确带着 evidence(证据)和 limitations(已知限制)。除了「这个功能是这么实现的」,它还会告诉你:这个结论是从哪段反汇编、哪个符号、哪次调用推出来的;哪些部分它没看明白,哪些推断只是候选。
配套还有一整套证据的流转工具。分析结果可以存成快照重复查询,可以导出成规范格式,甚至能把两份分析结果拉出来对比:
rea compare /path/to/evidence/left.json \ /path/to/evidence/right.json
更关键的是它在本机跑。目标应用不上传,分析在你自己的机器上完成,Agent 拿到的只是工具返回的结果。
跟「丢给模型一段代码然后听故事」比,这是两种产物:一个是解释,一个是可以顺着往回查的结论。
目标面很宽:从 APK 到固件,只有一个入口
REA 的覆盖面比「逆向一个桌面软件」宽得多。同一套工具链,换目标不用换工作流:
- 原生二进制
:伪代码、汇编、字符串、符号、调用与引用 - JavaScript / Electron
:模块、导入、source map、路由、IPC、原生插件关系 - 网站
:页面结构、脚本、网络观察,按需截图 - 网络抓包
:从 HAR 或 mitmproxy 捕获里还原请求、响应与载荷来源 - .NET 程序集
:元数据、CIL 指令、声明式原生依赖、构建对比 - Android APK
:清单声明、类、反编译方法与引用 - 固件
:分区识别、解包结果、交给原生分析接手 - EVM 字节码
:分发选择器、字节偏移、推断参数与可变性 - Linux 崩溃现场
:每个线程的寄存器与信号、映射候选 - 进程行为
:终端输出、交互、退出与文件系统观察,可做运行对比
横向看,同类工具大多只覆盖其中一格:抓包工具不认识二进制,二进制工具不认识 Electron,APK 工具又不认固件。REA 把这些收进一个 MCP 入口——对 Agent 来说,这意味着同一套提问方式,能对付完全不同的目标类型。
它怎么设计的:Agent 提问,工具分析,证据回流
把 REA 的流程拆开,其实只有三步。
你的 Agent 提出一个问题,比如「这个应用里的搜索是怎么实现的」;REA 通过 MCP 调用对应的分析工具,在目标上跑分析、追代码;然后把找到的代码、引用关系,以及它自己也没弄明白的部分一起返回。Agent 拿这些材料继续追问、解释,或者直接动手写一版实现并测试。

这里有个设计取舍值得留意:REA 不替你下结论。它把自己定位在工具层,判断留给 Agent,而每一层判断都能顺着证据往回查。这种「可回溯」在工程上比「一步到位给答案」难得多,但它决定了整个结果能不能进生产环境。
快速上手:两条命令接进去

前置条件比想象中轻:Node.js 22.19+、24.11+ 或 26 以上,外加 npm。
接入 Agent 只要一条命令:
npx rea-agents setup选好要接的 Agent(支持 Claude Code、Codex、Cursor、Gemini CLI 等),确认它准备改动的配置,剩下的交给它。安装过程会给你现有的配置留备份,出问题可以回退。装完重启 Agent 即可。
之后直接用自然语言提问,一个命令都不用记:
Understand how search works in the Notes app, show me the evidence, and build a similar feature for my project.想把它当纯 CLI 用,全局装一次:
npm install --global rea-agents rea --help原生二进制分析要先配一个 provider,可以先用这条确认本机环境是否满足:
rea doctor --provider ghidra --json项目迭代速度很快,官方也建议保持更新:
rea update一个细节值得提醒:这个项目还在快速演进,遇到问题先更新再排查。它的 README 里放了三个 showcase 实战案例——用 DX-Ball 还原一段声像计算(据项目方称,重建结果通过了 3205 个原始 x86 用例)、Notion 的 Electron 剪贴板链路、还有 PC-98 老游戏的 16 位弹幕角度计算。看这三个例子,比读一百行介绍更能判断它能不能用在你手上的场景。
最后
如果你的日常里出现过「这个功能别人那儿有,但我没有源码」,REA 值得放进工具箱。
它并没有把逆向这件事变简单——逆向本身没有变简单。它做的是把证据获取这一层自动化,把最耗人的那段交给 Agent。
如果你也踩过「对着别人的界面干瞪眼」的坑,不妨去仓库看看,顺手点个 Star;或者先把它那三个 showcase 读一遍,再决定要不要接进你的工作流。