ARTICLE · 1147890
馋别人 App 里那个功能?AI 不用源码,一层层拆给你看
我至今记得第一次在 Notion 里复制一段带标题和列表的内容,随手粘进备忘录,格式居然原样还在,那一下心里直馋。可它怎么做到的,我一点都不知道,那套软件对我就是个焊死的黑箱,想偷师,连从哪儿下扳手都不知道。现在我可以让 agent 把这个黑箱一层层拆开,每一层看到了什么、凭什么下这个结论,全都附上证据摆给我看。
今天聊的东西叫 REA,全称 Reverse Engineer Anything,GitHub 上的项目 morluto/rea。它不是一个新的逆向软件,它是一个 MCP server,一层插座,插在 agent 身上。
MCP 是 agent 接外部工具的那层标准接口。REA 插上之后,你看到任何 app 里让你心动的功能,都能用大白话让它去查,没有源码也查。分析全程在你自己机器上跑,不把 app 往外传。安装也轻,Node 22 以上,一行 npx rea-agents setup,选你用的 agent,确认改动,重启就完事,Claude Code、Codex、Cursor、Gemini CLI 都在支持列表里,项目本身是 MIT 协议。
最打动我的是它的规矩。每个结论都要带两样东西,证据和局限性。它看到了什么、证据落在哪个文件哪条指令,会告诉你;哪部分没看实、只能靠推断,也会告诉你。一个工具肯把“我不确定”写进交付物里,我对它反而多信一分。
这其实立了一个很朴素的信任逻辑。
我可以容忍你看不全,但我不能容忍你装作全看见了。
逆向这门手艺天生就在跟不完整的信息打交道,二进制里没有注释,符号经常被剥掉,很多地方只能靠上下文猜。高手和外行的差别,往往不是谁猜得准,而是高手始终分得清哪一步是看见的,哪一步是推的。REA 把这条高手的自觉,硬写进了输出格式里。
README 里列了 12 类能拆的目标,原生二进制、JavaScript 和 Electron 应用、网站、.NET 程序、Android APK、固件、EVM 字节码、网络抓包、崩溃记录,一路到进程的实时行为。我不打算照着清单念,挑它作者放出的三个真实拆解,跟着走一遍,你就知道这东西什么手感。

第一案,一次复制要过三座桥
Notion 是个 Electron 应用,外面套着原生壳,里面跑的是网页。我以前一直以为按一下复制,就是系统顺手帮我把文字拿走,一行代码的事。
agent 带我走的第一站是渲染进程,也就是你眼睛看到的那个界面。界面里的 JavaScript 调了剪贴板 API,这是纸条递出来的第一站。
紧接着它指给我看 preload 桥。Electron 里网页和系统是被刻意隔开的,网页没资格直接碰系统资源,preload 就是中间那道门,纸条到这儿被检查、被转手。
过了这道门是 IPC,进程之间通话的通道。消息沿着通道进主进程,主进程才真正有权限调用系统的原生剪贴板。而最后落进剪贴板里的东西,也不是一段光溜溜的纯文本,是一份打包好的富文本,标题、加粗、列表,全装在里面。

走到这儿,我第一次“原来如此”。
一次复制粘贴,原来是 app 内部三个世界在递纸条。
格式不丢,是因为递过去的本来就不是纯文字,是一份打包好的富文本。我读不懂它的代码,但我全程跟得上,因为每跳一层,agent 都把证据点给我看,剪贴板 API 在哪、preload 暴露了哪几个方法、IPC 通道叫什么名字,全都有具体位置,点过去能验。
看不懂代码,看得懂证据链。
这是那天我最大的感觉。
这中间藏着一个我后来才想明白的转变。过去想知道一个功能怎么实现,你得自己先学会读那门语言,读汇编、读混淆过的 JavaScript,门槛把好奇心直接挡死。现在读代码的苦活由 agent 承担,你做的是另一件事,顺着它给的证据往回走,看这一跳是不是真的接得上上一跳。这不需要你会写代码,但需要你敢问一句,凭什么。
第二案,十六位指令里的弹幕算术
可我马上替自己问了一句。Electron 再难,也是 JavaScript 裹的网页壳,静态读文件就能看,真遇上没源码的老游戏、真刀真枪的二进制,它还行不行。
作者放了两个更硬的案子。
一个是 TH04,东方项目早年在 PC-98 上跑的 DOS 游戏。agent 钻进当年的 16 位指令,把游戏里一圈弹幕怎么摆的计算恢复了出来,一个固定角,加一个朝玩家方向的瞄准角,逐环铺开。那就是你当年怎么扭都扭不干净的一圈子弹。另一个是 DX-Ball,它跟着一次声音调用,找到把位置换算成声像平移的小函数,把反编译器给出的不完整伪代码,重新写成了干净的 C。

光说恢复,不算数。
DX-Ball 重建出来的 C 代码,拿去跑 3205 个原始 x86 用例,全部通过;重新编译之后,函数里 63 个字节和当年的原物逐字节一致。TH04 则是把弹幕的角度计算从十六位指令里恢复成了干净的代码,逻辑一步步对得回去。
这是更响的一个“原来如此”。三十年游戏里那圈追着你跑的弹幕,背后只是一段朴素的角度算术;而“懂了”的证据,是你重建的东西和原物一个字节都不差。我读到这个数字的时候停了好一会儿。我们平时张口就说“我懂了”,有几次敢拿这个标准对自己。
结论敢叫结论,是因为身后压着可重复的验证,而不是一句“模型认为”。
我特别想说清楚 63 个字节这个数字为什么重。反编译器给的伪代码几乎总是缺东西的,寄存器怎么用、调用约定对不对,它常常猜。你看着伪代码觉得“我懂了”,那很可能只是读懂了一个故事。只有把你重建的逻辑重新编译,和原物放在一起一个字节一个字节地比,比到完全重合,才敢说你恢复的是当年那段程序,而不是你脑补的那段。3205 个用例保证行为一致,63 个字节保证实现一致,这两层叠起来,才把“猜”变成了“证实”。
干活的还是老师傅
说到这儿,得拆穿一件事。真正干活的不是 REA。
这些都是各自领域里磨了很多年的老工具,老师傅:
• 原生二进制:Hopper、Ghidra、IDA • Android APK:JADX • 固件:Binwalk 和 Unblob • 网页:Chrome 系浏览器
REA 做的事,是把这些工具接到 agent 身上,照着你的问题把流程串起来,该读文件读文件,该进反编译器进反编译器,再把结果连同证据一起收回来。
所以我给自己写了一句话。
agent 操作工具,人操作 agent。

门槛是被搬走的,不是被拆掉的
以前逆向工程是高手才配碰的手艺。你要装得懂 Ghidra,读得动汇编,很多判断靠多年手感,门槛立在工具和经验上。
现在工具由 agent 去操作,门槛没有消失,它搬家了。新的门槛是,你会不会描述自己到底想看什么,会不会读证据,能不能分清哪句结论是实的、哪句是模型在猜。
手艺也没有消失,它从“手会操作”上移到了“脑会判断”。说实话,我觉得后者一点不比前者轻松,提问和质证都是要练的本事,但它的入口,对普通人敞开了。
我自己总结了怎么读这种带证据的结论,三步:
1. 先看证据落点:它说的每一层,有没有具体的文件名、函数名、指令地址,落不到具体位置的结论先打个折。 2. 再看验证方式:它是只读懂了,还是像 DX-Ball 那样真的跑了用例、做了比对,读懂和证实是两回事。 3. 专门去找它标“不确定”的地方:如果一份结论处处都敢拍胸脯,我反而警惕,愿意承认不确定的那个,通常更值得信。
这三步不要求你懂技术,只要求你不肯照单全收。
你今天就能用的一句话
哪怕你和我一样,一辈子不打算碰逆向,这套方法今天就能用。以后让 AI 解释任何你好奇又看不懂的软件,我都会在问题后面加一句:
“拆给我看,它经过哪几层,每层附上证据,最后标出你不确定的部分”。
就这一句,能挡掉不少一本正经的胡说。它逼着 agent 把推理摊开,也把判断权交回给你。用得多了,你会练出一种手感,哪条证据是硬的,哪个结论其实站在一层假设上。
我还会顺手再追两句:
• 证据能给我看原文吗——防止它拿二手转述糊弄; • 如果这里你猜错了,最可能错在哪——逼它把假设自己抖出来。
别担心问得外行,在这件事上,愿意追问的外行,比照单全收的内行更接近真相。
REA 也不是这周唯一的一棒。前面有 openrig 让 agent 接管组队协作,REA 让 agent 接过去一门高阶手艺。再往后想,当各种手艺都能打包成“技能”,标准谁来定,入口握在谁手里,Anthropic 和几家大公司已经开始各立门户。这事我还在看,不急着下结论。
我只知道一件事。从我能让黑箱一层层打开、还要求它每层出示证据的那天起,那个在 Notion 面前干馋、连扳手都找不到的我,算是不用再馋了。下一个让你心动却看不懂的功能,你打算先拆哪一个。