文章目录
一、加固厂商在 ART 下使用的两种类加载器 ( InMemoryDexClassLoader | DexClassLoader )
二、InMemoryDexClassLoader 源码分析
一、加固厂商在 ART 下使用的两种类加载器 ( InMemoryDexClassLoader | DexClassLoader )
脱壳就是要在加固厂商使用类加载器加载 DEX 文件时 , 从加载过程中 , 从内存中获取 DEX 文件 ;
在 Dalvik 虚拟机的 Android 系统 中 , 即 Android 4.4 4.44.4 及以下的系统 , 加固厂商 使用 DexClassLoader 加载 DEX 字节码文件 ;
在 ART 虚拟机的 Android 系统 中 , 即 Android 5.0 5.05.0 及以上的系统 , 加固厂商使用 InMemoryDexClassLoader 或者 DexClassLoader 加载 DEX 字节码文件 ;
其中 InMemoryDexClassLoader 是 Android 8.0 8.08.0 引入的类加载器 ;
由于要分析 ART 虚拟机下的 InMemoryDexClassLoader 和 DexClassLoader 类加载器 , 这里分析 Android 8.0 8.08.0 源码 ;
二、InMemoryDexClassLoader 源码分析
在 InMemoryDexClassLoader 类加载器源码中 , 只定义了构造函数 , 没有定义实际业务逻辑 , 与 DexClassLoader 类似 ;
第 2 22 个构造函数调用了第 1 11 个构造函数 , 第一个构造函数中 , 调用了 BaseDexClassLoader 的构造函数 ,
super(dexBuffers, parent);
InMemoryDexClassLoader 源码 :
package dalvik.system; import java.nio.ByteBuffer; /** * 一个{@link ClassLoader}实现,从 * 包含DEX文件的缓冲区。这可用于执行以下代码: * 尚未写入本地文件系统。 */ public final class InMemoryDexClassLoader extends BaseDexClassLoader { /** * 使用给定的DEX缓冲区创建内存中的DEX类装入器。 * * @param dexBuffers 包含之间的DEX文件的缓冲区数组 * <tt>缓冲区。位置()</tt>和<tt>缓冲区。限制()</tt>。 * @param parent 委托的父类加载器。 * @隐藏 */ public InMemoryDexClassLoader(ByteBuffer[] dexBuffers, ClassLoader parent) { super(dexBuffers, parent); } /** * 创建一个新的内存中DEX类装入器。 * * @param dexBuffer缓冲区,包含之间的DEX文件内容 * <tt>缓冲区。位置()</tt>和<tt>缓冲区。限制()</tt>。 * @param parent委托的父类加载器。 */ public InMemoryDexClassLoader(ByteBuffer dexBuffer, ClassLoader parent) { this(new ByteBuffer[] { dexBuffer }, parent); } }
源码路径 : /libcore/dalvik/src/main/java/dalvik/system/InMemoryDexClassLoader.java