IL2CPP的原理(生成)机制
一、IL2CPP的原理(生成)机制:
D:\Program Files\Unity\Editor\Data\il2cpp
E:\Work\2019Q2\Unity\HotfixCalc\Temp\StagingArea\Il2Cpp\il2cppOutput
- 所有的函数都不是成员函数。也就是说函数的第一个参数永远都是“this”指针。对于托管代码中的静态函数而言,IL2CPP会传递NULL作为第一个参数的值。这么做的好处是可以让il2cpp.exe转换代码的逻辑更加简单并且让代理函数的处理变得更加容易。
- 所有的函数还有一个额外的MethodInfo*参数用来描述函数的元信息。这些元信息是虚函数调用的关键。Mono使用和特定平台相关的方法来传递这些元信息。而IL2CPP出于可移植方面的考虑,并没有使用这些和平台相关的特定代码。所有的函数都被声明成了extern “C”,这样一来,在需要的时候我们就可以骗过C++编译器让其认为所有这些函数都是一个类型。
二、IL2CPP的加载过程:
建立方法与metadate符号之间的联系,以及具体的GetMethodPointer结构:
三、IL2CPP的安全:
虽然经过il2cpp以后,il转为cpp,从性能、平台的通用性等有了进一步的提高,但是通过上面的分析可以知道,会把所有相关的符号写到一个global-metadata.dat文件中,并且运行的时候通过解析这个符号文件与对应的函数文件指针绑定,这个时候就完成了函数的调用;同样从另一个角度来讲,这样就暴漏出来了安全问题,可以通过解析对应的global-metadata.dat文件找到对应的函数指针,对一些关键逻辑函数进行篡改,这样就完成了**和对于逻辑的修改。
对于攻击者来说有时候不仅仅是进行篡改,其实还想得到友商的一些逻辑写法,因此这个时候对于so中的代码保护也显得非常的重要。
因此从安全的角度需要对这个.data文件以及so文件进行保护;
四、IL2CPP的保护:
4.1对“global-metadata.dat”进行整体的加密:
对LoadMetadataFile函数进行hook,在加载解析前进行解密;
global-metadata.dat细粒度的处理:对于global-metadata.dat进行加密,然后外层包装一层代码,在hook的时候读取出来。
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/