游戏逆向入门
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加载可以直接修改
