文章目录
一、加壳技术识别
二、VMP 加壳示例
三、Dex2C 加壳示例
一、加壳技术识别
加壳技术识别的必要性 : 拿到 APK 文件后 , 如果想要分析其 DEX 文件 , 需要先 识别出该 APK 是使用的什么技术进行的加壳 , 如果该 APK 只是使用了整体保护 , 只需要将内存中的 DEX 文件 DUMP 下来即可 ; 如果该 APK 使用了 VMP 加壳 , 则需要逆向分析解释器 ;
只有识别出加壳的方式 , 才能有针对的进行脱壳 ;
上一篇博客 【Android 逆向】加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 ) 中介绍了几种常用的加壳技术 ;
每个加壳的应用必然使用 DEX 整体加固 , 然后在该基础上 , 使用 函数抽取 , VMP , Dex2C 中的一种加壳技术 , 也有可能使用 3 33 者中的多种加壳技术 , 进行混合加壳 ;
整体加固 就是对 DEX 文件进行 整体加密 , https://blog.csdn.net/shulianghan/category_10559800.html 专栏就实现了一个 DEX 整体加固的示例 ;
函数抽取特征 : 获取到加壳后的 DEX 文件 , 其函数体是无效的 ;
VMP / Dex2C 加壳特征 : 获取到 DEX 文件后 , Java 函数变为 Native 函数 ;
二、VMP 加壳示例
推荐一个 VMP 加壳程序 ADVMP ;
源码地址 : https://gitee.com/simon_haha/ADVMP
源码简介 : https://www.cnblogs.com/develop/p/4397397.html
VMP 的核心原理是 自定义 Dalvik 和 ART 解释器 , 解释器解释 Smali 指令流 ; 该解释器是 VMP 加壳的核心原理 ;
解释器可以使用 Java 实现 , 也可以使用 C 实现 , 使用 Java 实现更容易被破解 ; 因此 , 解释器一般使用 C 实现 , 为了保护解释器不被快速定位 , 一般会使用 OLLVM 技术对解释器进行保护 , 增加逆向的难度 ;
三、Dex2C 加壳示例
推荐一个 Dex2C 加壳程序 dcc ;
源码地址 : https://gitee.com/coolblood/dcc
Dex2C 加壳特征 : 获取到 DEX 文件后 , 其中被保护的函数 , 由 Java 函数变为了 Native 函数 ;
传统的编译原理 : 将代码进行词法 , 句法分析 , 生成二进制汇编代码 , 也就是机器码 ;
Dex2C 中, 将 Java 代码进行词法 , 句法分析 , 生成对应的 C / C++ 文件 , 然后交叉编译为 SO 动态库 ;