Runtime库:
il2cpp相关的工具库在unity安装目录下:
D:Program FilesUnityEditorDatail2cpp
对于一个工程通过配置生成选项生成的CPP文件的临时目录是:
E:Work2019Q2UnityHotfixCalcTempStagingAreaIl2Cppil2cppOutput
接下来简单的看一下对于部分的运算所产生的前后对比文件:
1.1逻辑运算的处理:
对应的IL代码:
产生的cpp文件:
1.2非逻辑运算的处理:
1.3 字符串的声明:
借鉴网上的一段说明:
字符串的定义
所有的函数都不是成员函数。也就是说函数的第一个参数永远都是“this”指针。对于托管代码中的静态函数而言,IL2CPP会传递NULL作为第一个参数的值。这么做的好处是可以让il2cpp.exe转换代码的逻辑更加简单并且让代理函数的处理变得更加容易。所有的函数还有一个额外的MethodInfo*参数用来描述函数的元信息。这些元信息是虚函数调用的关键。Mono使用和特定平台相关的方法来传递这些元信息。而IL2CPP出于可移植方面的考虑,并没有使用这些和平台相关的特定代码。所有的函数都被声明成了extern “C”,这样一来,在需要的时候我们就可以骗过C++编译器让其认为所有这些函数都是一个类型。1.4 :il2cpp的框架结构:
二、IL2CPP的加载过程:2.1对于metadata.data的解析以及读取:
根据这个函数获得所有的字符串信息;
2.2通过函数指针跟符号之间
接着看方法与这些字符串之间是怎么建立的联系:
SetupMethods方法结构的定义:
建立方法与metadate符号之间的联系,以及具体的GetMethodPointer结构:
三、IL2CPP的安全:虽然经过il2cpp以后,il转为cpp,从性能、平台的通用性等有了进一步的提高,但是通过上面的分析可以知道,会把所有相关的符号写到一个global-metadata.dat文件中,并且运行的时候通过解析这个符号文件与对应的函数文件指针绑定,这个时候就完成了函数的调用;同样从另一个角度来讲,这样就暴漏出来了安全问题,可以通过解析对应的global-metadata.dat文件找到对应的函数指针,对一些关键逻辑函数进行篡改,这样就完成了破解和对于逻辑的修改。
对于攻击者来说有时候不仅仅是进行篡改,其实还想得到友商的一些逻辑写法,因此这个时候对于so中的代码保护也显得非常的重要。
因此从安全的角度需要对这个.data文件以及so文件进行保护;
四、IL2CPP的保护:4.1对“global-metadata.dat”进行整体的加密:
对LoadMetadataFile函数进行hook,在加载解析前进行解密;
安全性:一般
4.2对于il2cpp文件的保护:
黑盒:so加壳
白盒:混淆、虚拟
4.3进阶保护:
global-metadata.dat细粒度的处理:对于global-metadata.dat进行加密,然后外层包装一层代码,在hook的时候读取出来。
so进行虚拟化保护(代码保护)
五、参考:
一、对于IL2CPP游戏的破解:
https://www.nevermoe.com/2016/09/08/%e8%bf%98%e5%8e%9f%e4%bd%bf%e7%94%a8il2cpp%e7%9a%84symbol%ef%bc%88%e4%ba%8c%ef%bc%89/