ryanhn717 发表于 2024-3-14 13:17

【Dump那点事】内存一键定位coderegistration和metadataregistration的方法

本帖最后由 ryanhn717 于 2024-3-14 13:34 编辑

说明
https://static.52pojie.cn/static/image/hrline/line3.png

经常Dump的同学可能会碰到以下情况,本文提供一种简便的内存获取此值的方法。



前言
https://static.52pojie.cn/static/image/hrline/line3.png

网上已有很多关于使用IDA来查找coderegistration和metadataregistration的文章,略作总结如下(此文不做额外延申):
1、通过字符串交叉引用最终定位il2cpp::vm::Runtime::Init,找到 s_Il2CppCodeGenRegistration中包含的coderegistration和metadataregistration。



【搜字符串如“global-metadata.dat”,“mscorlib.dll”等),交叉引用路径如下il2cpp::vm::GlobalMetadata::Initialize    →il2cpp::vm::MetadataCache::Initialize →il2cpp::vm::Runtime::Init →s_Il2CppCodeGenRegistration】

2、通过 il2cpp_init 定位找到 il2cpp::vm::Runtime::Init


由于很多游戏对于常用字符串或结构等进行了加密处理,操作者在使用IDA进行定位时需要对源码以及工具有一定程度了解。比如以下情况(游戏案例: XX方舟)

①字符串global-metadata.dat无交叉引用





②字符串mscorlib.dll交叉引用结构混乱(对照源码)



针对不熟悉IDA工具以及il2cpp源码的同学,我们可以从内存结构中直接获取coderegistration和metadataregistration。

正文
https://static.52pojie.cn/static/image/hrline/line3.png

工具:GG修改器
案例游戏:XX方舟 (截止发帖3.14最新版 64bit)

一、打开游戏,打开GG修改器,选择好游戏进程。内存范围选择 Ca/A/O 。
二、字符串搜索 get_fieldOfView 定位内存解密后的 global-metadata.dat 模块 ,随之获取该模块头地址,即metadata文件魔术字头地址(此案例已抹掉了魔术字头,可直接内存修改”AF1BB1FAr “进行还原)



三、更改内存范围为 Cb/A。对metadata魔术字头地址进行指针搜索,得到偏移量为" 8 "的两个指针。



四、分别对得到的两个指针做偏移" -18 "(十六进制),即可得到coderegistration 和 metadataregistration的指针,所得指针中包含的十六进制地址值即为所需数值, 此例为:
coderegistration : 6F9FFB6DB8
metadataregistration: 6F9FFB6E28



注意
https://static.52pojie.cn/static/image/hrline/line3.png

由于内存指针地址变动,所获数值需要对应当次内存dump出的global-metadata.dat和libil2cpp.so使用。
内存结构对应源码数据,如按本文方法无法获取所需数值,则需要进一步查看对应的内存结构,本文不在延申。


xixicoco 发表于 2024-3-15 01:42

有意思,在游戏领域很好的教程

uliaxs0n 发表于 2024-3-15 10:54

思路挺好,但是这种网游可不兴修改呀

hellostarrysky 发表于 2024-3-15 20:01

写的挺好

lyn520 发表于 2024-3-16 06:43

写的很棒,刚好在学过游戏检测

jsncy 发表于 2024-3-30 15:31

谢谢分享。

oath1 发表于 2024-3-30 18:14

学的很棒,学习了

Miyazaki002 发表于 2024-9-14 21:48

大佬请问指针搜索出来的数据类型不是Ca而是A的话要怎么处理呢

yunteng9527 发表于 2024-9-15 14:32

学习了.,
页: [1]
查看完整版本: 【Dump那点事】内存一键定位coderegistration和metadataregistration的方法