ESC
科技 2 分钟阅读

REA:万物皆可逆向工程

REA 是一款 AI 逆向工程工具。文章通过两个实例演示其能力:用 agent 分析 Windows 计算器的反汇编代码,恢复 % 按钮在 + 和 × 下的运算规则并重建小型计算器;再通过本地调试连接读取 Chromium 恐龙游戏的 index.js,找出从 6 加速到 13、每次更新加 0.001 的速度规则,并重建一个速度可调的迷你游戏。

来源:Hacker News

没有 REA 时 · 你得自己调查

0x180124945: MOV EAX, dword ptr [R13 + 0x18] 0x180124949: CMP EAX, 0x5c 0x18012494c: JZ 0x180124aba 0x180124952: CMP EAX, 0x5b 0x180124955: JZ 0x180124aba 0x18012495b: MOV EDX, 0x64 0x180124960: LEA RCX, [RSP + 0x160] 0x180124968: CALL 0x180122650 0x18012496e: LEA RDX, [R13 + 0x160] 0x180124975: LEA RCX, [RSP + 0x78] 0x18012497a: CALL 0x180109720 0x18012497f: MOV RSI, RAX 0x180124982: MOV qword ptr [RSP + 0x28], RAX 0x180124987: LEA RDX, [RSP + 0x160] 0x18012498f: MOV RCX, RAX 0x180124992: CALL 0x180123190 ; …… 值拷贝指令已省略 …… 0x180124a14: MOV RDX, RDI 0x180124a17: LEA RCX, [RSP + 0xf8] 0x180124a1f: CALL 0x180109720 0x180124a24: LEA R8, [RSP + 0x30] 0x180124a29: MOV RDX, RAX 0x180124a2c: LEA RCX, [RSP + 0xb8] 0x180124a34: CALL 0x180123c10

01 · 哪个分支?

0x5b?0x5c? 两个跳转指向同一个地方。这些是哪些运算符?

查一下命令 ID,然后给这个分支贴上标签。

“100 很清楚。那些调用只是地址。**哪个做除法?传入的是哪个值?”

检查辅助函数,追踪存储的值。

“这条路径会乘以另一个输入。所以 + 之后,10% 表示 200 的 10%。**”

命名操作数,检查两条运算符路径。

你解码指令,跟踪调用,重建整个计算过程。

有了 REA · 你只需询问你的 agent

›用 REA 检查 Windows 计算器。为什么 200 + 10% 得到的是 220?

在 + 之后,% 按钮取的是第一个数字的百分比。

我们来试两个例子。 改变一个游戏的速度,然后回到计算器,重建它的 % 按钮。

6 → 10 → 13

开始游戏

跳跃 ↑

重新开始

速度 6.0

使用恢复出的加速规则

原始规则:从 6 开始,然后向 13 递增。

启用 JavaScript 才能运行这个重建版本。上面的代码和说明仍然可读。

页面中实际运行的脚本。 agent 读取它的 update 函数和速度设置,然后在一个新游戏中使用该规则。

›用 REA 检查这个恐龙游戏。它为什么会变快?展示速度规则,然后构建一个速度可调的小版本。

检查目标:wayou 的 Chromium 衍生浏览器版。

if (this.currentSpeed < this.config.MAX_SPEED) { this.currentSpeed += this.config.ACCELERATION; }

从 6 开始。 在没有碰撞且速度低于 13 时,每次更新加 0.001。

REA 通过本地调试连接检查了这个 HTTP 浏览器版,并返回了已加载的 index.js,包括其源码和摘要。

ACCELERATION: 0.001, MAX_SPEED: 13, SPEED: 6

我们在受控的浏览器检查中调用了原游戏的 update 函数,禁用了障碍物和自动调度。4,000 次更新后速度为 10.0;10,000 次更新后为 13.0,四舍五入保留一位小数。

新的迷你游戏保留了这条速度规则。它的绘制、跳跃和碰撞代码是一个小型教学实现。打开实验室查看新代码并运行相同的速度检查。

要亲自检查该目标,请使用恐龙页面按照浏览器连接步骤操作。把该页面 URL 和你的本地调试端点交给你的 agent,然后复制上面的提示词。

检查到的速度代码 · Chromium Authors · BSD 许可证

我们已经明白了为什么 200 + 10% 会得到 220。 现在让我们恢复 + 和 × 各自的规则,并试用它们。

一个分支除以 100。另一个还会乘以第一个数字。agent 用这两条规则重建了 % 按钮。

在这个例子中,previous = 200,current = 10。

›用 REA 检查 Windows 计算器的 % 按钮。恢复 + 和 × 之后的规则,然后构建一个两者都用到的小型计算器。

if (operation == multiply || operation == divide) { percent = current / 100; } else { percent = current * previous / 100; }

在 + 下

取第一个数字的 10%。10% of 200 = 20 → 200 + 20 = 220

在 × 下

把 10% 变成 0.1。200 × 0.1 = 20

从已安装的应用到可用的 % 按钮

0x180124945: MOV EAX, dword ptr [R13 + 0x18] 0x180124949: CMP EAX, 0x5c 0x18012494c: JZ 0x180124aba 0x180124952: CMP EAX, 0x5b 0x180124955: JZ 0x180124aba 0x18012495b: MOV EDX, 0x64

运算符 ID · 微软的源码

#define IDC_MUL 92 // 0x5c
#define IDC_DIV 91 // 0x5b
#define IDC_PERCENT 118 // 0x76

0x64 = 100

使用 REA 4.1.0 检查:Windows Calculator 11.2508.4.0,x64。可读摘要使用微软公开源码中的名称来解释恢复出的分支。