Android 逆向加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 逆向加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )相关的知识,希望对你有一定的参考价值。





一、动态加载



动态加载 : 调用 Java 类时 , 使用到的时候 , 才从 DEX 字节码文件中加载对应的字节码类 ;


热修复 , DEX 加壳 , 插件化 , 都必须使用动态加载技术 ;


动态加载 的 Java 类只能完成一般的函数调用 , 如果加载的是一个 Activity 组件类 , 加载的类不具有组件生命周期的特性 , 不能当做正常的组件使用 ;

如果要正常使用 动态加载 的组件类 , 则需要对类加载器修正 , 有 2 2 2 种修正方法 ;





二、第一代加壳技术 ( DEX 整体加固 )



第一代加壳技术 :

  • DEX 字节码文件整体加密
  • 使用自定义 DexClassLoader 加载 DEX 文件

第一代壳的特征 : 在内存中 , DEX 文件是整体的连续的内存块 , 如果找到了 DEX 文件的起始地址 , 可以很容易将整个 DEX 文件 dump 下来 ;

DEX 脱壳加载方案 :

  • 文件加载 : 通过监控文件访问记录 , 也可以找到 DEX 文件 ;
  • 内存加载 : 内存中的 DEX 文件是完整的 , 也可以从内存中加载 DEX 文件 ;

保护粒度是 DEX 整体文件 ;





三、第二代加壳技术 ( 函数抽取 )



第二代加壳技术DEX 文件整体进行了保护 , 将其中的 关键代码抽取到外部 , DEX 加载到内存中后 , 不是完整的 DEX 文件 , 即使将整个 DEX 文件 DUMP 下来之后 , 其中的一些被抽取出来的关键代码无法看到 , 也就是 DEX 文件中的关键类或方法是空的 ;

第二代壳的特征是 内存中的 DEX 数据不是连续的 ;

DexHunter 工具 可以遍历内存中所有类信息 , 将 DEX 完整的拼接出来 , 得到一个完整的 DEX 类 ;


保护的粒度由 DEX 细化为每个函数 ; 破解者可以将 DEX 文件拿到 , 但是其中的关键函数是空的 ;





四、第三代加壳技术 ( Java 函数 -> Native 函数 )



第三代加壳技术 : 将 Java 函数转为 Native 函数 ;

  • VMP 加壳
  • Dex2C / Java2C

该类型的加壳保护效果是最强的 , 多数加固厂商的此类加壳都是需要付费的 ;





五、so 动态库加壳



so 动态库加壳 :

  • 基于 init , init_array , JNI_Onload 函数进行加壳 ;
  • 基于 自定义 linker 进行加壳 ;

以上是关于Android 逆向加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向加壳的 Android 应用启动流程 | 使用反射替换 LoadedApk 中的类加载器流程

Android 逆向加壳的 Android 应用启动流程 | 使用反射替换 LoadedApk 中的类加载器流程

Android 逆向Dalvik 函数抽取加壳 ( Dalvik 下的函数指令抽取与恢复 | dex 函数指令恢复时机点 | 类加载流程 : 加载链接初始化 )

Android 逆向加壳技术识别 ( VMP 加壳示例 | Dex2C 加壳示例 )

Android 逆向脱壳解决方案 ( DEX 整体加壳 | 函数抽取加壳 | VMP 加壳 | Dex2C 加壳 | Android 应用加固防护级别 )

Android 逆向Dalvik 函数抽取加壳 ( 类加载流程分析 | DexPathList#findClass 函数分析 | DexFile#loadClassBinaryName 函数 )(代码