一二三代壳和壳技术分类识别

xiaoeryu Lv5

动态加载

动态加载是DEX加壳和插件化热更新的一个基础(动态加载就是用到的时候再去加载,也叫懒加载用不到的时候是不会去加载的)。

比如说阿里的AndFix还有HotFix,腾讯的tinker、美团Robust等这些热修复框架的基础。动态加载还有热更新可以很方便的解决APP的快速迭代和更新的一个难题。从而避免了每次一发布新版本就需要用户来全量下载APP然后才能更新的过程。这样的话一方面可以提升用户体验,另一方面也可以快速的完成的bug的修复。但是如果只应用动态加载技术,是没有办法完成相关插件类当中的组件的这一个正常的运行。因为动态加载的DEX不具有生命周期的特征,APP中的Activity、Service等组件无法正常工作,它只能够完成一般函数的调用。归根结底是因为组件的Classloader和我们使用的DexClassloader不具备双亲委派的相关特征,导致PathClassloader没有办法找到这些DEX中使用的Activity、Service等相关的组件类,因此就需要对Classloader进行修正(例如上一篇文章中第一种方法中的replaceClassLoader()),这是加壳APP必然要做的一步,而在这步骤当中可以通常使用两种解决方案。

回顾一下上一章的两种方案

  • 第一种解决方案:

    通过修改系统组件类的Classloader也就是说这个mClassloader,可以通过反射去一步步的找到它然后再替换掉。替换成我们的DexClassloader,这样的话我们就可以找到我们插件DEX当中的相关的类信息了

  • 第二种解决方案:

    不需要改变这个mClassloader,只需要在PathClassloader和BootClassloader当中插入我们的DexClassloader。那这样的话由于双亲委派的原理,系统组件的这个mClassloader就可以找到我们自定义的这个类信息了。

    • 上面的这两种方案,DEX动态加载和Classloader的修正,是当前所有加壳手段的一个基础。有了这个DEX动态加载和Classloader的修正我们就有了这个加壳技术。接下来看下一代壳二代壳三代壳究竟是一个什么技术,为什么这么发展。

什么是一代壳二代壳三代壳

  • 一代壳:Dex加密

    • Dex字符串加密资源加密对抗反编译反调试自定义DexClassLoader
    • 因为第一代壳在内存中是一个整体所以定位到之后的脱壳是比较容易的
  • 第二代壳:Dex抽取与So加固

    • 对抗第一代壳常见的脱壳法Dex Method代码抽取到外部(通常企业版)Dex动态加载So加密
    • 首先是对Dex整体做了一个保护,其次对Dex中一些比较重要的函数代码进行了一个抽取,这样加载后的Dex并不是一个完整的在这样的情况下dump下来也是不完整的dex
  • 第三代壳:Dex动态解密与So混淆

    • Dex Method代码动态解密、So代码膨胀混淆,对抗之前出现的所有脱壳法
    • 我们的某些函数只有在被调用和加载的时候才执行,也就是说DEX在内存中始终不是一个完整的状态
  • 第四代壳:VMP和Dex2C

    • vmp壳的特征就是java函数的Native化
  • 未来:现在的VMP实际上是一个smali指令集的VMP,还不是一个真正意义上的VMP。可能在未来随着手机性能的进一步提升可能会出现在arm指令级别的VMP,甚至多指令集和异构的也会有。

VMP和dex2c保护的区别

  • VMP保护的函数注册地址是相同的,因为对于加VMP壳的函数来说它们都需要解释器去还原,如果每一个函数都有一个解释器的话,那SO会膨胀到无法接受的地步。所以它们必然会共用一个解释器,所以它们函数的注册地址是相同的

  • dex2c不同

  • 注册地址相同可以判断应该是VMP壳,通过动态调试去看函数的处理逻辑如果处理流程差别不大应该是VMP,反之如果区别很大每个函数的处理逻辑不同那很可能就是Dex2C的壳。

  • dex整体加壳是一个基础防护

    1. 文件加载:定位解密文件是关键;
    2. 内存加载:加载时机和内存起始地址是关键;
    3. 通用方案:dex打开和优化的流程以及产出的odex、dex2oat编译的流程和生成的oat文件等等
  • 函数抽取是中阶防护

    1. 类加载和函数执行前的流程解密;

    2. 函数执行中动态自解密(这种加密方式的效果更好一点);

      方案:关注被抽取的函数的执行流程是关键,定位被抽取的函数的恢复时机即可

  • VMP和dex2C是高级防护

    1. VMP:定位解释器是关键,找到映射关系便可恢复;

    2. dex2c:基础是编译原理,进行了从smali到C的等价语义转换,彻底还原难度巨大靠人工来做几乎是不可能的;

      通用解决方案:关注JNI相关的api调用时关键,也是分析VMP和dex2c保护的函数的逻辑的关键。

  • 标题: 一二三代壳和壳技术分类识别
  • 作者: xiaoeryu
  • 创建于 : 2023-08-26 21:00:35
  • 更新于 : 2023-09-04 00:35:15
  • 链接: https://github.com/xiaoeryu/2023/08/26/一二三代壳和壳技术分类识别/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论