目前Unity的游戏主要分为Mono和IL2CPP这两种,最主要的区别就是看游戏目录,如果有Assembly-CSharp.dll这个Dll则该游戏使用的是Mono虚拟机,否则就是使用IL2CPP。

image-20220115215515860

steam游戏的本体可以在 xxx\steamapps\common\游戏名字\ 找到。

Mono

使用Mono虚拟机的unity游戏,它的核心逻辑都是写在Assembly-CSharp.dll这个Dll里,所以我们可以使用(dnspy)[https://github.com/dnSpy/dnSpy/releases/tag/v6.1.8]进行反编译,并且找到SteamManager这个类。

image-20220115234334490

然后修改Awake这个函数最方便的就是修改方法,如果不行就直接修改IL指令和后续的IL2CPP修改汇编类似。

image-20220115234927623

image-20220115234956156

image-20220115234722473

替换游戏目录下的Assembly-CSharp.dll(记得备份原来的)即可。

image-20220115234820221

IL2CPP

使用IL2CPP作为跨平台虚拟机就比Mono稍微麻烦一点,我主要使用到了(IL2CPPDumper)[https://github.com/Perfare/Il2CppDumper/releases/tag/v6.7.6]和IDA,先将游戏目录下的GameAssembly.dll(安卓的为libil2cpp.so)和游戏_data\il2cpp_data\Metadata\global-metadata.dat 复制到同一目录。

image-20220115224249794

执行命令行Il2CppDumper.exe ,得到几个json和il2cpp.h。

image-20220116234624063

使用IDA打开GameAssembly.dll执行ida_with_struct_py3.py(在Il2CppDumer目录下)脚本,分别载入以下json和h文件,即可获得该DLL的符号信息(感觉类似pdb的作用)。

image-20220115224315481

image-20220115230450065

同样找到SteamManager.Awake这个函数,直接Hex修改函数头使其直接返回,即可绕过验证。

image-20220115232106653

最后保存并替换原始的GameAssembly.dll(记得备份)。

image-20220115232205460

image-20220115232541421

声明

以上内容仅为Unity游戏逆向和Il2CppDumper的学习笔记,仅供学习参考,切勿用于违法违规行为