给 VRChat 写个 IL2CPP 运行时逆向框架
vrc-runtime-re 是一套 VRChat 客户端的 IL2CPP 运行时内存逆向框架,私有仓库,纯授权研究。目标是看清 Unity 打成 IL2CPP 之后,内存里 Il2CppClass / MethodInfo / FieldInfo 那套结构到底长什么样。VRChat 还套了 Beebyte 混淆,字段顺序全打乱,每个版本还变,手对偏移太磨人,索性写成工具。
核心思路一句话:字节从哪来,和字节怎么解释,不该耦合。所以拆开。MemoryBackend 只负责吐原始字节,统一契约 read / modules / regions;派生类型读取、指针链、C 字符串、模块基址查找、pattern 扫描都放上层,不管字节从哪拿。同一套分析代码于是能原样跑三种后端。minidump 纯标准库,离线,对 EAC 不可见,抓份 dump 慢慢啃,反作弊看不到,这条用得最多;memprocfs 读 dump、VM 快照,也能接 DMA/FPGA 卡或 Hyper-V 来宾内存;frida 是实时进程后端,代价是 EAC 得关。
字节之上是 Il2CppWalker,ASLR 安全地解析模块基址,再遍历 class/method/field。所有布局知识收在 Il2CppOffsets 一处,换版本只改这里。再往上一堆探针,每个只答一个问题:恢复字段名/偏移/类型、扫活实例、dump 字段值、沿引用爬 N 层对象图。快照差分器直接在 IL2CPP 对象级 diff 两份冻结快照,不挂 hook,两份 RAM 快照就能在 EAC 底下看变化。
最麻烦的是 Beebyte 每次更新都重排布局,所以写了 il2cpp/autodetect.py,对新 build 自愈式重认偏移,目前拿 6 月 5 号基线验过。流程是走 EAC 安全路径拿内存,跑 autodetect 认出偏移,生成这版新的 Il2CppOffsets,后端和 walker 一行不改就能配上去。
核心零第三方依赖,minidump 只吃标准库,要 memprocfs / frida 才装对应包,目标是 x64 Windows 小端。目前后端抽象、walker、偏移自检、字段类型恢复都能用,实例扫描器还在磨,字段类型顺手喂回我另一个静态去混淆项目。字符串交叉引用、singleton 查找、统一 CLI 还在路上。