夜雨聆风学习资料网

ARTICLE · 1173406

REA九天15万星:没源码也能查崩溃,你的客户端先裸了

REA九天15万星:没源码也能查崩溃,你的客户端先裸了

10 月 4 日晚上,这个仓库 1513 颗星。今早 154671 颗。中间隔了九天。

它叫 REA(Reverse Engineer Anything),现在是 GitHub 上星数涨得最快的项目之一。中文媒体的标题大致是:软件末日、闭源护城河崩塌。

这些我不想重复。对运维来说,这件事有两个更实际的后果:一是你手上多了一个过去没有的排查手段;二是你负责发布的东西里,有一部分过去靠“没人有空读”保护着,现在这层保护没了。

第二件比第一件重要得多。

REA 的位置:Agent 发问 → MCP 调度层 → Ghidra / IDA / JADX / 固件 / 浏览器等引擎 → 带着证据返回

一、先说清楚它到底是个什么

REA 不是反编译器,也不是模型。它是管道。

它是一个 MIT 协议的 MCP 服务加命令行工具,TypeScript 写的,仓库 4 月就建了,不是蹭热度的空壳。跑一条 npx rea-agents@latest setup,它会注册进 Claude Code、Codex、Cursor 等 17 种客户端,再塞一份 skill 文件教 Agent 怎么开展调查。

Agent 读不懂二进制,REA 给它眼睛。但眼睛背后全是老工具:Ghidra(2019 年开源)、IDA(上世纪 90 年代就在用)、JADX、Apktool、Binwalk、pwndbg 等——它做的是把这些各有 CLI 和会话状态的专业引擎,统一到一层调度里。

所以内行评价它有点刻薄:“氛围逆向”——但门槛被打包掉,本身就是价值。

官方演示里问它“Windows 计算器里 200 + 10% 为什么等于 220”,返回的是 0x5b、0x5c 两个分支常量,要靠对照微软公开源码里的 IDC_DIV(91)、IDC_MUL(92) 才得出“百分号取的是第一个数的百分比”。

关键不在答案,在于它把砖头连同结论一起给了你——指令、常量、调用者都在,你能自己核对。这是全文最值钱的部分。

二、运维能拿来干的三件事

官方目标表很宽,挑对运维最有用的几类:

目标
走什么引擎
运维能用来干什么
原生二进制ELF / PE / Mach-O
Ghidra / Hopper / IDA
闭源服务崩溃定位,查它卡在哪个分支、读了哪个常量
Electron / JS 应用
纯静态,不用起引擎
梳理模块、IPC 通道、preload 与 source map,不用运行程序
打包件APK / IPA / ASAR / ZIP
JADX / Apktool
不解压先出文件清单,排查内部工具与移动端产物
应用的两个版本
版本差异分析
生成变更报告
——升级前先看清二进制层面动了什么

最后一行我最想推荐:重建别人的功能多数人用不上;但升级前看清两个版本差在哪,是每天都在做的事——以前只能读 changelog,现在可以自己出一份。

内部运维客户端如果是 Electron 写的,以前出问题只能看日志猜,现在能看进去了。上手只要一个要求:Node.js 版本。

# 硬要求:Node.js >= 22.19(24 线需 >= 24.11)npx rea-agents@latest setup# 或直接把这句丢给你的 Agent(官方 README 原话)Install REA and connect it to this coding agent usingnpx rea-agents@latest setup. Show me the setup plan forapproval, then verify the installation.# 提问就是一句大白话(官方示例)Use REA to inspect Windows Calculator. Why does 200 + 10% give 220?

三、最值得抄的不是逆向,是“证据契约”

REA 的 roadmap 里有一条准入规则,新工具必须 preserve observations and unknowns(保留观察到的和无法确定的)。

它返回的不只是伪代码,还有每条结论背后的指令、调用者、常量,以及它没能解析出来的部分。就像翻译把原始录音连着文稿一起递给你。

这条规矩跟逆不逆向无关,却最值钱。

我们自己让 AI 看日志、看 core dump、看配置文件,最大的坑不是它看不懂,是它看不懂也照样给你编一段。REA 把“必须声明不确定项”写成了工具契约,而不是提示词里一句软绵绵的要求。

这个可以直接抄。给你现有的运维 Agent 加一条硬规矩:

分析任何日志 / core dump / 配置文件时,输出必须分成三段:【已观察到】只写你在输入里真正看到的字段、数值、堆栈帧,    每条附出处(文件名:行号 或 日志时间戳)。【推断】      写你的判断,并说明依据。【未能确定】明确列出没能确认的部分,禁止用推测填充。# 任一段缺失即不合格;"未能确定"为空时须写明"已覆盖全部输入"。

区别在哪?提示词里的要求是建议,模型可以“贴心”地省略;写成输出结构里的必填分段,缺一段就是格式错误,程序能拦下。能自动校验的规矩才叫规矩。

四、防守:有一半暴露面是建立在“看不懂”上的

这条是我自己的判断:很多内部系统的安全性,其实是“没人有空读”凑出来的。客户端硬编码的内部 API 路径、Electron 的 asar 包(里面基本等于开源的 JS 源码)、忘了删的 source map、没剥的调试符号、固件默认口令——这些过去技术上可见、实际上没人看,现在门槛掉到一个提示词。

有个独立实测可以作证(10 月 12 日,开发者 Vito Ruocco):他写了个 20KB 程序,编译时把所有符号全剥掉,让 REA 加 Ghidra 从 exe 单独去拆——两个隐藏行为都被找出来,Agent 用 JavaScript 重写的版本在 811/811 个声像位置、1200/1200 次授权校验上与原程序完全一致。

剥离符号不再是有效保护。这句话做发布流程的人该记住。

所以建议今晚就往发布流程里补几条,都是能进 CI 的硬检查:

# 发布前新增 6 项,建议直接进 CI 门禁# 1. 确认发布产物已剥离调试符号file ./bin/app | grep -q "not stripped" && exit 1# 2. source map 不上生产:产物里命中 *.map 即失败find ./dist -name "*.map" | grep . && exit 1# 3. Electron/asar 包内不留内网域名与硬编码密钥npx asar list app.asar | grep -Ei "\.env|secret|key" && exit 1# 4. 客户端代码一律当公开代码审:无内部接口路径、无默认口令# 5. 固件:改默认口令与默认证书,扫描产物里的私钥匙# 6. 服务端留痕:客户端可见的接口必须有速率限制与异常告警

第 4 条最容易被跳过,也最重要:客户端里的每一行代码,从今天起按“它一定会被人读到”来写。这本是安全常识,区别在于它现在成了发布流程里必须有人签字的一栏,而不是评审 PPT 里的一句原则。

五、边界:别急着上生产

热度高不等于能进生产。几件事得先知道:

1. 它自己不拦你

官方 4.0.0 的 release note 写着,移除了工具层的权限配置、策略命令和审批字段——REA 不做任何拦截,闸门全在模型侧和法务侧。组织内部用它,技术刹车是没有的。

2. 版本节奏非常野

版本
改了什么
对使用的影响
4.0.0
移除工具层权限配置、策略命令、审批字段
REA 自身不再做任何拦截
6.0.0
MCP 文件系统输入必须是宿主机绝对路径
路径写法收紧,自动化脚本要跟着改
6.4.0
新增 ADB / Apktool / JEB;JS 分析加资源上限
超大 bundle 返回部分事实 + 显式未知,而非直接 OOM

九天发了 11 个版本,其中 3 个是带破坏性变更的大版本。README 自己写着“REA 变化很快,请保持更新”——反过来读就是:别把它钉在生产流水线上。

3. 几个还没答案的问题

  • fork 率 23%
    (35593 / 154671)明显偏高。有人怀疑刷量,也有人说只是怕被下架先存一份——数据判不了,心里该有数。
  • 模型拒答没解决。
    同一套手法找漏洞同样成立,但官方 issue 里搜 refus 零结果,README 也没提。真正的闸门是模型的安全策略。
  • 分析在本地,结果不在。
    二进制不上传,但伪代码要发给模型——指向 NDA 材料前,先读一遍模型供应商的数据条款。
  • 能力有天花板。
    多 GB 的固件塞不进上下文;x64dbg 和 IDA Pro 不能无头驱动;弱模型会跑出看似合理但错的结论。

顺带辟个谣:中文圈传的“Adobe 全家桶被 REA 拆了”,目前没有证据。那是有人用 Rust 加模型写的七个 Adobe 风格应用,仓库里没有任何反编译二进制的动作。

写在最后

REA 改变的不是“软件有没有价值”,而是软件的价值靠什么支撑。克隆能拿走代码,拿不走知识——还原出代码和理解软件之间还隔着一层。护城河没消失,只是换了位置。

排查手段多一个,是好事;暴露面要重算一次,是代价。这两件事是同一枚硬币,别只接好处那面。

今日互动:你负责的系统里,有没有哪样东西是靠“没人看得懂”在当防护的?客户端硬编码的地址、忘了删的 source map、没剥的调试符号、固件默认口令——说出一样来就行。评论区聊聊,觉得有用点个赞、转给管发布流程的同事。

相关学习资料