使用方法
在游戏启动时注入(必须在 GameAssembly.dll 加载前完成注入)
转储工具会自动运行,元数据文件将生成在游戏目录中
如果未找到特征码 → 重新尝试
如果卡在 meta function hooked → 注入时机过晚
技术细节
本工具主要通过逆向 init metadata cache 方法实现,部分未解明逻辑
建议:若想为其他游戏实现类似功能,强烈推荐用同版本 Unity 空项目加载 IDA 并对比 PDB 符号,效率极高。
《逃离塔科夫》的元数据加密机制
通过网络请求获取密钥解密元数据
头部信息全程加密(无法直接从内存读取,需解密或调用函数)
移除了校验字段和版本号
对 il2cpptypedefinition 结构体字段进行乱序处理
使用多组密钥(部分来自加密文件、网络请求和游戏本体)
实现流程
等待 GameAssembly.dll 加载
挂钩密钥获取函数(在类型定义结构体解乱序前快速截获密钥)
保存密钥后解除挂钩
等待游戏完成元数据解密
复制元数据头部
调用解密函数处理所有头部
修复字段顺序
手动填充校验字段和版本号
根据头部计算元数据总大小并复制到缓冲区
用先前获取的密钥解乱序类型定义结构体
将 nestedTypesSize 减 5(末尾存在无效数据,直接处理会报错)
特征码定位
s_GlobalMetadataHeader
解密后的元数据头部常量,IDA 中搜索 global-metadata.dat 引用
metadata_key
用于解密头部的密钥常量,IDA 中定位从 s_GlobalMetadataHeader 复制数据后的赋值操作
get_meta_header_decrypted_value
输入头部值和密钥返回解密结果的函数,定位方式同上
get_meta_version_and_key
在元数据端点请求前后调用,提供游戏版本和密钥(用于生成网络请求密钥及乱序字段)。
注意:此函数若延迟调用会引发问题,故选择挂钩拦截。IDA 中可在加密元数据加载后定位仅接收 2 个指针参数的函数。