REA 逆向一切
2026 年 10 月,一个叫 REA(Reverse Engineer Anything)的开源项目突然在 GitHub 上爆红。短短半个月,Star 数量从几十个飙升到 30 多万。
顾名思义,REA 就是「逆向一切」。
它让 AI Agent 能够借助 IDA、Ghidra 等专业工具,在没有源代码的情况下分析软件,理解其内部逻辑,甚至尝试复现原有功能。
REA 在技术圈引发了不小的轰动。它让原本需要专业工程师花费大量时间完成的逆向分析,开始有可能通过自然语言交给 AI 来完成。甚至有人担心,软件会不会从此变得可以轻易复制?
看到 REA,我突然想起了十多年前做过的一个项目。
那时候没有 AI Agent,面对一个没有源代码的程序,只能自己一点点分析、猜测和验证。
Dialog
故事要从 2011 年前后说起。
当时,我的同事 Luke 通过他的一位同学接到了一个项目。这位同学在国内为一名意大利老板工作,主要负责寻找供应商、跟进产品开发和订单,类似采购代理的角色。
这位意大利老板开发并销售一款名为 Dialog 的产品。
Dialog 是一套面向沟通障碍人士的辅助沟通系统。使用者可以点击屏幕上的图片或文字,让设备播放相应的语音,以此表达自己的需求。例如,点击水杯图片,设备就会说出「我想喝水」。除此之外,它还支持图片、视频、录音、绘画等功能。
AAC辅助沟通系统。
Dialog 最初运行在一套基于 x86 架构的专用设备上,屏幕大小和 iPad 差不多,但机身相当厚重。
2010 年,苹果发布第一代 iPad,随后各种 Android 平板也开始涌现。相比之下,原来的 x86 设备显得有些笨重,成本也缺乏优势。
意大利老板看到了机会,希望将 Dialog 移植到 Android 平板上,这项开发工作最终交给了我们。
Android 版本主要由 Luke 负责开发。项目顺利交付,客户对结果也相当满意。
有了第一次合作的基础,他们很快又带来了一个新项目。
这一次,事情就没那么简单了。
EyeTech
这次,客户希望在 Dialog 的基础上扩展一种新的交互方式,让那些无法正常使用双手的残障人士,也能通过眼睛操作设备。
简单来说,就是通过眼球运动控制屏幕上的光标,再通过眨眼等动作完成点击。
为此,他们已经集成了一套来自 EyeTech 的眼球追踪系统,使用效果相当不错。
唯一的问题是价格:一套高达一万美元。
于是,客户问我们,能不能「复刻」一套。
原装设备与复刻版的外观对照。
我们拆开设备研究了一下,发现硬件结构并不复杂:核心是一个工业级黑白摄像头,周围布置了一圈红外光源。摄像头通过红外照明捕捉瞳孔及角膜反射等特征,经过一次屏幕五点校准,就能根据眼部特征的变化计算光标位置,实现眼球控制。
原装设备与复刻版的内部结构对照。
我们很快找到了摄像头的型号,零售采购价大约 3000 元人民币。加上红外灯板、外围电路和外壳,整套设备的 BOM 成本估计只要 4000 元左右。
一套售价一万美元的产品,硬件成本居然只要四千元人民币?
当然,我们也清楚,真正值钱的可能不是硬件,而是背后的眼球追踪算法。
那么,软件怎么办?
SourceForge
硬件有了眉目,接下来就是软件。
我们尝试从开源项目中寻找解决方案,于是找到了 SourceForge。
对于今天的程序员来说,GitHub 可能更加熟悉。但在当年,创立于 1999 年的 SourceForge,是全球最重要的开源软件平台之一,大量开源项目都托管在上面。
印象中,我们当时找到了一个叫 EyeTrack 的开源项目,也研究了一些相关实现。
但很快发现,这些项目距离商业化还有相当大的差距。毕竟,能够演示眼球追踪,和真正让用户稳定、准确地控制光标,完全是两回事。
而且,客户希望尽可能沿用原来的 EyeTech 软件,以保持一致的使用体验。
于是,我们换了一个思路:
既然硬件可以复刻,为什么不试着让原版软件直接运行在我们的硬件上?
Hook
我们继续分析 EyeTech 的硬件结构,发现摄像头直接连接到电脑,外围 PCB 主要负责控制红外光源,让瞳孔在摄像头下呈现明显的特征,看起来并没有独立的图像处理系统。
这让我们产生了一个猜想:原版软件可能仅仅依靠摄像头采集的影像,就能完成眼球追踪和光标控制。
由于我和 Luke 对硬件都不算熟悉,于是找来了另一位同事 Fox。他在硬件方面比较有经验,负责这个项目的硬件开发。
Fox 很快做出了一套硬件原型。我们接上电脑,尝试运行 EyeTech 的原版软件。
没想到,软件真的识别到了我们的设备!
但要进一步使用,还需要输入一个与硬件序列号对应的密码。
经过分析,我们发现软件读取的序列号,其实就是摄像头自身的序列号,而且是通过摄像头驱动的 DLL 获取的。
这让我产生了一个想法:能不能通过 DLL Hook,拦截读取序列号的函数,让它返回我们指定的序列号?
进一步研究摄像头的技术资料时,我又发现它有一块可以持久化保存数据的存储区域。于是想到,可以把一个已知密码对应的序列号写进去,再通过代理 DLL,让软件读取到我们预设的数据。
我很快写好了这个 DLL,测试了一下。
果然,原版软件顺利通过了验证,眼球追踪功能也正常运行。
为了让整个安装过程更加「优雅」,我还特意对原版安装程序做了点手脚:安装过程中悄悄把原来的 DLL 替换成我「加工」过的版本,让这一切对用户完全无感。
不过,这个方案还有一个隐患:我并不知道原版软件是否也会使用摄像头那块存储区域。万一其中的数据被修改或重置,方案就可能失效。
为了彻底搞清楚,我决定进一步逆向原版程序。
IDA Pro
于是,我祭出了自己压箱底的家伙:IDA Pro。
说实话,一开始并没有什么明确的头绪,只是想看看原版软件究竟调用了摄像头驱动的哪些功能。
结果在分析过程中,我无意中发现,程序的静态数据区里有一大片连续的 32 位整数。
这些数字怎么看着有点眼熟?
我试着搜索了一个已知的密码,竟然真的找到了。
顺着代码继续追踪,终于弄清楚了其中的逻辑:原来程序里直接保存着一张包含 1000 个密码的表。
更让我意外的是它的验证方式:程序只需要将摄像头的序列号除以 1000,取余数作为数组下标,就能从表中找到对应的密码。
没有复杂的加密算法,甚至连像样的混淆都没有,就是一次取余运算,加一次数组查询。
我当时真是又惊又喜。
惊的是,一套售价一万美元的产品,授权机制竟然如此简单;喜的是,之前折腾的 DLL Hook、序列号替换,原来都不需要了。
我很快写了一个 Keygen(密码生成器),输入摄像头序列号,就能生成对应的密码。
拿我们的硬件原型测试了一下。
果然,验证通过。
折腾了这么久,最后的解决方案竟然只是一个简单的取余运算。
不过,这也正是逆向工程有意思的地方:你永远不知道,下一步会发现什么。
120 万
技术上的几个关键问题解决之后,项目也到了谈价格的阶段。
我们的硬件 BOM 成本大约 4000 元人民币,计划以每套 10000 元的价格卖给客户,单套毛利约 6000 元。客户也表示,第一批可以采购 200 套。
简单算一下,120 万元的毛利。
而实际上,我们并不需要重新开发复杂的眼球追踪软件,只是突破了几个关键的技术问题,硬件原型也已经完成。即使后续需要开模,客户也愿意承担费用。
从投入产出比来看,这确实是一笔相当不错的生意。
不过,客户在试用了一段时间后,反馈了一个意想不到的问题:眼睛不舒服。
我们的复刻版本虽然能够正常运行,但使用一段时间后,眼睛会产生明显的不适感。
我们怀疑问题可能出在红外光源的功率、成像亮度或者闪烁频率上,但还没有进一步验证。当时客户只支付了原型开发的费用,我们希望在正式订单确定后,再投入资源解决这些问题。
然而,客户并不愿意在问题解决之前下单。
最终,这笔生意没能做成。
Just for Fun
现在回想起来,这个项目最终没有做成,未必是一件坏事。
一方面,我们当时并没有充分验证红外光源对眼睛的安全性;另一方面,这套方案也存在明显的软件授权和知识产权问题。技术上做得到,并不意味着就适合商业化。
不过,这个项目虽然没有带来预期的商业回报,整个探索过程却让我乐在其中。
面对一个完全陌生的系统,没有源代码,也没有设计文档,只能通过观察、猜测和实验,一步步理解它的内部机制。从硬件拆解,到 DLL Hook,再到最终发现那张密码表,每解决一个问题,又会冒出新的问题。
而我恰恰很享受这个过程。
这让我想起了 Linus Torvalds 的自传《Just for Fun》。
Linus 最初开发 Linux,并不是出于什么宏大的商业计划,而是源于对计算机的兴趣,以及想要解决自己遇到的问题。他大概也没想到,当初出于兴趣开发的操作系统,后来竟会成为现代计算基础设施的重要组成部分。
当然,我可不敢拿自己当年的小项目跟 Linux 相提并论。人家折腾出了一个影响世界的操作系统,我折腾出一个 Keygen,最后还没卖出一台设备。
但我想,两者至少有一点是相通的:好奇心和兴趣,本身就可以成为创造的动力。
今天,AI 已经开始参与越来越多原本只有专业工程师才能完成的工作,REA 就是一个例子。工具在不断变化,但我想,那种面对未知事物,总想弄明白它究竟如何运作的好奇心,并不会因此消失。
我们习惯了用商业价值衡量一个项目是否成功,但并不是所有探索都需要从商业回报开始。
有时候,正是那些看起来没有明确目的、纯粹出于兴趣的折腾,反而可能在不经意间创造出意想不到的价值。
至于最后能不能做成一门生意,能不能创造出什么了不起的东西,或许不必一开始就想得那么清楚。
Just for Fun。