第一代壳 (Dex 整体加密壳)

一代壳,这是最早的Android加壳技术,其主要方法是将原始的.dex文件进行加密,然后在应用中添加一个新的类(通常称为"stub"或"loader")来在运行时解密和加载这个.dex文件。这种方法可以有效防止静态分析,但对动态分析的防护较弱。应用启动后,壳代码会在运行时将加密的 Dex 解密到内存中,再通过自定义 ClassLoader 或反射机制加载真实业务代码。

该方案可以有效阻断纯静态分析,但由于解密逻辑通常位于 Java 层或简单 Native 层,对 动态分析与内存 dump 的防护能力较弱

技术特征:

  • 对整个 Dex 文件进行加密
  • 加密后的 Payload 直接嵌入 APK 中(assets / raw / 自定义 section)
  • 运行时一次性解密并加载

常见形态:

  • APK 资源混淆 + Dex 加密 + 重签名工具

  • 安卓APK资源混淆加密重签名工具

  • ApkProtector

第二代壳

第二代 Android 壳在对抗逆向方面引入了更精细化的策略,不再简单地对整个 Dex 做整体加密,而是深入到 Dex 内部结构,对 Method 的 CodeItem 做手脚

典型做法是:

  • 将 Method 中的指令字节码抽离并加密,存放在外部区域
  • 原始 Dex 中的 Method 仅保留空实现或填充 nop 指令
  • 在 Method 被调用时,运行时动态解密真实指令并执行

解密和执行逻辑通常下沉到 Native 层(.so,并配合 JNI、反调试、代码混淆等手段,显著提高分析成本。

技术特征:

  • 操作 Dex 内部 CodeItem
  • Java 层看到的是“空方法”或异常逻辑
  • 真实指令在 Native 层按需解密
  • .so 文件本身高度混淆、反调试

Dex 结构示意:

  • 二代壳通常会对Dex中的CodeItem做手脚,以下是DEX的结构

  • 某固壳

  • dpt-shell

第三代壳

第三代 Android 壳通常被称为 VMP(Virtual Machine Protection)壳,其核心思想是:

将原始代码转换为自定义的“虚拟指令集”,并在壳内置的虚拟机中解释执行。

在这种模式下:

  • 真实业务逻辑不再以 Dalvik / ART 指令形式存在
  • 逆向分析者只能看到复杂的 VM 调度逻辑
  • 每家壳厂商的虚拟指令集和 VM 实现均不相同

第三代壳往往会 叠加前两代壳的能力,同时结合:

  • 控制流平坦化(CFF)
  • 字符串 / 常量虚拟化
  • 反调试、反 Hook、反模拟器

1. 自定义虚拟机壳

典型方案是将 Java / Native 代码转换为 VM 指令,由自研虚拟机执行。

  • jiagu packer

2. 自带虚拟机的跨平台应用

非Java,Kotlin开发的app,如Flutter(Dart), ReactNative(JS), Unity(C#),Xamarin(C#)都是自带虚拟机

严格来说,这类应用并非传统意义上的“加壳”,但从逆向分析视角看,其效果与 VMP 壳非常接近。