Loading... # 前言 存放仓库: https://github.com/chinosk6/gakuen-idolmaster-global-metadata-decrypt ~~刚开服就炸服,典~~ 本文章分享万代旗下偶像大师系列新手游 - 学园偶像大师的 global-metadata 解密思路 本人水平有限,如有错误之处,烦请各位指正~ 本人之前参与过 [赛马娘][1] 和 [偶像大师 闪耀色彩 Song for Prism][2] DMM PC 端的本地化插件制作。PC 端一般情况下只对 `GameAssembly.dll` 做加密,`global-metadata.dat` 是不加密的。因此只需要在运行时将 `GameAssembly.dll` dump 出来即可。安卓端则正好相反,会对 `global-metadata.dat` 加密。目前现有的工具都是直接导出 `dump.cs`,若想要将符号名导入 IDA 中,这显然是不够用的。因此需要获得解密后的 `global-metadata.dat` ,然后使用 [Il2CppDumper][3] 进行 dump。 最省事的方法当然是在运行时直接将解密后的 `global-metadata.dat` dump 出来。使用 [frida][4] 时,发现只要将 frida 附加到游戏进程后,游戏就会崩溃重启,猜测可能是游戏本身有检测(也有可能是我的环境有问题)。折腾了半天无果,遂放弃。接下来只能直接逆向 `libil2cpp.so` 寻找解密方法了。 参考了 [Il2cpp逆向:global-metadata解密][5] 和 [IL2CPP Tutorial: Finding loaders for obfuscated global-metadata.dat files][6] 两篇文章的方法,非常感谢大佬们的总结~ # 0x1 寻找目标函数 首先需要从 apk 里提取出 `libil2cpp.so` 和 `global-metadata.dat`,此过程不再赘述。 目前已知,Unity 加载 `global-metadata` 相关函数的调用链是 ```cpp il2cpp_init -> il2cpp::vm::Runtime::Init -> il2cpp::vm::MetadataCache::Initialize -> il2cpp::vm::MetadataLoader::LoadMetadataFile ``` 从 `libil2cpp.so` 的导出函数中,可以直接找到 il2cpp_init,直接双击定位过去 ![il2cpp_init][7] 进入 `sub_3D9F850` ![sub_3D9F850][8] 点进去看,并和源码进行对比,可以发现,`sub_3DAB764` 就是 `MetadataCache::Initialize` ![sub_3DAB764][9] 进入 `sub_3DF1188` ![sub_3DF1188][10] 找到我们的目标: `global-metadata.dat` 了,进入 `sub_3963DD0` 查看, 可以发现它就是 `MetadataLoader::LoadMetadataFile` ![sub_3963DD0_head.png][11] ![sub_3963DD0_foot.png][12] 分析这个函数,可以明显看出下面这段函数就是解密逻辑 ```cpp if ( v9 >= 1 ) { v11 = 0LL; do { v10[v11] ^= byte_19F5A7D[v11 & 0x7F]; ++v11; } while ( v9 != (_DWORD)v11 ); } ``` 查看 `byte_19F5A7D` 的值,并将其转换为 Array ![byte_19F5A7D.png][13] ![byte_19F5A7D_cvt.png][14] 将 Array 的值复制出来,至此我们成功获取到解密所需的全部条件。 # 0x2 编写解密脚本 将上一步获取到的 `byte_19F5A7D` 数组的值复制出来,根据伪代码的逻辑,可以写出以下代码 ```python flags = [0xC1, 0x7A, 0x3C, 0x9D, 0x2F, 0x71, 0x7B, 0xED, 0xE2, 0xD0, 0xDF, 0xC9, 0xFB, 0x19, 0x3D, 0x4E, 0xD3, 0x5C, 0xEB, 0x9A, 0x5A, 0xFF, 0x2B, 0x45, 0x91, 0x5B, 0x45, 0xBA, 0x7E, 0x26, 0x38, 0xBC, 0x3D, 0x4F, 0x3D, 0xF8, 3, 0x80, 0xF7, 0x19, 2, 0x42, 0xA5, 0x4B, 9, 0xA8, 0x20, 0xC8, 0xEF, 0xBC, 0x33, 0x7C, 0xD1, 0xD9, 0x6F, 0xC2, 0x4E, 0xF6, 0xC, 0xD3, 0x2B, 0xC1, 0x6F, 0xBB, 0x98, 0x22, 0x8B, 0xAB, 0xDC, 0x44, 0x4B, 0x52, 0x65, 0xD2, 0x97, 0x18, 0x59, 0xE0, 0x3B, 0xE9, 0x3B, 0x7D, 0xCB, 0xC1, 0xF3, 0xBB, 0xEA, 0x64, 0xE0, 0x7B, 0xAA, 0xC, 0x74, 0x23, 0xEE, 0x41, 0xD3, 0xEA, 0xB2, 0xE7, 0x1C, 0x74, 0xEC, 0xAA, 0x71, 0xE0, 0x17, 0xFF, 0x41, 0x57, 0x68, 0x6E, 0xBA, 0x23, 0x98, 0xAE, 0xF6, 0xAD, 0xC8, 0xDD, 0x38, 0x27, 0xCA, 0x61, 0x9A, 0x3F, 0xDE, 0x41, 0, 0, 0, 0x34, 1, 0x7F, 1, 0x16, 0] with open("global-metadata.dat", "rb") as f: file_bytes = f.read() new_bytes = bytearray(file_bytes) for n, _ in enumerate(file_bytes): new_bytes[n] ^= flags[n & 0x7F] with open("global-metadata-new.dat", "wb") as f: f.write(new_bytes) ``` 运行这段 Python 脚本后,查看解密后的文件 ![解密文件][15] 看到了 `AF 1B B1 FA` 文件头,说明解密成功了 # 0x3 Dump DLL,并将符号导入 IDA 将 `libil2cpp.so` 和解密后的 `global-metadata` 扔进 [Il2CppDumper][16],可以顺利 Dump 出 dll 和 Script ![dumps][17] 在 IDA 中,点击 `File` - `Script File`,选择 `ida_with_struct_py3.py`,接下来依次选择 Dump 出来的 `script.json` 和 `il2cpp.h`,即可在 IDA 中查看带符号的代码 ![ida_final.png][18] # 0x4 Enjoy! 至此已经成功获得 Il2CppDumper 生成 DLL 文件以及带符号名的 `libil2cpp.so`,接下来就是各位自由发挥的时刻了! [1]: https://github.com/MinamiChiwa/Trainers-Legend-G [2]: https://github.com/chinosk6/scsp-localify [3]: https://github.com/Perfare/Il2CppDumper [4]: https://github.com/frida/frida [5]: https://ashenone66.cn/2022/04/22/il2cpp-ni-xiang-global-metadata-jie-mi/ [6]: https://katyscode.wordpress.com/2021/02/23/il2cpp-finding-obfuscated-global-metadata/ [7]: https://www.chinosk6.cn/usr/uploads/2024/05/1740042178.png [8]: https://www.chinosk6.cn/usr/uploads/2024/05/1491517713.png [9]: https://www.chinosk6.cn/usr/uploads/2024/05/880924408.png [10]: https://www.chinosk6.cn/usr/uploads/2024/05/424217853.png [11]: https://www.chinosk6.cn/usr/uploads/2024/05/1332445389.png [12]: https://www.chinosk6.cn/usr/uploads/2024/05/1894850133.png [13]: https://www.chinosk6.cn/usr/uploads/2024/05/1047372240.png [14]: https://www.chinosk6.cn/usr/uploads/2024/05/1616238723.png [15]: https://www.chinosk6.cn/usr/uploads/2024/05/898666517.png [16]: https://github.com/Perfare/Il2CppDumper [17]: https://www.chinosk6.cn/usr/uploads/2024/05/1649797262.png [18]: https://www.chinosk6.cn/usr/uploads/2024/05/2214537942.png Last modification:May 17th, 2024 at 05:13 pm © 允许规范转载 Support 感谢老板~ ×Close Appreciate the author Sweeping payments Pay by AliPay Pay by WeChat
大佬会出偶像荣耀的解包教程吗?或者有没有其他人有做过可不可以分享下连接?
这个好!感谢大佬!
为啥解包出来模型是obj格式……很神奇,一个只有模型各种绑定顶点组信息都没有的格式……一般来说至少是带绑定的fbx模式吧,不知道是解包的问题还是本身包里就是这样防止解密的。。
global-metadata被加密了,自己看了半天结果搜github就搜到了
这游戏普通的抓包没办法搞,倒是有人发给我了一些api以及资源下载链接,看看global-metadata里有没有能用的key
至于资源的加密估计和IP的方式差不多
资源加密的方法和ip相比基本没变,dump内存找到key之后用了大佬的轮子都解出来了。
打扰了,可以问问更详细的步骤吗?想解出来模型应该怎么做呢?
https://github.com/kishidanatsumi/gkmasToolkit 有人做了
因为assetstudio导入不了学马仕的模型 我看是文件加密了不知道怎么解密上网乱搜搜到了您的文章呜呜 我看不少拆包教程和您的能对上还以为可以用 老师您方便加下联系方式吗不方便的话当我没说呜呜