夜雨聆风学习资料网

ARTICLE · 1161758

【开源】看不到源码的 App,也能拆成能跑的代码

【开源】看不到源码的 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 拿到的不是一段模糊描述,而是伪代码、汇编、字符串、符号,以及调用与引用关系。你也可以自己从终端问同一个问题:

Bash
rea analyze /absolute/path/to/program \   --provider ghidra --json

想知道某个地址被谁引用,或者直接看那段地址的反编译结果,各有一条命令:

Bash
rea xrefs /absolute/path/to/program 0x1000 \   --provider ghidra --json
Bash
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 可以直接丢给通用入口:

Bash
rea inspect-artifact ./app.asar --json

针对解包后的目录,也能跑一次完整分析:

Bash
npx -y rea-agents@latest \   analyze-javascript-application /path/to/app --json

和「先手动解包、再满目录搜关键词」的老做法相比,它的价值在于把模块关系一次给全。你搜一个函数名,得到的不只是定义,还有谁在调用它、通过哪条 IPC 传到主进程、最后落到了哪个原生插件上。

每个结论都带证据,否则等于没说

这一点最值得单独讲,也最容易被忽略。

让 AI 解释一段陌生代码,最尴尬的不是它答不出来,而是它答得极其流畅、却错得离谱。没有源码的时候更麻烦:你连对照物都没有,只能凭感觉判断它说得对不对。

REA 的返回里明确带着 evidence(证据)和 limitations(已知限制)。除了「这个功能是这么实现的」,它还会告诉你:这个结论是从哪段反汇编、哪个符号、哪次调用推出来的;哪些部分它没看明白,哪些推断只是候选。

配套还有一整套证据的流转工具。分析结果可以存成快照重复查询,可以导出成规范格式,甚至能把两份分析结果拉出来对比:

Bash
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 只要一条命令:

Bash
npx rea-agents setup

选好要接的 Agent(支持 Claude Code、Codex、Cursor、Gemini CLI 等),确认它准备改动的配置,剩下的交给它。安装过程会给你现有的配置留备份,出问题可以回退。装完重启 Agent 即可。

之后直接用自然语言提问,一个命令都不用记:

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

想把它当纯 CLI 用,全局装一次:

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

原生二进制分析要先配一个 provider,可以先用这条确认本机环境是否满足:

Bash
rea doctor --provider ghidra --json

项目迭代速度很快,官方也建议保持更新:

Bash
rea update

一个细节值得提醒:这个项目还在快速演进,遇到问题先更新再排查。它的 README 里放了三个 showcase 实战案例——用 DX-Ball 还原一段声像计算(据项目方称,重建结果通过了 3205 个原始 x86 用例)、Notion 的 Electron 剪贴板链路、还有 PC-98 老游戏的 16 位弹幕角度计算。看这三个例子,比读一百行介绍更能判断它能不能用在你手上的场景。

最后

如果你的日常里出现过「这个功能别人那儿有,但我没有源码」,REA 值得放进工具箱。

它并没有把逆向这件事变简单——逆向本身没有变简单。它做的是把证据获取这一层自动化,把最耗人的那段交给 Agent。

如果你也踩过「对着别人的界面干瞪眼」的坑,不妨去仓库看看,顺手点个 Star;或者先把它那三个 showcase 读一遍,再决定要不要接进你的工作流。

相关学习资料