dwgx@blog:~$dwgx
> cd ../posts

逆向 VRChat 的 IL2CPP:当静态 dumper 全都失效

// created

vrchat-il2cpp-re 是一条反混淆流水线,专治 VRChat 的 IL2CPP 二进制,现在归档了,状态冻在 2026-07-01。目标很直接:从 GameAssembly.dll(222MB)里把混淆过的代码抠出来重命名。基线是 Unity 6(6000.0.60f1),大概 64,773 个类、569,859 个方法、188,384 个字段。

混淆是 Beebyte 干的,标识符全改成 ÌÍÎÏ 这种鬼字符,每个版本还重排结构体字段布局。加上 metadata 加密、IL2CPP 导出被 strip,Il2CppDumper 那套静态 dumper 直接歇菜。

我的路子是反向 MethodInfo 枚举:扫堆里所有 MethodInfo,解析它们的 klass,把整棵类型树重建出来。全程自校验,ASLR 堆段自动探测,偏移自验证,再拿 ground truth 对齐,比如 Vector3 = x/y/zTransform 的方法数。

最终类 56.9% 语义命名,触顶了,这是结构性天花板;方法 93.5%,字段 85.1%。得说清楚,这些名是推断不是还原——Beebyte 编译时就把原类名销毁了,根本没原名可捞。

流水线在 run_full_pipeline.py 里五阶段走完:合并命名来源成统一词表,过 11 阶段重命名引擎,应用交叉引用,产出反混淆 dump、name_mapping.json 和 1,538 个 C# 文件的 src/ 树,最后生成覆盖 226K+ 函数的 IDA 重命名脚本。跑一遍约 30 秒。

顺手还挖到点东西。网络层是 Photon Realtime + FlatBuffer,一条 4-token 认证链 Steam → VRChat API → Photon → EAC。EAC(EOS 反作弊)在线分析会被封,只能拿离线 VRChat 搞。Beebyte 那套自定义 XOR 的 metadata 解密例程也一并记了下来。私有研究项目,不再分发,C# 61.6% + Python 37.5%,188 个脚本,配 IDA Pro / Ghidra / Frida。