---
title: 'REA: 和编程助手一起做逆向工程'
url: https://rea.tools/zh-CN/
---

和编程助手一起做逆向工程

# 弄清楚 软件如何工作。

向你的编程助手提一个关于应用、游戏或网站的问题。REA 为它提供工具，让它检查答案背后的代码。

[开始使用](https://rea.tools/get-started/)
[看一个例子 ↓](https://rea.tools/zh-CN/#dinosaur)

## 安装与配置 REA

把这段话复制给编程助手：

你的编程助手

使用 npx rea-agents@latest setup 安装 REA，并连接到这个编程助手。先展示安装计划，等我确认后再执行，然后验证安装结果。

也可以在终端运行：

`npx rea-agents@latest setup`

确认安装计划后，重启编程助手。


配置方式


其他安装方式：[curl →](https://rea.tools/get-started/#curl-installation)

第一次使用，还没安装 Node.js 或编程助手？[跟着安装指南一步步来 →](https://rea.tools/get-started/)

[构建 RL 环境 →](https://rea.tools/zh-CN/#rl-environments)

录制 Web 应用，用于训练和测试智能体。

[查看案例 →](https://rea.tools/zh-CN/showcase/)

调查过程与互动演示。

[博客 →](https://rea.tools/zh-CN/blog/)

方法与软件重建笔记。

## 如何工作

逆向工程就是通过检查程序本身，了解软件如何工作。有了 REA，你的助手可以追踪代码、解释一个功能，并帮你重新实现它。

1. ### 问一个具体功能

   给助手一个程序或页面，再提一个问题。
2. ### 检查程序

   REA 帮助你的智能体阅读代码，了解程序运行时的行为。
3. ### 理解它，再试着修改

   助手根据这些发现解释或重新实现这个功能。

展开完整的计算器调查

为什么计算器对 200 + 10% 给出 220？

### 一步步阅读指令

原始 x64 指令节选 

```
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
; … value-copy instructions omitted …
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，再标明分支含义。

0x5b
:   除÷

0x5c
:   乘×

02 · 这些函数调用做什么？

“100 很明确，但函数调用只有地址。**哪个负责除法？传进去的是哪个值？**”

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

0x64
:   100

…123190
:   除法

03 · 规则是什么？

“这个分支乘上了另一个输入。所以在 + 之后，**10% 表示 200 的 10%**。”

确定操作数的含义，并检查两条运算路径。

200 × 10 / 100
**20**

![](https://rea.tools/assets/localized/zh-CN/figures/analyst-thinking.svg)

专家思考过程示意

**你需要读懂指令、追踪调用，再还原计算过程。**

向助手提同一个问题

示例提示词 · 计算器

用 REA 检查 Windows 计算器。为什么 200 + 10% 会得到 220？

示例回答 · 根据分析结果

在 + 之后，% 按钮计算的是**第一个数的百分比。**

`10% of 200 = 20`**200 + 20 = 220**

REA 提供
:   处理函数的指令、反编译代码和调用关系。

编程助手解释
:   走哪个分支、怎样计算，以及如何重新实现。

汇编节选自已安装的计算器 DLL。思考过程和回答用于解释分析结果。[继续看完整的计算器示例 ↓](https://rea.tools/zh-CN/#calculator)

试两个例子吧：先改变游戏速度，再重新实现计算器的 % 按钮。

示例 01 · Chrome 小恐龙游戏

## 为什么恐龙变得更快？

游戏会随着奔跑越来越快。要重新实现它并加上速度控制，我们先得弄清速度怎么变化。

### 1. 问一问速度

示例问题 · 恐龙游戏

用 REA 检查这个小恐龙游戏。它为什么会越来越快？找出速度规则，再做一个速度可调的小版本。

### 2. 找到速度规则

REA 让助手读到游戏正在运行的代码。速度从 6 开始，低于 13 时，每次更新都会增加一点。

### 3. 玩一玩结果

我们把这条规则用在下面的小游戏里，加上了速度滑块。点击开始，再选一个自己的速度。

速度 6.0
 使用还原的加速规则

原版规则：速度从 6 开始，逐渐增加到 13。

拖动滑块，选择自己的速度。按空格键或“跳跃”越过仙人掌。



开启 JavaScript 就能玩。你仍然可以阅读规则，并展开下方的源代码。

[打开速度实验室 →](https://rea.tools/zh-CN/examples/dino-lab/)

查看脚本、验证过程和分析步骤

分析目标：[wayou 基于 Chromium 制作的浏览器版本](https://wayou.github.io/t-rex-runner/)。

REA · 已加载 index.js · 选定行

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

起始速度为 6。速度低于 13 时，每次没有发生碰撞的更新增加 0.001。

各部分负责什么

1. 01 · REA

   读取正在运行的游戏脚本

   把实际代码和设置交给助手。
2. 02 · 编程助手

   重建规则，加入控制

   把还原的加速规则用于带速度滑块的小游戏。
3. 03 · 你

   调整速度，亲自试玩

   先体验原版加速，再选择自己的节奏。

REA 通过本地调试连接检查 HTTP 浏览器版本，返回了已加载的 `index.js`，包含源码和摘要。

实际脚本中的设置节选

```
ACCELERATION: 0.001,
MAX_SPEED: 13,
SPEED: 6
```

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

新小游戏保留了这条速度规则。绘图、跳跃和碰撞代码是简化的教学实现。[打开实验室](https://rea.tools/zh-CN/examples/dino-lab/)，可以查看新代码并运行同样的速度检查。

想亲自分析？用[小恐龙页面](https://wayou.github.io/t-rex-runner/)跟着[浏览器连接步骤](https://rea.tools/zh-CN/guides/browser/#prepare)操作。把页面网址和本地调试地址交给助手，再复制上面的 prompt。

[分析的速度代码](https://github.com/wayou/t-rex-runner/blob/5455bfa408ec6b707c7300ff194b7390733a766d/index.js#L565-L571) · [Chromium Authors · BSD 许可证](https://rea.tools/assets/licenses/dinosaur.txt)

示例 02 · Windows 计算器

## 重新实现计算器的 % 按钮。

% 按钮在 + 和 × 之后做的事情不同。我们来找出两条规则，在一个小计算器里试试。

### 1. 问一问 % 按钮

示例问题 · 计算器

用 REA 检查 Windows 计算器的 % 按钮。还原 + 和 × 后的规则，再做一个同时采用这两条规则的小计算器。

### 2. 找到两条规则

REA 帮助助手读到 % 按钮背后的代码。它使用两条不同的规则：

在 + 之后
:   取第一个数字的10％。`10% of 200 = 20 → 200 + 20 = 220`

在 × 之后
:   把10%变成0.1。`200 × 0.1 = 20`

### 3. 试试 % 按钮

我们在下面重新实现了两条规则。选 + 或 ×，按 %，再按 =。

200 +
**20**

200的10%=20. 则200+20=220。

根据实际分析得到的百分比规则制作的交互示例。

查看实际代码和验证方式

对于这个例子, `previous = 200` 和 `current = 10`.

% 处理函数的可读摘要

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

从已安装的应用，到能运行的 % 按钮

1. 01 · REA 读取 calc.exe

   它启动计算器应用

   代码打开 `ms-calculator:`。助手随后选择已安装应用的库。
2. 02 · REA 读取库

   返回 % 处理函数的代码

   函数检查运算符，并使用常量 `100`。
3. 03 · 编程助手解释

   解释并复现规则

   对照 Microsoft 的源码核实分支，再试试上面的 + 和 ×。

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
```

运算符 ID · Microsoft 源码

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

0x64 = 100
```

使用 REA 4.1.0 检查 Windows 计算器 11.2508.4.0（x64）。可读摘要采用 Microsoft 公开源码中的名称，解释还原的分支。

[百分比实现](https://github.com/microsoft/calculator/blob/d125246a4e19842ce1332e6c7839cf0e110027d8/src/CalcManager/CEngine/scifunc.cpp#L98-L111) · [Microsoft 测试用例](https://github.com/microsoft/calculator/blob/d125246a4e19842ce1332e6c7839cf0e110027d8/src/CalculatorUnitTests/CalculatorManagerTest.cpp#L350-L370) · [原生分析配置指南](https://rea.tools/guides/native/)

## REA 实际案例。

查看已发布应用或游戏中的一个功能，以及相关代码和验证结果。

[查看案例 →](https://rea.tools/zh-CN/showcase/)

Android · APK 分析

### 身份验证器如何生成登录验证码

在 Aegis 已发布的 APK 中追踪六位登录验证码，再移动演示时钟，看看它为什么每 30 秒变化一次。

[阅读Android案例研究](https://rea.tools/showcase/aegis/)

Electron · 功能追踪

### Notion 如何复制文本和 HTML

从 Notion 打包的 JavaScript 追踪到系统剪贴板，看看复制操作如何保留富文本区块数据。

[阅读Notion案例研究](https://rea.tools/zh-CN/showcase/notion/)

原生程序 · 重建

### DX-Ball 的声像计算

还原一款 1996 年 Windows 游戏如何把球的位置转成左右声道的声音。

[阅读DX-Ball案例研究](https://rea.tools/zh-CN/showcase/dx-ball/)

## 构建 RL 环境

将录制的 Web 应用会话转为可运行的环境，用于训练和测试 AI 智能体。

你的智能体会记录浏览器发出的请求和应用返回的响应。REA 利用这些数据构建本地环境，让智能体无需运行原应用就能练习任务。

要支持删除文件夹，记录必须包含删除前的文件夹，并确认它在删除后已不存在。

[构建环境指南](https://rea.tools/guides/rl-environments/) · [在 X 上观看演示](https://x.com/reatools/status/2112574822584918075?s=20)

在智能体中设置好 REA 后，将下面示例中的网址和文件夹任务替换为你自己的：

你的编程助手

使用 REA 为我的测试 Web 应用构建 RL 环境，网址是 `http://127.0.0.1:3000`。 覆盖列出、创建、重命名和删除文件夹。可以创建和删除测试文件夹， 但不要修改已有数据。 将环境保存到名为 `my-env` 的文件夹。检查哪些操作可用，并告诉我如何运行。

示例提示词。请替换为你的应用网址和任务。

第一次调查

## 用一个小应用试试 REA。

下载 Notes 示例，追踪 CSV 导出，再修改一个输入来验证。

[跟着引导示例做一遍](https://rea.tools/zh-CN/first-investigation/)

## 选择你的目标。

这些指南介绍各类软件的安装配置和第一次调查。

### 原生二进制

检查可执行文件和库中的函数、字符串、引用和函数调用关系。

[原生分析指南](https://rea.tools/guides/native/)

### JavaScript&Electron

追踪 JavaScript 桌面应用内部的代码。

[应用分析流程](https://rea.tools/guides/javascript/)

### 浏览器与运行时活动

记录指定的浏览器或进程活动，再比较不同运行的结果。

[浏览器观察指南](https://rea.tools/zh-CN/guides/browser/)

试一个更大的项目

示例 prompt · 网站

用 REA 检查 https://rea.tools/。帮我克隆这个网站。

对，就是这个网站。

示例 prompt · 游戏重建

用 REA 从这个游戏的可执行文件重建游戏。用 C 还原游戏逻辑，并对照原版测试。

[查看 DX-Ball 案例 →](https://rea.tools/zh-CN/showcase/dx-ball/)

## 有什么问题吗？

[阅读常见问题](https://rea.tools/zh-CN/faq/)，获取安装帮助和常见问题解答。

[加入 Discord](https://discord.gg/GkcryMnJDM)，获取帮助并讨论你的分析。

在 [GitHub Issues](https://github.com/morluto/rea/issues/new/choose) 中报告错误或提出功能请求。
