浅谈CTF中的unity游戏逆向
字数 1516 2025-08-07 08:22:23
Unity游戏逆向分析技术详解
一、前言
Unity游戏逆向在CTF比赛中越来越常见,主要分为两类:
- DLL类型游戏(基于Mono)
- libil2cpp类型游戏(基于IL2CPP)
二、必备工具
1. 安卓APK逆向三件套
- Apktool:解压/重新打包APK
- dex2jar:将dex转换为jar
- jd-gui:查看dex文件逻辑
2. DLL文件逆向工具
- dnSpy:查看和修改DLL程序逻辑
- ILDASM:反编译DLL生成IL文件
- ilasm:重新编译IL文件为DLL
三、Unity技术背景
1. Mono与IL2CPP
- Mono:早期Unity使用的跨平台.NET实现,核心代码在Assembly-CSharp.dll中
- IL2CPP:Unity为提高安全性引入的技术,将C#编译为C++,生成libil2cpp.so和global-metadata.dat
2. 中间语言(IL)
- 类似面向对象的汇编语言
- 可读性较高,易于逆向分析
四、DLL类型Unity逆向
1. 基本流程
- 解压APK获取Assembly-CSharp.dll
- 使用dnSpy分析关键逻辑
- 修改DLL并重新打包
2. 典型案例分析
案例1:[BJDCTF2020]BJD hamburger competition
- 关键点:
- 在ButtonSpawnFruit类中找到Spawn方法
- 分析secret变量的处理逻辑
- SHA1和MD5双重加密验证
案例2:[2019红帽杯]Snake
- 关键点:
- 发现外部导入的Interface.dll
- 使用IDA分析C++编写的DLL
- 编写爆破程序测试GameObject函数
案例3:[RoarCTF2019]TankGame
- 关键点:
- 分析WinGame方法中的条件判断
- 理解MapState数组结构
- 编写Python脚本暴力破解
五、IL2CPP类型Unity逆向
1. 基本流程
- 获取libil2cpp.so和global-metadata.dat
- 使用IL2CPPDumper提取类和方法信息
- 使用IDA进行深入分析
2. 典型案例分析
案例1:[MRCTF2021]EzGame
- 关键点:
- 使用CE修改游戏数据
- 分析EatTokenUpdateKey方法
- 逆向计算8字节key的生成算法
案例2:[Nu1LCTF2018]baby unity3d
- 关键点:
- 使用Riru框架dump解密后的metadata
- 分析CheckFlag函数
- 使用Frida进行Hook获取AES密钥
六、Frida Hook技术
1. 环境搭建
- 安装Python客户端:
pip install frida frida-tools - 下载对应架构的frida-server到Android设备
2. Hook技术要点
- 有导出函数:通过函数名定位
- 无导出函数:通过特征字符串定位
3. 典型Hook脚本
Java.perform(function(){
var soAdrr = Module.findBaseAddress("libil2cpp.so");
var ptrCheckFlag = soAdrr.add(0x518a24);
Interceptor.attach(ptrCheckFlag,{
onEnter: function(args){
console.log(hexdump(args[1]));
},
onLeave: function(retval){
retval.replace(1); // 修改返回值
}
})
})
七、进阶技巧
- DLL注入:修改游戏运行时行为
- 内存修改:使用Cheat Engine定位关键数据
- 算法逆向:分析加密/校验逻辑
- 条件爆破:针对复杂条件编写自动化脚本
八、参考资源
- Unity官方文档
- IL2CPP逆向工具链(GitHub)
- Frida官方文档
- CTF比赛Writeup合集
九、总结
Unity游戏逆向技术要点:
- 快速定位关键代码(DLL或so)
- 理解游戏逻辑与逆向条件的关联
- 掌握静态分析与动态调试的结合
- 熟练使用各类逆向工具链
- 具备算法分析和脚本编写能力
通过系统学习和实践,可以逐步掌握Unity游戏逆向的各种技巧,在CTF比赛和实际安全研究中取得成果。