Dex动态解密与So混淆:

  1. Dex Method代码动态解密
  2. So代码膨胀混淆
  3. 对抗前代出现的脱壳方法

第三代加固技术-指令抽离

由于第二代加固技术仅仅是在文件级别上对App实施保护,其导致payload在内存中是连续的,可被轻易获取;第三代对此进行改进,将保护级别提升到函数级别。

主要的流程是:发布阶段将原始dex内的函数内容(code item)清除,单独移到一个文件中,运行阶段将函数内容重新恢复到对应的函数体。

恢复的时间点有几个方式:

A、加载之后恢复函数内容到dex壳所在的内存区域

B、加载之后将函数内容恢复到虚拟机内部的结构体上:虚拟机读取dex文件后内部对每一个函数有一个结构体,这个机构体上有一个指针指向函数内容,可以通过修改这个指针修改对应的函数内容。

C、拦截虚拟机内与查找执行代码相关的函数,返回函数内容。

兼容性:

由于使用大量的虚拟内部结构,和不同厂商的定制,具有很大的兼容性问题。

缺陷与对抗:

指令抽离技术与虚拟机的JIT(即时编译技术)有冲突,无法发挥最大性能。

仍旧可以通过自定义虚拟机,在解释器的代码上记录函数内容,然后遍历触发所有函数,从而获取全部函数内容,最终重组成一个完整的dex文件。目前已有自动化脱壳工具可以在指令抽离技术中脱壳。

编译策略: JIT vs AOT:

JIT在Android2.2版本后被添加到dalvik中,针对执行次数较多的dex编译为本地机器码(发生在程序运行阶段),某种程度上加快程序执行速度。APP每次重新运行,JIT都会做一次编译。JIT存活时限Android2.2 - Android4.4;在Android4.4版本上dalvik与ART两种运行时环境并存,可以相互切换,但Android5.0+,dalvik被彻底丢弃,全部采用ART。

results matching ""

    No results matching ""