第一代加固——动态加载

使用 java 的动态加载技术,解密文件之后 loadDex

第二代加固——不落地加载

解决了第一代加固技术必须形成文件,容易被复制的问题,采用加载到内存的方式

第三代加固——指令抽离

解决第二代内存中连续可 dump,发布阶段的时候把 dex 文件中的函数内容抽离,单独移到一个文件中,运行时恢复:

  1. 可能是加载之后恢复函数内容到 dex 本身所在的内存区域
  2. 可能是将内容恢复到 vm 内部的结构体,通过修改指针(dex 文件)
  3. 拦截 vm 加载类中方法的函数

脱壳方法:通过触发调用记录和拼接 dex 文件

第四代加固——指令转换/VMP

使用 vm 解释器可能会被记录,所以第四代使用自己的解释器(Native 层),通过 native 的 VMP 加载代码

可以脱离出来作为黑盒进行调用

之后也差不多在 native 层做文章,多几个中间层增加复杂度了,差不多把所有东西都打散了