文章目录

  • 一、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}关联。* 其中一个列表是索引/资源路径&amp;mdash;通常提及* 作为“类路径”&amp;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 构造函数及后续调用 )相关推荐

  1. 【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | DexFile 构造函数及相关调用函数 | Android 源码中查找 native 函数 )

    文章目录 一.DexFile 构造函数 二.DexFile.openInMemoryDexFile 函数 三.Android 源码中查找 native 函数 一.DexFile 构造函数 上一篇博客 ...

  2. 【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | dex_file.cc 中创建 DexFile 实例对象的相关函数分析 )

    文章目录 前言 一.dalvik_system_DexFile.cc#CreateDexFile 函数分析 二.dex_file.cc#DexFile::Open 函数分析 三.dex_file.cc ...

  3. 【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | DexFile.java 对应的 dalvik_system_DexFile.cc 本地函数分析 )

    文章目录 一.DexFile 对应的 dalvik_system_DexFile.cc 中的 Native 方法 1.dalvik_system_DexFile.cc 的 DexFile_create ...

  4. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexPathList 构造函数分析 | makeDexElements 函数分析 )

    文章目录 前言 一.DexPathList 构造函数分析 二.DexPathList.makeDexElements 函数分析 三.Element 类分析 前言 上一篇博客 [Android 逆向]整 ...

  5. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexFile loadDexFile 函数 | 构造函数 | openDexFile 函数 )

    文章目录 前言 一.DexFile.loadDexFile 函数分析 二.DexFile 构造函数分析 三.DexFile.openDexFile 函数分析 前言 上一篇博客 [Android 逆向] ...

  6. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | 查找 DexFile 对应的C代码 | dalvik_system_DexFile.cpp 分析 )

    文章目录 前言 一.查找 DexFile 对应的 C++ 代码 1.根据 Native 文件命名惯例查找 C++ 代码 2.根据方法名查找 二.dalvik_system_DexFile.cpp 源码 ...

  7. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexPathList 中根据 File 加载 DexFile | loadDexFile 分析 )

    文章目录 前言 一.根据 File 加载 DexFile 二.DexPathList.loadDexFile 函数分析 前言 上一篇博客 [Android 逆向]整体加固脱壳 ( DexClassLo ...

  8. 【Android 逆向】整体加固脱壳 ( 脱壳点简介 | 修改系统源码进行脱壳 )

    文章目录 一.脱壳点简介 二.修改系统源码进行脱壳 一.脱壳点简介 在上一篇博客 [Android 逆向]整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 rewriteD ...

  9. 【Android 逆向】整体加固脱壳 ( DEX 优化流程分析 | dvmDexFileOpenPartial | dexFileParse | 脱壳点 | 获取 dex 文件在内存中的首地址 )

    文章目录 前言 一.DexPrepare.cpp 中 rewriteDex() 方法分析 二.DvmDex.cpp 中 dvmDexFileOpenPartial() 方法分析 ( 脱壳点 ) 三.D ...

最新文章

  1. 《Adobe Photoshop CS5中文版经典教程(全彩版)》—第2课2.8节使用仿制图章工具修复特定区域...
  2. AngularJS中实现无限级联动菜单(使用demo)
  3. Gartner:2019年七大AI科技趋势,百万行业将颠覆!
  4. 【转】激活物料分类帐
  5. ITK:从函数返回对象
  6. 六、张正友标定法小结
  7. 第一阶段:前端开发_Mysql——表与表之间的关系
  8. 【POJ - 3281】Dining(拆点建图,网络流最大流)
  9. 文献阅读6-Entity-Relation Extraction as Multi-turn Question Answering(实体关系联合抽取,层次标签依赖关系,multi-turn QA)
  10. 洛克人红色思考型机器人叫什么_如何让机器人“好好说话”?
  11. 拓端tecdat|R语言如何做马尔可夫转换模型markov switching model
  12. AttributeError: module 'ahocorasick' has no attribute 'Automaton'解决
  13. 人脸识别帧数太低的解决方法
  14. UDP网络通信的发包/收包过程/代理服务器的使用
  15. ubuntu中修改只读文件
  16. 关于WinNT和WinCE中使用NTP协议
  17. mac设置文件权限_如何在Mac上设置文件权限
  18. 计算机网络安全 第二章 物理安全
  19. Trainmaster One Hundred Twenty
  20. Vue + element从零打造一个H5页面可视化编辑器——pl-drag-template

热门文章

  1. C语言成长学习题(十六)
  2. 如何理解delegate (委托)设计模式
  3. 关于架构的一点思考(一)
  4. 上海电信计划2015年用户带宽提高12.5倍
  5. 红楼梦 --- 花开在眼前
  6. Winpcap 中sockaddr_storage问题收藏
  7. 黑马在线教育项目---15-16、datatables插件
  8. Debian 安装docker
  9. node中npm安装模块的网络问题
  10. Request库的安装与使用