第一代加固——动态加载
使用 java 的动态加载技术,解密文件之后 loadDex
第二代加固——不落地加载
解决了第一代加固技术必须形成文件,容易被复制的问题,采用加载到内存的方式
第三代加固——指令抽离
解决第二代内存中连续可 dump,发布阶段的时候把 dex 文件中的函数内容抽离,单独移到一个文件中,运行时恢复:
- 可能是加载之后恢复函数内容到 dex 本身所在的内存区域
- 可能是将内容恢复到 vm 内部的结构体,通过修改指针(dex 文件)
- 拦截 vm 加载类中方法的函数
脱壳方法:通过触发调用记录和拼接 dex 文件
第四代加固——指令转换/VMP
使用 vm 解释器可能会被记录,所以第四代使用自己的解释器(Native 层),通过 native 的 VMP 加载代码
可以脱离出来作为黑盒进行调用
之后也差不多在 native 层做文章,多几个中间层增加复杂度了,差不多把所有东西都打散了