首页
社区
课程
招聘
[原创]游戏YS的global-metadata文件保护分析记录
2021-1-31 22:18 26646

[原创]游戏YS的global-metadata文件保护分析记录

2021-1-31 22:18
26646

目录

前言

早在9.15的时候其实就开始尝试分析YS了,不过那个时候没啥动力,后来一次面试说可能用到,就尝试做了一下。

 

以前都是试着搞一下小一点的游戏,第一次对这种有一点名气的厂商下手,心里还是挺打鼓的(典型欺软怕硬)。

 

全程边肝游戏边逆差不多陆陆续续搞了一周吧,对于我这种菜鸡大学生来说花了不少时间。

 

之前搞完丢一边没管了,最近放假加拔智齿导致茶饭不思,有人提到了就又想起来了,还是记录一下分析过程,方便拾遗。

 

以下源自于9.15时的开服版YS,地址等相关信息和现版本不同。

正文

翻一下游戏目录,可以看出是一个登录器加U3D游戏的结构。

 

看到global-metadata.dat文件加UserAssembly.dll,il2cpp模式的没跑了。

 

试着上il2cppdumper,看看能不能行,结果理所应当地直接跑崩了。

 

上IDA,看看做了啥手脚。

 

要说il2cpp模式下的保护,最常见的应该就是在MetadataCache::InitializeMethodMetadata和MetadataCache::Initialize这两个个函数中对gm文件进行解密工作,我们可以通过比对Unity提供的源代码,就可以很快发现一些线索。

 

首先是载入gm文件的部分,根据字符串“global-metadata.dat”搜索定位到疑似MetadataCache::Initialize函数,找到加载的部分,发现在加载完文件之后以字节数组和文件长度为参数调用了一个未知的函数:

 

加载gm文件并解密

 

这种形式很明显了,加载文件之后调用的这个函数大概可以判断为解密函数了,找到这个函数指针看一下,发现它的初始化是来自于一个导出函数,这个函数初始化了三个其它函数地址:

 

security函数地址

 

标记一下这块区域,这三个函数地址应该是我们需要重点关注的对象了(图这里已经确定作用了做好标记了,原始文件没有信息)。

 

三个关键函数

 

接下来去MetadataCache::InitializeMethodMetadata这个函数瞅瞅。

 

这里可以追踪s_GlobalMetadata和s_GlobalMetadataHeader两个指针,这里大部分操作都是围绕着这两个指针进行的。

 

gm文件头指针

 

在熟悉的kIl2CppMetadataUsageStringLiteral分支里发现了猫腻,这个分支会处理字符串相关的东西,返回Il2CppString类型的值。因此这里也常被用来加密字符串:

 

GetStringLiteralFromIndex

 

这里调用的GetStringLiteralFromIndex函数正好就是存在之前标记的那块区域的三个函数之一,可以确定这里也被魔改了,调用了外界的解密函数。

 

那么就剩下最后一个函数了,对那个函数进行交叉引用,发现之前加载gm文件的上级函数有调用过这个函数,跟进去,发现这里才是真正对应MetadataCache::Initialize函数的地方,前面那个函数应该是被摘出来用来加载gm文件的部分。

 

进入这个函数,对着官方的源代码找,确定了这个函数的作用:

 

GetStringFromIndex

 

除了这三个函数之外,还可以注意到Il2CppGlobalMetadataHeader也被动了手脚:

 

Il2CppGlobalMetadataHeader

 

这里原本应该是:

 

Il2CppGlobalMetadataHeader原

 

这种打乱偏移的东西恢复起来没啥技巧,找使用的地方,然后对着还原就行,就是挺费精力的。

 

这几个地方搞好之后,就可以魔改il2cpp把信息dump出来了。

 

留个纪念

 

哦对了,还有一点小插曲,在这三个函数的使用上面,我一开始尝试直接载入这个dll然后调用这三个函数,发现炸了,看着三个函数还做了流程混淆直接就不想分析了,后来猜想可能是在游戏运行的时候对一些值进行了初始化,这三个函数需要读取外面的值,就动态注了一个dll进去,和外界魔改的il2cppdumper进行进程通信,才把符号搞出来。

 

还好非Unity引擎层面的常规保护米忽悠没怎么注重,就搞了常规的那一套,Object钩子之类的,要不然还得麻烦。

 

最后展示一下成功,一个小小的透视挂,前期缺经验找宝箱时做的:

 

最终结果

总结

总结一下米忽悠对于YS的保护思路:

 

1、常规保护,这个没啥可讲的,不是新鲜手段。

 

2、global-metadata.dat文件保护,这里米忽悠采取了两个方法,第一个是针对整个gm文件的加密,在加载这个文件时再对整个文件进行解密;第二个是打乱了Il2CppGlobalMetadataHeader结构,让il2cppdumper无法正确地按照原有的结构获取gm文件的头信息。

 

3、字符串保护,符号文件保护嘛,字符串保护也是手段之一,这里的GetStringFromIndex和GetStringLiteralFromIndex两个函数都是原本il2cpp就有的函数功能,米忽悠将它们替换为了一个带有解密功能的函数,使il2cppdumper无法正确地获取到字符串信息。

 

4、这里是最恶心的一种手段,因为它没有方法破解,所以我上面也没有提到。这是啥呢?直接Hash混淆字符串,它把非引擎或者不需要通过字符串使用的符号信息全给混淆了:

 

字符串混淆

 

还记得我上篇记录这么提到过:

 

一个Unity游戏保护方案的分析和还原符号信息,偷学对global-metadata保护的思路

 

上一篇

 

说啥来啥就出现了,这种直接把字符串变成无意义的(大概是某种Hash算法)信息永远是最恶心破解者的。

题外话

快要毕业了,下学期估计就是边毕设边实习了。

 

之前实习过一道了,感觉还不错,同事大家都挺好的,帮了我很多。之前在面经里看到各种实习陷阱云云,还在担心自己会不会踩坑,目前来看可以放心工作啦。

 

防御别人和攻击别人是两个难度,虽然现在的我可以说着这些保护的优缺点在哪里云云,但是真让我自己上去做保护,估计也得摔不少跤,慢慢来吧。

 

希望以后我能坐在办公室里思考怎么用更恶心的保护恶心别人吧。


[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 7
打赏
分享
打赏 + 10.00雪花
打赏次数 1 雪花 + 10.00
 
赞赏  Amun   +10.00 2021/02/02 再接再厉
最新回复 (13)
雪    币: 2510
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_xghoecki 2021-2-1 01:45
2
1
坛里有你更精 ,彩感谢分享
雪    币: 1112
活跃值: (2724)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Amun 2021-2-2 18:08
3
0
对`global-metadata.dat`文件加密,用于反dump数据结构的做法,效果就跟纸糊的一样;
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_Young_195 2021-2-26 15:17
4
0
楼主实习考虑腾讯么?
雪    币: 4470
活跃值: (3574)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
木志本柯 2021-2-26 17:11
5
0
Amun 对`global-metadata.dat`文件加密,用于反dump数据结构的做法,效果就跟纸糊的一样;
欺软怕硬
雪    币: 1176
活跃值: (1219)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
Tennn 5 2021-2-26 17:47
6
0

 保护是真的弱 一天搞定(后面俩天空了点时间改成了自动化...)(源码没有 不信你当我吹牛

il2cpp 换来换去都是那几种思路(无论手游端游) hook、 改格式... 不将底层引擎改了 其实都是...

千言万语一句话



大家等我在某公司的游戏驱动xxxxxxxxxxxxkernel。。。 (不排除上线改名


markdown呢 好久没登又改了吗 老了老了

最后于 2021-2-26 17:53 被Tennn编辑 ,原因:
雪    币: 168
活跃值: (832)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
灰灰Hui 2021-3-18 18:36
7
0
Tennn  保护是真的弱 一天搞定(后面俩天空了点时间改成了自动化...)(源码没有 不信你当我吹牛il2cpp 换来换去都是那几种思路( ...
代码混淆强度和运行效率不可兼得啊,毕竟做游戏还是得效率优化为上
雪    币: 31
活跃值: (287)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
lakwsh 2021-3-18 18:45
8
0
大佬,坐标转换的算法方便分享一下吗?很久之前就把世界坐标弄出来了,结果不会算屏幕的坐标。。
雪    币:
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_isbpqtbv 2021-4-16 00:53
9
0
大佬,有办法改模型或者渲染吗?我想把马赛克去掉,它就是从人物底部发射一个射线,与镜头角度计算向量夹角,当朝上看时会加一个马赛克效果。
雪    币: 62
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_小清新 2022-1-11 00:47
10
0
大佬 这个混淆 能否破解呢 有没有什么脚本 直接搞定的 
雪    币: 242
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
解源 2022-12-17 18:53
11
0
呜  大佬 我碰见一个unity3d pc游戏  搞不定global-metadata 文件  解不出原始游戏文件       用ida也打不开游戏exe
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
744722817 2023-6-14 23:47
12
0
Tennn  保护是真的弱 一天搞定(后面俩天空了点时间改成了自动化...)(源码没有 不信你当我吹牛il2cpp 换来换去都是那几种思路( ...
大佬,求github地址
雪    币: 20015
活跃值: (29561)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-6-15 09:19
13
1
感谢分享
雪    币: 2831
活跃值: (1950)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_荣仔 2023-6-15 09:39
14
0
Tennn  保护是真的弱 一天搞定(后面俩天空了点时间改成了自动化...)(源码没有 不信你当我吹牛il2cpp 换来换去都是那几种思路( ...
大佬,求github地址,学习
游客
登录 | 注册 方可回帖
返回