IL2CPP的原理(生成)机制

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/feibabeibei_beibei/article/details/95922520

一、IL2CPP的原理(生成)机制:

Runtime库:

il2cpp相关的工具库在unity安装目录下:

D:\Program Files\Unity\Editor\Data\il2cpp

对于一个工程通过配置生成选项生成的CPP文件的临时目录是:

E:\Work\2019Q2\Unity\HotfixCalc\Temp\StagingArea\Il2Cpp\il2cppOutput

接下来简单的看一下对于部分的运算所产生的前后对比文件:

1.1逻辑运算的处理:

对应的IL代码

产生的cpp文件:

1.2非逻辑运算的处理:

1.3 字符串的声明:

借鉴网上的一段说明:

字符串的定义

  1. 所有的函数都不是成员函数。也就是说函数的第一个参数永远都是“this”指针。对于托管代码中的静态函数而言,IL2CPP会传递NULL作为第一个参数的值。这么做的好处是可以让il2cpp.exe转换代码的逻辑更加简单并且让代理函数的处理变得更加容易。
  2. 所有的函数还有一个额外的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/

猜你喜欢

转载自blog.csdn.net/feibabeibei_beibei/article/details/95922520