持续更新,一直更新,永远更新

IL2CPP

IL2CPP (Intermediate Language To C++) 是一种由 Unity 开发的脚本后端,可在为各种平台构建项目时替代 Mono。使用 IL2CPP 构建项目时,Unity 会在为所选平台创建本机二进制文件(例如 .exe、apk、.xap)之前将脚本和程序集内的 IL 代码转换为 C++。IL2CPP 的一些用途包括提高 Unity 项目的性能、安全性和平台兼容性。

mono后台apk的逆向分析  →  Assembly-CSharp.dll 逆向修改

il2cpp后台apk的逆向分析  →  il2cpp.so逆向修改

什么是IL

IL是.NET框架中中间语言**(Intermediate Language)**的缩写。使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的程序代码并不是CPU能直接执行的机器代码,而是一种中间语言IL(Intermediate Language)的代码。

IL2CPP 的工作原理

Untitled

一个游戏APK文件重要的部分:

比如一个简单的游戏 apk 文件,我们先拿到这两个文件,然后使用 Il2CppDumper 进行反编译,它会输出一些 .cs 文件,比如:

// Namespace: 
public class Hello // TypeDefIndex: 1414
{
    // Methods

    // RVA: 0x39CB58 Offset: 0x39CB58 VA: 0x39CB58
    public void .ctor() { }

    // RVA: 0x39CB60 Offset: 0x39CB60 VA: 0x39CB60
    public void SayHello() { }

    // RVA: 0x39CBF0 Offset: 0x39CBF0 VA: 0x39CBF0
    public void Say(string text) { }
}

一些 .h 文件:

struct Hello_Fields {
};

一些 json 文件:

{
  "Address": 3787608,
  "Name": "Hello$$.ctor",
  "Signature": "void Hello___ctor (Hello_o* __this, const MethodInfo* method);"
}

还有一个 DummyDll 文件夹,里面是一些 .dll 文件,其中 Assembly-CSharp.dll 是我们需要关注的。默认情况下,Unity 几乎将所有项目脚本都编译到 Assembly-CSharp.dll 托管程序集。