unity游戏逆向

unity游戏主要是由c#编写的

unity最大的特点就是一次制作多平台部署,这一核心功能是通过Mono实现的,但在2014年引入了IL2CPP,相比于mono来说安全性型更强的方式

1. Mono逆向

Mono打包的逆向比较简单,主逻辑多是在game/data/Managed/文件夹下的Assembly-CSharp.dll等文件

Mono技术原理

<1>Mono是一个开源的.NET框架实现

<2>允许Unity在多种支持.NET的平台上运行

<3>提供兼容的运行时环境和类库

<4>将源码编译成IL(中间语言代码)

dnspy

game/data/Managed/文件夹下的Assembly-CSharp.dll放在dnspy

直接在Assembly-CSharp.dll找_默认命名空间容器,c#的类就在其中

ctrl-shift+s修改

ce(游戏修改器)

作弊器,主要功能是内存扫描、16进制编辑器、动态调试

进行数据的快速扫描和修改

最左面是扫描到的数据,下面进行修改

第一个例题先进行扫描,之后打一下变个数,之后再下一次扫喵找到数(相当于在第一次找到的在进行二次筛选)

CE的MoNO分析

在游戏中访问和修改C#类、函数集齐对象,实现数据的精确修改

先用dnspy在_(默认命名空间)的关键类下找到关键函数,定位函数所在的dll文件

之后通过CE附加程序,之后Mono先激活再查找Mono中的.Net info找到关键函数的字段

C#的字段先当与一个指针(先找到字段指向的地址)

点击Look up instance找到实例其值就是地址1e8c99cb020

在这个实例下(地址下)找到原来字段的数据类型所在的地方,之后找到方法然后invoke

2.Mono安卓

其特征是在lib/架构/下存在libmono.so

Assembly-CSharp.dll存在在assets/bin/Data/Managed

3.IL2CPP

  • 游戏目录下存在大型GameAssembly.dll文件(直接在游戏目录)

  • 包含Data/il2cpp_data/Metadata/global-metadata.dat文件

global-metadata.dat是一个元数据,包含类型信息、方法信息、字段信息

Mono将代码编译成IL的中间语言,逆向相对容易,

IL2Cpp:

1.将IL代码转化为**c++**代码

2.再编译成机器码,更安全

XYCTF2024-baby unity

主要分析GameAssembly.dll

GameAssembly.dll不是C#,而是IL2cpp转换后的c++

首先要用il2cppdumper通过global-metadata.dat(元数据)恢复符号表等信息,导出脚本

il2cppdumper先选GameAssembly.dll再选Data/il2cpp_data/Metadata/global-metadata.dat

各种原数据都在json中,script.json和头文件

在script file中先选ida_with_struct_py3.py之后再选ilcpp2.h与script.json

便可加载符号 + 结构等信息

生成一个DummyDll,这主要是辅助分析,仅有名字无内容的空dll(看Assembly-Csharp.dll)

ida搜索找到的关键函数

.data:0000000181261938 StringLiteral_4850 dq 0A0001979h ; DATA XREF: Check$$CheckkkkkkkkkkFlag+12↑o
.data:0000000181261938 ; Check$$CheckkkkkkkkkkFlag+DD↑r …
.data:0000000181261938 ; XIcKYJU8Buh:UeV:BKN{U[JvUL??VuZ?CXJ;AX^{Ae]gA[]gUecb@K]ei^22

就算找不到具体的值ida也会辅助分析出来

il2cpp安卓

特征lib/架构/下存在libil2cpp.so(mono是libmono.so)

assets/bin/Data/Managed/Metadata/global-metadata.dat元数据

正常的global-metadata.dat头为AF 1B B1 FA

Godot逆向

GDRE_Tools

github的项目地址:https://github.com/GDRETools/gdsdecomp

GDRE_Tools解包游戏

按extract导出,用godoat加载可以直接修改