Global-Metadata Hiding

发布于 2019-04-09  1.22k 次阅读


从 Dragalia Lost ~失落的龍絆~ 入手,简析Metadata-hiding,并尝试在自己的Unity小游戏项目中实现类似功能

0x01 分析 Dragalia Lost ~失落的龍絆~ ,尝试dump出metadata

拿到ver1.6.1的安装包,用Bandizip打开看看:

没有Metadata文件夹

可以发现,关键的metadata文件夹不见了,通常这种情况下global-metadata.dat会被隐藏在libil2cpp.so中。用ida打开,定位到MetadataLoader::LoadMetadataFile(),可以看到解密函数如下:

coneshell_global_metadata_dat_len即为global-metadata.dat文件的长度:

记住0xF26844这个数字,接下来我们用模拟器+GameGardian,dump出游戏解密后的内存:

选择红框处功能
将内存中的libil2cpp.so dump出来

dump出来的结果是一个bin文件,用winhex搜索global-metadata.dat文件的magic header"AF1BB1FA":

搜索得到唯一结果:

结合上文得到的文件长度,就能把metadata抠出来啦。不过仅仅如此也没法正常使用il2cppdumper,后续如何修复就不在本文的研究范围内了(逃

上述方法同样适用于部分加密了global-metadata.dat的游戏

0x02 尝试在自己的Unity项目中实现Metadata-hiding

参考Nu1LCTF

编译环境:win10 + Unity 5.6.4p4

首先使用原版代码生成一个正常的bird.apk,查看其内部结构:

此时存在global-metadata.dat且未加密,il2cpp.so大小为5m+。将global-metadata.dat提取至桌面,使用如下代码进行加密:

加密后的global-metadata.dat:

使用010 Editor打开该文件,File - Export Hex,生成头文件并重命名为MetadataHexData.h备用:

MetadataHexData.h 内容如下:

进入Unity安装目录\Unity5.6\Editor\Data\il2cpp\libil2cpp\vm下,导入头文件MetadataHexData.h,并修改MetadataLoader.cpp

重新Build,得到修改后的bird.apk,查看其内部结构:

可以发现il2cpp.so大小增加至6m+。删除Managed文件夹下的Metadata文件夹,并重签名,进行安装测试。

测试环境:MuMu模拟器,2.0.20.2,安卓6.0.1

可正常打开。游戏逻辑无异常。