这两天公众号在传一个叫 REA 的项目,稿子标题很唬人:《软件完蛋了吗?REA 三天狂揽 12 万星:无需源码,Agent 就能克隆一切软件》。
我没跟着转发。先把它的仓库认真读了一遍——README、仓库守则、CLI 契约、MCP 契约、测试文档,然后翻出自己这几个月真用 Agent 拆过的两个 App,对着看了一遍。
结论两句话:“软件完蛋了”是标题;”读懂别人的二进制”这件事的门槛,确实塌了一大块。
先说那个星数
稿子是 10 月 12 日发的,说仓库页面上有 12 万颗星。我今天(10 月 14 日)直接查了 GitHub API:206,527;它仓库 README 里自己挂的星数横幅还写着 180,000。
星数不是质量指标,这点我写过不止一次。但有个判断我必须当场翻案:REA 不像”三天攒出来的壳子”。
我扒了下它的仓库结构:
- 3974 个文件,其中 2677 个
.ts、1558 个测试文件; - 26 个 GitHub Actions 工作流,一大半名字带
real-前缀——真 Ghidra(含 Windows)、真 Hopper、真浏览器、真 APK、真固件、真 pcap、Termux 上跑……全部进 CI; - 测试文档
docs/testing.md有 1359 行,专门有一节叫”Real-toolchain verification lanes”; - npm 上的包
rea-agents7 月 12 日首次发布,10 月 11 日已经到 6.4.0,三个月 31 个版本。
这是个有工程纪律的项目,不是对着风口临时搭的演示。
REA 到底是什么
去掉流量话术,一句话:它是一个本地跑的 CLI + MCP server,把你的编程 Agent 接到逆向工具上。
它支持 Claude Code、Claude Desktop、Codex、Cursor、Gemini CLI、Windsurf、Kimi Code、Qwen Code、VS Code、Trae、ZCode 等十几个客户端,装法就是一条命令:
|
setup 会先把”要改哪些文件、要装什么、备份在哪”列给你看,你批准了它才动手。
几个我认为值得说道的点:
- 它自己不是反编译器。 Ghidra 是 2019 年开源的,Hopper 能追到 2011 年,IDA 是上世纪 90 年代就在用的东西——一个都不新。REA 干的是调度:把”人工在各个工具之间来回倒腾”的那些步骤,变成 Agent 能调、带回证据的 workflow。
- 本地分析,不上传目标。 但 README 也很直白地写着:模型侧有它自己的数据政策。所以”分析不出门”不等于”数据不出门”,这两件事得分开看。
- 工具自带,不替你装。 Ghidra、IDA 用你自己已有的安装;只有 Hopper 会在你明确批准后才提装。仓库守则里写死了:安装程序不许顺手装或升级 Node、npm、Java、Homebrew、Ghidra、IDA、JADX、Binwalk。
- 许可证是 MIT。
最后这条我特别看重。被”一条命令装完世界、顺便把你环境搅烂”的脚本坑过几次之后,一个明确承诺不碰你其它软件的安装器,比多支持两个格式值钱。
能拆的东西,比稿子里列的多
稿子说它”覆盖原生二进制、程序包、Electron、网站、.NET、版本差异”,那是挑了标题能写的。文档里的清单长这样:
| 目标 | 拿回来什么 | 前置条件 |
|---|---|---|
| 原生二进制(Mach-O / ELF / PE / .app) | 伪代码、汇编、字符串、符号、调用与引用 | Ghidra / Hopper / IDA |
| JS / Electron(目录或 ASAR) | 模块、导入、source map、路由、IPC、preload 边界 | 不用引擎,纯静态,不运行 App |
| .NET 托管程序集 | 元数据、CIL、声明的原生依赖、构建对比 | 不用引擎,纯静态 |
| Android APK | manifest、类、反编译方法、引用 | headless JADX + 完整 JDK |
| Android 真机 | 设备、包、进程、日志、dumpsys、截图、文件收发 | 你自己的 adb |
| 固件 | 分区、解包结果、交给原生分析 | binwalk / unblob |
| 网站 | 页面结构、脚本、网络观察、你要的截图 | 本地 Chrome 系浏览器 |
| 抓包(HAR / SAZ / mitmproxy) | 请求、响应、暴露的载荷、源码位置 | — |
| pcap / 逻辑信号录音 | 端点、DNS、TLS SNI、协议分布 / 解码标注 | tshark / sigrok-cli |
| 崩溃现场、Go / Rust 二进制、WASM、EVM 字节码、SQLite | 寄存器与信号、编译器版本与依赖、导入导出、分发选择器与推断参数、表结构 | 各自说明 |
顺带解释一下稿子里那句”我拿剪映试了试,底裤都没了”:拆 Electron 应用根本不用逆向引擎,静态把 ASAR 拆开、顺着 IPC 和 preload 一路读就能到实现,属于这里门槛最低的一档。真正难的是带壳带反调试的移动端 App。
我觉得最值钱的设计:证据合约
如果 REA 只是”给 Agent 配了个反编译器”,我不会写这篇文章。它真正的创新在结果的形状上:每条输出都带三样东西——覆盖率(coverage)、局限性(limitations)、未知项(unknowns)。
举几个它文档里的硬规定:
- 比较两个版本时,必须图的成员完整、遍历覆盖完整,才允许下”相等”的结论;否则只能是”截断”或”未知”;
- 空的调用列表 + 不完整的覆盖,不等于这个函数没有调用者(原文:
An empty call list with partial or unknown coverage is not proof that the function has no calls.); - 静态产物相等,不能推出运行时行为没变;
- 要区分”我观察到了它是空的”和”我压根没观察”——两者都是空集,意义完全不同;
- 它的仓库守则第一条就是:分清观察、推导、推断、未知这四种东西,别混着写。
大模型做逆向,最讨厌的不是能力不够,而是看起来很懂地胡说。REA 把”我不知道”变成了接口里的一个字段。这比多支持一种文件格式重要得多。
那我自己拿它干了什么
讲两句实话先说在前面:**我不读汇编。**我之前那篇 unidbg 笔记的结论就是”不读汇编,直接把 native 的启动协议跑出来给它看”。所以按老规矩——查工具、啃 API、在符号表里翻、手画调用图——这类活对我来说基本是”想都别想”。
一、把一加的「禅定空间」拆了,自己做了一份
我的需求很具体:晚上 22:00 到第二天 6:00,手机只让接电话,其它一律别想用,重启也没用,界面上要显示还有多久。
一加(OPPO 系)正好有个现成的功能叫「禅定空间」,我把它的 APK 直接丢给 Agent 让它拆——com.oneplus.brickmode 16.7.3,55 MB 那个。

拆完我拿到的不是源码,是一条骨架。这类”空间”的关键从来不在那张卡片 UI 上,而在三件事:哪些 App 被挡在外面、按什么进度放人、会话状态存在哪里(它那几个值放在能被框架读到的位置,所以到点真的能”放人”)。
然后我照着骨架,用 AOSP 自己的机制重做了一遍:
- 拦截点放在 framework 的
ActivityStarter.startActivityInner(),只放行白名单。为什么是这儿——它是所有启动路径唯一的汇聚点。我第一版挂在ATMS.startActivityAsUser上,通知点击和最近任务是从别的路绕过去的,等于留了”点一下就能进微信”的口子; - 禅定页做成
/product/priv-app里的 kiosk(lock task),home、最近任务、状态栏全禁; - 加一个每 30 秒的看门狗:时段内顶层既不是禅定页也不在白名单里,就把禅定页顶回来(不改通话界面——来电时顶层是拨号界面,无脑盖上去会变成”接得起来、挂不掉”);
- 会话状态写进
Settings.Global,框架侧读同一批键。
现在我的版本做成两种:超禅(白名单空、不给退)和轻禅(白名单可用、随时能退),每晚 22:00 自动开始。

补一个诚实的细节:我 10 月 11 日拆这个 APK 的时候,REA 还没装到我这台机器上(它的技能是 10 月 13 日才装的)。那次就是 JADX 加 Agent 硬啃。REA 的价值在于把这件事变成一套能重复的流程:APK 走 headless JADX,资源走 apktool,报告自带覆盖率与未知项。
二、把运动 App 的 GPS 轨迹数据摸清楚
上半年我给自己写了个运动 App(RUNNINGGO),目标是让华为手表上的运动数据、连同心率和 GPS 轨迹,都收到我自己的库里。
抓包这条路是断的:华为运动健康对它的域名做了证书固定,系统里装了 CA 也照样握手失败——这条坑我记在 phone-tools 的说明里了。最后能走通的,是把手表和 App 之间那套轨迹数据摸清楚:轨迹点怎么组织、怎么解出来、怎么按同样的方式构造回去。
这件事如果按老办法,是”要懂汇编、懂逆向、懂协议”三合一的手艺。**我一个都不懂。**它实际长这样:让 Agent 去读、去试、去比对,卡住了换个说法再来一轮。
从”我想知道这东西怎么组织的”到”我自己那条链路跑通”,这类问题一轮下来大概一小时。这在以前不是”我花久一点也能做”,是”我根本不会开始”。
但”软件完蛋了”是标题
那篇稿子里真正清醒的不是开头,是结尾。稿子引用的两位从业者的判断我觉得都对:
技术专家徐昊:克隆能拿走的是代码,拿不走的是知识……”软件本身不是产品,软件中的知识才是”。
QuickCreator 联合创始人阎志涛:REA 确实会进一步影响软件行业的生意模式,但要说这是软件的末日,我不认同。
稿子自己的推论我也认同:如果源码一旦可以获得、软件生意就无法继续,那开源软件的商业模式早就应该不存在了。
这个推论的答案就在 Red Hat 身上:代码大家都能下,企业仍然年复一年地买订阅——买的是”面向生产的软件、生命周期管理、兼容性、补丁、以及出问题时的专家”。这些活不会因为代码公开就自动完成。
我想补的是另一面:**能读懂别人的实现,和你有自己的产品,是两件事。**REA 给你的是伪代码和证据,不是生意。反过来也一样,稿子里说”克隆潮已经来了”,但真正会死掉的,从来不是”代码被别人看到了”的公司,而是产品本身没什么可留下的公司。
真正被改写的,是成本曲线。以前”读懂一个二进制”是一门要练几年的手艺;现在它是一件可以下单给 Agent 干、你自己负责核验的活。省掉的是体力活,剩下的全是判断力。
顺便记一笔账,因为 token 才是真正的账单:REA 的技能元数据里写着 170 个工具,一次分析的结果可能有几百 MB(官方例子:334 MB 的 Obsidian 证据文件,压成一份约 10 KB 的摘要视图)。稿子里那位拆 Unity 游戏的安全人员烧了 4000 万 token,约 27 美元。所以官方文档把”省 Agent 的 token 和上下文”列为第一条优化目标——先要 summary,再要细节(detail: "summary",然后用 inspect_analysis_view 翻模块页)。
我接下来怎么用它
- 老软件、老库:先把 summary 拿到手,再定点 decompile,不上一来就全量;
- 互操作:车机那套(方向盘语音点歌的广播协议是我一点一点黑盒摸出来的)、手表那套;
- 守边界:只拆我拥有的、或明确获授权的目标;商业工具(IDA / Hopper / JEB)自己合法持有,别碰破解版——它的 README 和 DISCLAIMER 也是这个口径;
- 先问”值不值得逆”:这是我在那篇 unidbg 笔记里花了两天买到的教训——先量链路,别先假设被风控。工具越好用,越容易一头扎进不值得逆的目标里。
20 万星会掉,REA 也会被更新的东西取代。但这几个月我真切体会到一件事:
能把一个二进制用自然语言问明白的人,和不能的人之间的差距,已经不是”会不会汇编”,而是”知不知道要问什么、拿到答案之后能不能判断真假”。
评论
0 条评论