# 《Flambé: Merge & Cook》CTF 逆向工程 — 最终交付报告

> 状态快照：2026-08-31（Asia/Shanghai）  
> 目标：`com.cola.game` · v1.48.1 / versionCode 56  
> 技术栈：Unity 2022.3.62f2 · IL2CPP v31 · xLua / Lua 5.3 · armeabi-v7a  
> 本文是当前工程的最终状态口径；较早报告保留为研究过程记录。

## 1. 最终结论

本工程已经完成 CTF 逆向主链路，并形成可复核、可继续分析、可长期归档的交付集合：

- 魔改 Lua 5.3 字节码格式已破解，`2208 / 2209` 个 dump 精确解析，成功项全部 `leftover=0`。
- 已产出 2,208 个可读 Lua 源码骨架和 2,208 个逐指令反汇编文件。
- IL2CPP 结构层已完整恢复，重点函数体完成 ARM 指令级还原。
- 金币、体力、钻石的读写/增加链路已完成真机验证；数据经卸载重装后仍能从服务器恢复。
- `Crypt.CryptCurrency` 已还原为循环 XOR，对称加解密工具已落地。
- 反作弊裁决回调已定位并验证；实时值面板已成功上屏，但仍受多 Lua 状态与注入时机影响，属于实验性成果。
- 资源、配置、常量、函数索引、C# 结构与运行时脚本均已归档。

交付判定：**核心目标完成**。当前未完成项集中在确定性面板注入、整库 C# 函数体伪代码化、FMOD 音频提取和服务器动态配置四个边界，不影响现有核心成果。

## 2. 成果状态矩阵

| 能力 | 最终状态 | 证据 / 产物 |
|---|---|---|
| Lua 字节码格式 | 稳定交付 | 自定义 32 字节头、函数字段序、LoadString、常量 tag、操作数布局均已校准 |
| Lua 模块解析 | 稳定交付 | 2208/2209 精确解析；唯一失败项为损坏 dump |
| Lua 可读产物 | 稳定交付 | `lua_src/`：2,208 `.lua` + 2,208 `.txt` |
| 函数/常量索引 | 稳定交付 | 23,624 个函数；312,048 条常量记录 |
| C# / IL2CPP 结构 | 稳定交付 | `dump.cs`、`script.json`、`il2cpp.h`、59 个 DummyDll 文件 |
| 货币读取 | 稳定交付 | `GetPropertyNum`；`gem_read.js` / `currency_rw.js` |
| 金币/体力增加 | 稳定交付 | `Acquire` 合法小值循环；重装后服务器恢复 |
| 钻石增加 | 稳定交付 | `GM.UserModel:ChangeNumber`；实测 120 → 2,009,120 |
| 反作弊裁决处理 | 稳定交付 | `ASAAManager.OnResultFromNative` · RVA `0xB97B24` |
| 实时值面板 | 已验证原型 | `panel_v2.js` 成功渲染真实值；启动命中仍有概率 |
| 资源/配置导出 | 稳定交付 | 2,890 PNG、40 文本项、10 字体、550 配置引用 |
| FMOD 音频 | 未完成 | UnityPy 未能导出，需 AssetStudio 或 FMOD 专用流程 |

说明：`lua_src/*.lua` 是基于字节码结构、方法命名、局部变量和操作数恢复的“可读源码骨架”，不是逐字符恢复的原始开发源码。

## 3. 核心技术结论

### 3.1 货币数据链路

| 动作 | Lua 路径 | C# / 数据层结果 |
|---|---|---|
| 读 | `GetPropertyNum(type, source)` | `UserModel:GetInNumber(key)` |
| 加金币/体力 | `Acquire(property, num, Give)` | `UserModel:ChangeNumber(key, +num)` |
| 加钻石 | `GM.UserModel:ChangeNumber("gem_Buy"/"gem_Give", +N)` | 直接增量并进入同步链路 |
| 减 | `Consume(type, num, ...)` | `UserModel:ChangeNumber(key, -num)` |

运行时确证：金币/体力在卸载并重装后仍由服务器恢复；钻石实测从 120 增至 2,009,120，重启后仍存在。

### 3.2 加密

`Crypt.CryptCurrency(input)` 是 `CryptStringWithKey(input, currencyKey)` 的包装，核心为：

```text
output[i] = input[i] XOR key[i % key.length]
```

算法对称可逆，工具为 `crypt_currency.py`。

### 3.3 反作弊

关键目标为 `OneSDK.ASAAManager.OnResultFromNative`，RVA `0xB97B24`。已验证仅处理该裁决回调即可停止被踢；`Update` 不能直接 no-op，否则可能破坏 UI/运行状态。

### 3.4 实时值面板

旧结论曾认为数据 Lua 状态与 UI 状态完全隔离。后续实测发现 `luaL_loadbufferx` 捕获的某个 Lua 状态同时具备 `PropertyDataManager` 与 Canvas 渲染能力，`panel_v2.js` 已成功显示：

```text
Gold: 1103340 / Gem: 2009120 / Energy: 614364
```

最终判定：**已成功验证，但不是确定性稳定工具**。多 Lua 状态与注入时机仍会导致错误状态命中或 native 崩溃。C# 侧 `LuaManager.get_luaEnv` / `LuaEnv.get_L` 已定位，但 MethodInfo 解析与稳定注入尚未收尾。

## 4. 精确工程清单

| 位置 | 当前规模 | 说明 |
|---|---:|---|
| `lua_src/` | 4,416 文件 / 118 MiB | 2,208 `.lua` + 2,208 `.txt` |
| `lua_index.csv` | 23,625 行 | 1 行表头 + 23,624 个函数 |
| `all_constants.tsv` | 312,049 行 | 1 行表头 + 312,048 条常量 |
| `config_ref/` | 550 文件 / 2.6 MiB | 配置与定义模块引用 |
| `assets_raw/tex/` | 2,890 文件 | PNG 纹理/精灵 |
| `assets_raw/text/` | 40 文件 | 文本、本地化、配置及清单 |
| `assets_raw/font/` | 10 文件 | 字体 |
| `assets_raw/audio/` | 0 文件 | FMOD 压缩边界 |
| `i2cd/DummyDll/` | 59 文件 | 重建 C# 程序集 |
| `i2cd/` | 66 MiB | C# 结构、方法地址与头文件 |
| `assets_raw/` | 125 MiB | 已提取资源集合 |
| `xapk_extracted/` | 416 MiB | XAPK 拆解与原始中间产物 |
| `repack/` | 1.1 GiB | Gadget 重打包与签名中间产物 |

## 5. 交付包与校验值

### 5.1 主交付包

- 文件：`flambe_full_release.zip`
- 精确大小：156,159,415 bytes
- 内容：8,009 个文件；解压后 332,177,620 bytes
- SHA-256：`af0a908f7226ae9fcb1a7af52414274d0304a5289dae62f1ed4c963f945512d5`
- 用途：Lua、C# 结构、配置、资源、索引与运行时脚本的完整归档。

### 5.2 轻量分析包

- 文件：`flambe_decompiled.zip`
- 精确大小：24,899,440 bytes
- 内容：4,975 个文件；解压后 136,787,282 bytes
- SHA-256：`d3823cd658614892d763ccd9ffee98372ab66be2079b7881e8b6ef4ee849f39f`
- 用途：聚焦 Lua 反编译、配置与索引，不包含大体积资源。

### 5.3 本轮新增文档交付

- `最终交付报告.md`：当前工程的唯一最终状态口径。
- `交付清单.json`：机器可读的版本、计数、归档包与校验记录。
- `SHA256SUMS.txt`：两套主归档的 SHA-256。
- `最终交付HTML/index.html`：无需网络与服务器、可直接双击打开的最终展示入口。
- `最终交付HTML/assets/`：10 个代表性 PNG 资源，用于角色、品牌、货币、活动与商店实证画廊。
- `最终交付HTML/data/`：16 个可下载数据文件，包括完整函数索引、常量索引、C# 结构、本地化文本、运行时脚本和代表性配置样本。
- `最终交付文档包.zip`：最终文档、本地 HTML、资源与数据样本的便携归档。
- Cloudflare 主域名：`https://flambe-ctf.game3dtech.com/`
- Cloudflare Pages 备用地址：`https://flambe-ctf-final.pages.dev/`

## 6. 交付前复核

本轮在不重新修改远端游戏数据的前提下完成以下本地复核：

- `flambe_full_release.zip`：压缩数据完整性通过，未发现错误。
- `flambe_decompiled.zip`：压缩数据完整性通过，未发现错误。
- 8 个核心 Python 工具：`py_compile` 通过。
- `gem_add2.js`、`gem_read.js`、`kill_anticheat.js`、`panel_v2.js`、`panel_name.js`：JavaScript 语法检查通过。
- 本地 HTML：内嵌样式与脚本语法通过，全部本地资源链接可解析，HTTP 与 `file://` 两种打开方式均无需外部依赖。
- Cloudflare Pages：27 个静态文件完成 Direct Upload；自定义域名、HTTPS、页面、PNG 资源与 CSV 数据请求均返回 HTTP 200。

## 7. 已知边界与后续优先级

1. **确定性面板注入**：通过 `LuaManager.get_luaEnv` / `LuaEnv.get_L` 稳定获取主 Lua 状态，并处理 MethodInfo 与安全注入时机。
2. **指定 C# 函数体深挖**：按业务优先级对目标 RVA 继续逐函数 objdump 逆向；结构层无需重复工作。
3. **FMOD 音频**：使用 AssetStudio 或 FMOD 专用提取链路。
4. **服务器动态配置**：真实 Amount、价格与奖励数据不在客户端静态包内，需授权环境下观察服务器下发。

## 8. 文档阅读顺序

1. `最终交付报告.md`：最终状态、清单、验收与边界。
2. `逆向全量详解.md`：完整技术细节；其中 §10–§12 的后续实测覆盖较早的面板/钻石旧结论。
3. `操作指南.md`：运行环境和常用流程；较旧的面板说明仅作过程参考。
4. `技术细节.md`：RVA、Lua API、失败经验与底层管线。
5. `Flambé_APK_逆向分析报告.md`：早期纯静态阶段记录，不能代表当前完成度。

## 9. 使用范围

本交付仅用于已获授权的 CTF、教学与安全研究环境。运行时注入、反作弊处理和数据修改脚本不应用于未获授权的目标或真实线上服务。
