【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | BaseDexClassLoader 构造函数 | DexPathList 构造函数及后续调用 )
文章目錄
- 一、BaseDexClassLoader 構造函數
- 二、DexPathList 構造函數
- 三、DexPathList.makeInMemoryDexElements 函數
一、BaseDexClassLoader 構造函數
在上一篇博客 【Android 逆向】ART 脫殼 ( InMemoryDexClassLoader 脫殼 | 加固廠商在 ART 下使用的兩種類加載器 | InMemoryDexClassLoader 源碼 ) 分析到 , 在 InMemoryDexClassLoader 類加載器中 , 調用了父類 BaseDexClassLoader 的 222 個參數的構造函數 ;
BaseDexClassLoader 構造函數如下 , 在該構造函數中創建了 DexPathList 對象 , 并賦值給了 pathList 成員 ;
BaseDexClassLoader 構造函數源碼 :
/*** 用于各種基于dex的數據庫之間的通用功能的基類* {@link ClassLoader}實現。*/ public class BaseDexClassLoader extends ClassLoader {private final DexPathList pathList;/*** 構造一個實例。* * dexFile 必須是完整dexFile的內存表示形式。* * @param dexFiles 包含類的內存中dex文件數組。* @param parent 父類加載器* * @隱藏*/public BaseDexClassLoader(ByteBuffer[] dexFiles, ClassLoader parent) {// TODO 我們應該支持給它一個庫搜索路徑。super(parent);// ★ 核心跳轉this.pathList = new DexPathList(this, dexFiles);} }源碼路徑 : /libcore/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java
二、DexPathList 構造函數
在 DexPathList 構造函數中 , 調用了 makeInMemoryDexElements 方法創建 DEX 相關的 Element 元素 ;
/*** 一對條目列表,與{@code ClassLoader}關聯。* 其中一個列表是索引/資源路徑&mdash;通常提及* 作為“類路徑”&mdash;列表和其他名稱目錄* 包含本機代碼庫。類路徑條目可以是以下任一項:* 一個{@code.jar}或{@code.zip}文件,其中包含一個可選的* 頂級{@code classes.dex}文件以及任意資源,* 或者是一個普通的{@code.dex}文件(不可能與* 資源)。* * <p>此類還包含使用這些列表進行查找的方法* 課程和資源</p>*/ /*package*/ final class DexPathList {/*** 構造一個實例。* * @param definingContext 任何尚未解析的* 應該定義類* * @param dexFiles 包含我們應該從中加載類的dex文件的字節緩沖區。*/public DexPathList(ClassLoader definingContext, ByteBuffer[] dexFiles) {if (definingContext == null) {throw new NullPointerException("definingContext == null");}if (dexFiles == null) {throw new NullPointerException("dexFiles == null");}if (Arrays.stream(dexFiles).anyMatch(v -> v == null)) {throw new NullPointerException("dexFiles contains a null Buffer!");}this.definingContext = definingContext;// TODO It might be useful to let in-memory dex-paths have native libraries.this.nativeLibraryDirectories = Collections.emptyList();this.systemNativeLibraryDirectories =splitPaths(System.getProperty("java.library.path"), true);this.nativeLibraryPathElements = makePathElements(this.systemNativeLibraryDirectories);ArrayList<IOException> suppressedExceptions = new ArrayList<IOException>();// ★ 核心跳轉this.dexElements = makeInMemoryDexElements(dexFiles, suppressedExceptions);if (suppressedExceptions.size() > 0) {this.dexElementsSuppressedExceptions =suppressedExceptions.toArray(new IOException[suppressedExceptions.size()]);} else {dexElementsSuppressedExceptions = null;}} }源碼路徑 : /libcore/dalvik/src/main/java/dalvik/system/DexPathList.java
三、DexPathList.makeInMemoryDexElements 函數
在 makeInMemoryDexElements 方法中 , 根據內存中的字節數組數據 , 獲取 DexFile , 將內存數據傳入了 DexFile 的構造函數 ;
注意 : 傳入 DexFile 構造函數的數據是 ByteBuffer buf 類型數據 ;
// ★ 核心跳轉DexFile dex = new DexFile(buf);DexPathList.makeInMemoryDexElements 函數源碼 :
/*package*/ final class DexPathList {private static Element[] makeInMemoryDexElements(ByteBuffer[] dexFiles,List<IOException> suppressedExceptions) {Element[] elements = new Element[dexFiles.length];int elementPos = 0;for (ByteBuffer buf : dexFiles) {try {// ★ 核心跳轉DexFile dex = new DexFile(buf);elements[elementPos++] = new Element(dex);} catch (IOException suppressed) {System.logE("Unable to load dex file: " + buf, suppressed);suppressedExceptions.add(suppressed);}}if (elementPos != elements.length) {elements = Arrays.copyOf(elements, elementPos);}return elements;} }總結
以上是生活随笔為你收集整理的【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | BaseDexClassLoader 构造函数 | DexPathList 构造函数及后续调用 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 逆向】ART 脱壳 (
- 下一篇: 【Android 逆向】ART 脱壳 (