工具
Unity Dll
一般的 Unity3D 游戏的主逻辑都在 Assembly-CSarp.dll
中,所以需要 dll文件逆向/重新打包
工具。Unity3D开发的游戏,其核心代码都在这个 dll 文件中,所以逆向/修改这个 dll 文件就可以了。
ILSpy
https://github.com/icsharpcode/ILSpy
用于查看dll程序逻辑。
ILDASM
用于反编译dll文件,生成il文件(存放了dll反编译后的指令)和res文件(反编译后的资源文件),可以安装Windows SDK或者从网上下载。
ilasm
.NET4.0自带,位置在 C:\Windows\Microsofr.NET\Framework\v4.0.30319\ilasm.exe
。
Unity il2cpp
Unity 程序为了防止大量的外挂和盗版游戏,推出了一种 il2cpp 的操作,大概就是让 C# 的中间代码 IL 转换成 C++ 来编译,最后生成汇编程序使得反编译难度大大增加。
Il2CppDumper
https://github.com/Perfare/Il2CppDumper
还原DLL文件(不包含代码),可用于提取MonoBehaviour
和MonoScript
使用方法
直接运行Il2CppDumper.exe并依次选择il2cpp的可执行文件GameAssembly.dll和global-metadata.dat(文件头 AF 1B B1 FA
)文件,然后根据提示输入相应信息。程序运行完成后将在当前运行目录下生成输出文件。
命令
Il2CppDumper.exe <executable-file> <global-metadata> <output-directory>
输出文件
1 | Wulin-Dump:. |
IDA
- 先把GameAssembly.dll分析完。
- 安装IDAPython(IDA7.0及以上自带,吾爱有现成的,记得要添加环境变量 PYTHONPATH)
- IDA左上角
File ->Script File… ->Il2CppDumper
目录下的ida_with_struct.py,后面依次选择之前dump出来的script.json和il2cpp.h,等待脚本执行完成,中间可能会有警告和报错,直接无视。 - 开始分析,符号都已经加载好了,只不过从原来的CSharp变成了cpp,需要一定逆向功底。
参考:
frida-il2cpp-bridge
https://github.com/vfsfitvnm/frida-il2cpp-bridge
按照官方文档安装,然后注入下面的脚本,得到 dump.cs
1
2
3
4
5import "frida-il2cpp-bridge";
Il2Cpp.perform(() => {
console.log(Il2Cpp.unityVersion);
Il2Cpp.dump("dump.cs", "./")
});分析dump.cs,搜索 Assembly-CSharp,发现了Check这个类,下面有个CheckFlag,接
着用ida分析一下,rva 是 0x0027d460
1
2
3
4
5
6
7
8
9
10
11// Assembly-CSharp
class Check : UnityEngine.MonoBehaviour
{
System.Void Start(); // 0x0027d670
System.Void Update(); // 0x0027d670
System.Void OnClick(); // 0x0027d4e0
System.Boolean CheckFlag(System.String input); // 0x0027d460
static System.String AESEncrypt(System.String text, System.String key, System.String iv); // 0x0027d200
static System.String AESDecrypt(System.String text, System.Byte[] key, System.Byte[] iv); // 0x0027d000
System.Void .ctor(); // 0x0027d680
}ida分析CheckFlag (Imagebase + RVA),根据dump.cs里的RVA恢复一下符号,可以看到
加密只有一个简单的AES,那么只要拿到key和iv就行了,因为字符串信息都是保存在
global-metadata.dat里的,所以在GameAssembly.dll 里是无法得到的,可以直接调试分
析得到。
接着使用frida-il2cpp-bridge的Tracer来追踪一下String类
1
2
3
4
5
6import "frida-il2cpp-bridge";
Il2Cpp.perform(() => {
console.log(Il2Cpp.unityVersion);
const String = Il2Cpp.corlib.class("System.String");
Il2Cpp.trace(true).classes(String).and().attach();
});注入,随便输点击一下按钮,就得到密文了。