Unity逆向

工具

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文件(不包含代码),可用于提取MonoBehaviourMonoScript

使用方法

直接运行Il2CppDumper.exe并依次选择il2cpp的可执行文件GameAssembly.dll和global-metadata.dat(文件头 AF 1B B1 FA)文件,然后根据提示输入相应信息。程序运行完成后将在当前运行目录下生成输出文件。

命令

Il2CppDumper.exe <executable-file> <global-metadata> <output-directory>

输出文件

1
2
3
4
5
6
Wulin-Dump:.
│ dump.cs
│ il2cpp.h
│ script.json
│ stringliteral.json
└─DummyDll

IDA

  1. 先把GameAssembly.dll分析完。
  2. 安装IDAPython(IDA7.0及以上自带,吾爱有现成的,记得要添加环境变量 PYTHONPATH)
  3. IDA左上角 File ->Script File… ->Il2CppDumper 目录下的ida_with_struct.py,后面依次选择之前dump出来的script.json和il2cpp.h,等待脚本执行完成,中间可能会有警告和报错,直接无视。
  4. 开始分析,符号都已经加载好了,只不过从原来的CSharp变成了cpp,需要一定逆向功底。

参考:

[IL2CPP逆向] 某立志传 - 脱离Steam运行

frida-il2cpp-bridge

https://github.com/vfsfitvnm/frida-il2cpp-bridge

  1. 按照官方文档安装,然后注入下面的脚本,得到 dump.cs

    1
    2
    3
    4
    5
    import "frida-il2cpp-bridge";
    Il2Cpp.perform(() => {
    console.log(Il2Cpp.unityVersion);
    Il2Cpp.dump("dump.cs", "./")
    });
  2. 分析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
    }
  3. ida分析CheckFlag (Imagebase + RVA),根据dump.cs里的RVA恢复一下符号,可以看到

    加密只有一个简单的AES,那么只要拿到key和iv就行了,因为字符串信息都是保存在

    global-metadata.dat里的,所以在GameAssembly.dll 里是无法得到的,可以直接调试分

    析得到。

  4. 接着使用frida-il2cpp-bridge的Tracer来追踪一下String类

    1
    2
    3
    4
    5
    6
    import "frida-il2cpp-bridge";
    Il2Cpp.perform(() => {
    console.log(Il2Cpp.unityVersion);
    const String = Il2Cpp.corlib.class("System.String");
    Il2Cpp.trace(true).classes(String).and().attach();
    });

    注入,随便输点击一下按钮,就得到密文了。