最后更新: 2026-06-29 (Unity 6 baseline) | 覆盖率: 93.5% 方法 / 82.7% 字段 / 46.7% 类 | cross_version: 40,223 条 本文档面向接手的 AI 或开发者,记录项目全貌、已验证的策略、踩过的坑。 权威数字以
output/coverage_stats.json为准(每次 pipeline 自动刷新)。⚠️ Unity 6 (6000.0.60f1) 基线已冻结。接手请优先读BASELINE.md(冻结状态+复现步骤)和HANDOFF.md(Unity6 结构图谱+下一步)。本文档下方的部分历史 v2.x 细节针对旧 Unity 2022 build,结构方法论仍可参考。
目标: 反混淆 VRChat 的 GameAssembly.dll(IL2CPP 编译,Beebyte 混淆)
Beebyte 混淆特征:
- 类/方法/字段名替换为
ÌÍÎÏ字符串(U+00CC-00CF,23字符) - Il2CppClass 结构体字段位置每个版本随机打乱(核心难点)
- 264 个 IL2CPP 导出函数被重命名,仅 3 个保留原名
- 正则匹配混淆名:
^[Ì-Ï]{3,}$
当前成果 (June 5 build, v2.5):
- 88,400 类提取,528,135 方法,71,972 字段
- 478,923 方法已命名 (90.7%)
- 49,212 方法仍为 hash fallback (m_XXX)
- 39,623 条 cross_version 方法名映射
- 7,826 / 11,503 混淆类有语义名 (68.0%)
- 66,282 字段有类型信息 (92.1%) — v2.4 runtime field recovery (25x)
- 118 个字段类型驱动的类名 — v2.5 evidence-backed
注: 覆盖率从 94.1% 降到 90.7% 是有意为之——全量 122 批质量审计删除了 ~13.8K 低置信度预测(主要是
<>c闭包/编译器生成方法的泛化命名)。精确率换覆盖率, 剩余命名的可信度更高。dump.cs 和 src/ 现在输出 RVA(兼容 Il2CppDumper/IDA/Ghidra)。
| 文件 | 说明 | 大小 |
|---|---|---|
data/precise_dump.json |
IL2CPP 内存提取的原始类/方法/字段数据 | ~40 MB |
output/cross_version_method_names.json |
最重要的产物 — 跨版本方法名映射 Class::m_XXX → name |
~5 MB |
output/unified_vocabulary.json |
合并后的命名词汇表 (7,926 条) | ~800 KB |
output/name_mapping.json |
完整的混淆名→语义名映射 | ~9 MB |
output/deobfuscated_dump.json |
反混淆后的完整 dump | ~36 MB |
output/deobfuscated_dump.cs |
C# stub 输出 | ~18 MB |
output/src/ |
按命名空间组织的 1,126 个 .cs 文件 | — |
output/struct_layout_report.json |
reverse_struct_layout.py 的输出,记录当前 build 的偏移 | — |
| 工具 | 用途 | 关键参数 |
|---|---|---|
tools/run_full_pipeline.py |
主编排器,5 阶段 pipeline | --skip-binary, --stage N |
tools/deobfuscate.py |
8 阶段重命名引擎 | — |
tools/reverse_struct_layout.py |
新 build 必跑 — 自动发现 Beebyte 的 struct 偏移 | --auto-heap, --dump |
tools/extract_precise_dump.py |
从内存 dump 提取 IL2CPP 类 | --auto-heap, --offsets |
tools/rva_propagate_v2.py |
RVA 传播命名(零幻觉) | — |
tools/rva_cascade.py |
级联传播:新名字 → 共享 RVA 组 | — |
tools/sibling_context_batches.py |
构建 LLM 推测批次(无伪代码) | — |
tools/codex_worker.py |
Codex CLI 并行工作器 | --mode, --start, --end, --worker |
tools/merge_sibling_preds.py |
合并 + 质量过滤预测结果 | — |
tools/merge_new_name_sources.py |
合并所有命名来源到 cross_version | — |
tools/build_audit_batches.py |
构建质量审计批次 | — |
# 1. 获取内存 dump (需要 VRChat 离线运行)
# 方法 A: Frida 注入 + 内存导出
# 方法 B: 蓝屏 crash dump (详见 tools/bsod/)
# 方法 C: Process Explorer / procdump
# 2. 发现 struct 偏移(Beebyte 每版本打乱)
python tools/reverse_struct_layout.py --dump YOUR_DUMP.dmp --auto-heap
# 输出: output/struct_layout_report.json
# 包含: OFF_NAME, OFF_ELEM, OFF_CAST, OFF_FIELDS, OFF_METHODS, OFF_PARENT, MI_NAME, FI_STRIDE, FI_NAME
# 3. 提取 IL2CPP 类数据
python tools/extract_precise_dump.py YOUR_DUMP.dmp --auto-heap \
--offsets output/struct_layout_report.json
# 输出: data/precise_dump.json
# 4. 更新 extract_precise_dump.py 中的硬编码偏移(用 struct_layout_report.json 的值)
# 然后跑 pipeline
python tools/run_full_pipeline.py策略优先级(按可靠性排序):
-
RVA 传播(零幻觉,最可靠)
python tools/rva_propagate_v2.py # 相同函数指针 = 相同函数 python tools/rva_cascade.py # 级联传播到共享 RVA 组
-
Hex-Rays 伪代码分析(有证据支撑)
# 在 IDA 中: 批量反编译 → 导出伪代码 python tools/ida_hexrays_export.py # (在 IDA 脚本中运行) # 然后用 Codex 从伪代码推测方法名 python tools/codex_worker.py --mode mega --start 0 --end 262 --worker 0
-
Sibling-context 推测(无伪代码,靠上下文)
python tools/sibling_context_batches.py # 生成批次 python tools/codex_worker.py --mode sibling --start 0 --end 111 --worker 0 python tools/codex_worker.py --mode sibling --start 111 --end 222 --worker 1 python tools/codex_worker.py --mode sibling --start 222 --end 333 --worker 2 python tools/merge_sibling_preds.py # 质量过滤 + 合并 python tools/rva_cascade.py # 级联新名字
-
Neighbor-class 推测(单类上下文,收益最低)
# 已有 6,242 个 batch 在 output/llm_batches_neighbor/ python tools/codex_worker.py --mode neighbor --start 0 --end 2081 --worker 0 -
质量审计
python tools/build_audit_batches.py python tools/codex_worker.py --mode audit --start 0 --end 41 --worker 0 # audit 结果: {"remove": [...], "fix": {...}}
python tools/merge_new_name_sources.py # 合并所有来源 → cross_version
python tools/rva_cascade.py # 最后一次级联
python tools/run_full_pipeline.py # 重跑 pipeline 生成最终输出# 后台启动,不占终端
Start-Process python -ArgumentList "tools/codex_worker.py","--mode","sibling","--start","0","--end","111","--worker","0" `
-RedirectStandardOutput "output/worker_0.log" `
-RedirectStandardError "output/worker_0_err.log" `
-WindowStyle Hidden -WorkingDirectory "D:\Project\vrchat-il2cpp-re"| 模式 | 输入目录 | 输出前缀 | 超时 | 说明 |
|---|---|---|---|---|
mega |
output/codex_mega_batches/ |
pred_ |
900s | 伪代码分析,最精确 |
sibling |
output/sibling_batches/ |
pred_ |
300s | 类上下文推测 |
neighbor |
output/llm_batches_neighbor/ |
pred_ |
120s | 单类推测,收益低 |
audit |
output/audit_batches/ |
audit_ |
300s | 审计已有预测质量 |
- Worker 自动跳过已存在的 pred 文件(可重启不重跑)
- Codex 命令:
codex exec --skip-git-repo-check --dangerously-bypass-approvals-and-sandbox - 环境变量
CODEX_CMD可覆盖 codex 路径 - 最多同时跑 3 个 worker(Codex 配额限制)
- pred 文件可能有 UTF-8 BOM,merge 脚本已处理
失败: 保守 prompt "SKIP is always better than a guess" → 100% 输出 SKIP,零有效预测 成功: 激进 prompt "You MUST predict a name for EVERY method — do NOT output SKIP" + 列出 9 种具体策略 + VRChat 领域知识 → 平均每 batch 65 个预测
关键: prompt 要包含:
- 明确的输出格式要求
- 禁止使用的泛化名字黑名单(Update, Init, Process, Handle...)
- VRChat 领域关键词(Photon, Avatar, Udon, UI, Audio, Safety, Social)
- 多种推测策略(pattern completion, property pairs, event patterns...)
合并预测时必须过滤:
- 泛化名字黑名单: Update, Initialize, Process, Handle, Execute, Method, Func 等
- C# 样板黑名单: .ctor, Dispose, MoveNext, GetHashCode, Equals 等
- 每类去重: 同一个类不能有超过 2 个相同名字的方法
- 全局频率上限: 同一个名字在 cross_version 中出现超过 50 次就丢弃
- Fallback 类过滤: AsyncStateMachine_, Clone_, Compare_* 等 fallback 类的预测基本都是废的
sys.stdout.reconfigure(encoding='utf-8')— 所有 Python 脚本开头必加,否则 CJK 输出崩溃tmp.replace(target)在 Windows 上可能 PermissionError → 需要 try/except fallback 用 os.remove + os.rename- Codex 输出文件可能带 UTF-8 BOM (0xEF 0xBB 0xBF) → 读取时
encoding='utf-8-sig' - PowerShell 启动后台进程用
Start-Process -WindowStyle Hidden,不要用 bash 的nohup &
- 绝对不许有 Co-Authored-By 或 claude 引用 — 所有贡献归 dwgx
- 如果之前的 commit 带了,用
git filter-branch -f --msg-filter 'sed "/Co-Authored-By/d"'清除后 force push .gitignore要覆盖:batch 文件、pred 文件、tmp 文件、.env、备份文件- 提交前检查
git log --format='%B' | grep -i claude确保干净
- Jun 5 build 完整 pipeline (94.1% coverage)
- RVA propagation v1 + v2 + cascade
- Codex mega-batch (262 batch, 2,812 predictions)
- Sibling-context (333 batch, 22,314 raw → 13,565 merged)
- Neighbor batch (6,242 batch, 4,157 有结果)
- 质量审计 pipeline 搭建并运行中
- reverse_struct_layout.py 自动检测(支持新 build)
- extract_precise_dump.py --offsets 支持
- GitHub 清理(无 claude 引用)
- v2.1 release 发布
- 全量 122 批质量审计完成并应用(删 13,777 + 修 137),cross_version 53,292→39,623
-
tools/apply_audit_results.py— 自动应用 remove/fix(自动备份) -
tools/compute_final_stats.py— 单一真相源统计,已接入 pipeline Stage 3c - dump.cs + src/ 输出 RVA 格式(兼容 Il2CppDumper/IDA/Ghidra)+ 字段类型/偏移
- 全文档数字统一到权威值(README/WORKFLOW/dashboard/coverage_report)
- 所有文件名/代码中 claude 引用清除
- 运行时字段恢复【最大缺口已解决】: 字段 2,870 → 71,972(92.1% 带类型)。
由配套私有项目
vrc-runtime-re走 dump 的 FieldInfo→Il2CppType 提取, 产出output/field_types.json,pipeline Stage 2b 自动按 VA 合并。 混淆 VRChat 类现在带真实类型(VRCPlayerApi/PositionEvent/VRCStation…), 可作为方法/类命名的新上下文。
- 字段类型反哺命名: 用 71K 字段类型给 fallback 混淆类证据支撑的真名。
源
output/fieldtype_class_names.json(118 唯一名,全部客观证据验证:引用的 字段类型必须真在 dump 里),pipeline Stage 2c 自动应用(189 个类实例)。 例: VRCPlayer_F618→VRCPlayerAvatarRuntimeState, NetworkSyncable_9834→ UdonBehaviourNetworkSyncQueue, WorldProximityExitStation_C9A0→WorldStationInteractableBinding。
- 扩大字段命名: 当前只覆盖有 ≥2 域字段类型的 fallback 类。可放宽到方法+字段联合证据。
- 运行时实时探测: VM 物理 RAM 快照 + memprocfs 后端(见 vrc-runtime-re 私有项目)。
- IDA 分析深化【中价值】: 28K 函数已反编译,剩余 hash 方法可继续补伪代码走 mega-batch。
- 剩余 ~49K hash 方法【低价值】: 大部分是
<>c闭包/lambda/编译器生成/极通用方法, 审计已证明强行命名 = 幻觉。边际收益极低,不建议盲目冲覆盖率。
第一步永远是:确认当前 build 是否还是 June 5。VRChat 自动更新后偏移会变。
# 1. 新 dump 后必跑(发现新偏移)
python tools/reverse_struct_layout.py --dump <NEW>.dmp --auto-heap
# 2. 提取
python tools/extract_precise_dump.py <NEW>.dmp --auto-heap --offsets output/struct_layout_report.json
# 3. 重跑
python tools/run_full_pipeline.py --force
# 4. 看权威数字
type output\coverage_stats.json最高 ROI 的下一步工作 = Frida 字段提取(理由见上):
start "" "D:\Steam\steamapps\common\VRChat\VRChat.exe" --no-vr
python tools/extract_field_types_v2.py # 需先把 extract_field_types_v2.js 偏移更新到当前 build
python tools/merge_field_types.py
python tools/run_full_pipeline.py --forceextract_field_types_v2.js 等)的偏移仍是旧 build 的硬编码,
运行前必须按 output/coverage_stats.json 同期的 reverse_struct_report 更新。
不要做的事(已验证死路):
- ❌ 再跑 neighbor batch(平均 <1 有效预测/batch)
- ❌ 强行给
<>c/lambda hash 方法命名(审计会再删掉) - ❌ 本地 EAC/EOS 伪造来联机(服务端校验,客户端改无效)
| 偏移 | 值 | 说明 |
|---|---|---|
| OFF_NAME | 0x50 | Il2CppClass.name 指针 |
| OFF_NS | 0x18 | Il2CppClass.namespaceString |
| OFF_ELEM | 0x10 | Il2CppClass.element_class (自引用) |
| OFF_CAST | 0x40 | Il2CppClass.castClass (自引用) |
| OFF_FIELDS | 0x1D8 | Il2CppClass.fields 指针 |
| OFF_METHODS | 0x88 | Il2CppClass.methods 指针 |
| OFF_PARENT | 0x80 | Il2CppClass.parent 指针 |
| OFF_MCNT | 0x120 | method_count (u16) |
| OFF_FCNT | 0x122 | field_count (u16) |
| MI_NAME | 0x18 | MethodInfo.name 指针 |
| FI_STRIDE | 0x30 | FieldInfo 结构体大小 |
| FI_NAME | 0x08 | FieldInfo.name 指针 |
注意: 这些值每个 VRChat 版本都会变。新版本必须先跑 reverse_struct_layout.py --auto-heap 重新发现。
Python 3.14
Codex CLI: C:\Users\dwgx1\AppData\Roaming\npm\codex.cmd
codex exec --skip-git-repo-check --dangerously-bypass-approvals-and-sandbox
LLM API: OPENAI_API_BASE + OPENAI_API_KEY (env vars from .env)
IDA Pro: 9.x + MCP
Frida: 17.10.1
VRChat: D:\Steam\steamapps\common\VRChat\
项目目录: D:\Project\vrchat-il2cpp-re\
GitHub: https://github.com/dwgx/vrchat-il2cpp-re