没有 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 检查这个恐龙游戏。它为什么会变快?展示速度规则,然后构建一个速度可调的小版本。
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。可读摘要使用微软公开源码中的名称来解释恢复出的分支。