文章目录

  • 前言
  • 一、DexPathList.java#findClass 类加载函数源码分析
  • 二、DexFile.java#loadClassBinaryName 函数源码分析

前言

上一篇博客 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | ClassLoader#loadClass 函数分析 | BaseDexClassLoader#findClass 分析 ) 分析到 , 类加载流程中 , 在 BaseDexClassLoader 中的 findClass 方法中 , 主要调用 DexPathList pathList 成员的 findClass 函数查找类 ;

一、DexPathList.java#findClass 类加载函数源码分析


在 DexPathList.java#findClass 方法中 ,

首先 , 遍历 Element[] dexElements 成员 , 每个 Element 元素都封装了一个 DexFile , 即 dex 文件 ;

DexFile dex = element.dexFile;

然后尝试从 dex 文件中加载 Java 类 ;

Class clazz = dex.loadClassBinaryName(name, definingContext, suppressed);

DexPathList.java#findClass 类加载函数源码 :

/*** 一对条目列表,与{@code ClassLoader}关联。* 其中一个列表是索引/资源路径&amp;mdash;通常提及* 作为“类路径”&amp;mdash;列表和其他名称目录* 包含本机代码库。类路径条目可以是以下任一项:* 一个{@code.jar}或{@code.zip}文件,其中包含一个可选的* 顶级{@code classes.dex}文件以及任意资源,* 或者是一个普通的{@code.dex}文件(不可能与* 资源)。* * <p>此类还包含使用这些列表进行查找的方法* 课程和资源</p>*/
/*package*/ final class DexPathList {/*** 索引/资源(类路径)元素的列表。* 应该称为pathElements,但Facebook应用程序使用反射* 要修改“dexElements”(http://b/7726934).*/private final Element[] dexElements;/*** 在所指向的某个dex文件中查找命名类* 这个例子。这将在最早的列表中找到一个* 路径元素。如果已找到类但尚未找到* 已定义,则此方法将在定义中定义它* 构造此实例时使用的上下文。* * @param要查找的类的名称* @param查找类时遇到抑制异常* @返回已命名的类或{@code null}(如果该类不是空的)* 在任何dex文件中找到*/public Class findClass(String name, List<Throwable> suppressed) {// 对 DexPathList 中的 Element 数组进行遍历 for (Element element : dexElements) {// 每个 Element 元素都封装了一个 DexFile , 即 dex 文件DexFile dex = element.dexFile;if (dex != null) {// 尝试从 dex 文件中加载 Java 类 // ★ 核心跳转Class clazz = dex.loadClassBinaryName(name, definingContext, suppressed);if (clazz != null) {return clazz;}}}if (dexElementsSuppressedExceptions != null) {suppressed.addAll(Arrays.asList(dexElementsSuppressedExceptions));}return null;}
}

源码路径 : /libcore/dalvik/src/main/java/dalvik/system/DexPathList.java#findClass

二、DexFile.java#loadClassBinaryName 函数源码分析


在 DexFile.java#loadClassBinaryName 函数中 , 调用了 defineClass 方法 , 在 defineClass 方法中 , 调用了 native 函数 defineClassNative ;

在 DexFile.java 的 loadClass 函数中 , 也会调用 DexFile.java#loadClassBinaryName 函数 , 进行类的加载 ;

DexFile.java#loadClassBinaryName 函数源码 :

/*** 操纵DEX文件。这门课在原则上与我们的课相似* {@link java.util.zip.ZipFile}。它主要由类装入器使用。* <p>* 注意,我们不直接打开并读取这里的DEX文件。它们是内存映射的* 由VM只读。*/
public final class DexFile {/*** 加载一个类。成功返回类或{@code null}引用* 一旦失败。* <p>* 如果不是从类加载器调用此函数,则很可能不是* 去做你想做的事。改用{@link Class#forName(String)}。* <p>* 如果类* 找不到,因为在每个* 在我们查看的第一个DEX文件中找不到类的时间。* * @param name* 类名,看起来应该像“java/lang/String”* * @param装载机* 尝试加载类的类加载器(在大多数情况下* 方法的调用方* * @返回表示类的{@link Class}对象,或{@code null}* 如果无法加载该类*/public Class loadClass(String name, ClassLoader loader) {String slashName = name.replace('.', '/');return loadClassBinaryName(slashName, loader, null);}/*** 请参阅{@link#loadClass(String,ClassLoader)}。* * 这需要一个“二进制”类名来更好地匹配类加载器语义。* * @隐藏*/public Class loadClassBinaryName(String name, ClassLoader loader, List<Throwable> suppressed) {return defineClass(name, loader, mCookie, suppressed);}private static Class defineClass(String name, ClassLoader loader, int cookie,List<Throwable> suppressed) {Class result = null;try {result = defineClassNative(name, loader, cookie);} catch (NoClassDefFoundError e) {if (suppressed != null) {suppressed.add(e);}} catch (ClassNotFoundException e) {if (suppressed != null) {suppressed.add(e);}}return result;}// ★ 核心跳转private static native Class defineClassNative(String name, ClassLoader loader, int cookie)throws ClassNotFoundException, NoClassDefFoundError;
}

源码路径 : /libcore/dalvik/src/main/java/dalvik/system/DexFile.java#loadClassBinaryName

【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | DexPathList#findClass 函数分析 | DexFile#loadClassBinaryName 函数 )相关推荐

  1. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | Class.cpp#findClassNoInit 函数 | DexFile.cpp#dexFindClass 函数分析 )

    文章目录 前言 一.Class.cpp#dvmDefineClass 函数分析 二.Class.cpp#findClassNoInit 函数分析 三.DexFile.cpp#dexFindClass ...

  2. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | native 函数查询 | dalvik_system_DexFile.cpp#defineClassNative 函数 )

    文章目录 前言 一.查询 defineClassNative 函数 二.dalvik_system_DexFile.cpp#Dalvik_dalvik_system_DexFile_defineCla ...

  3. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | ClassLoader#loadClass 函数分析 | BaseDexClassLoader#findClass 分析 )

    文章目录 一.ClassLoader.java#loadClass 类加载函数源码分析 二.BaseDexClassLoader.java#findClass 函数源码分析 一.ClassLoader ...

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

    文章目录 前言 一.Dalvik 下的函数指令抽取与恢复 二.dex 函数指令恢复时机点 1.dex 函数指令恢复 2.Android 源码中搜索 dexFindClass 函数 3.类加载流程 : ...

  5. 【Android 逆向】整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmContinueOptimizati() 函数分析 )

    文章目录 前言 一.DexPrepare.cpp 中 dvmContinueOptimizati() 方法分析 前言 上一篇博客 [Android 逆向]整体加固脱壳 ( DEX 优化流程分析 | D ...

  6. Android App Bundle混淆加密加壳加固保护的解决方案(过Google App上架审核)

    Android AAB简介和AAB包格式 AAB即Android App Bundle,是Google官方发布的一种新的App包格式,可以有效缩减App大小,提升用户安装和更新App的体验.在Goog ...

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

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

  8. Android so文件保护——使用upx加壳

    最近有人问我关于UPX加壳的问题,关于UPX如何加壳以及脱壳,网上说的很清楚了,这里不细说了,附件是很早之前我配置UPX加壳环境的一些资料和配置包以及成功的实例,有需要的小伙伴可以下下来玩. 附件:点 ...

  9. 【Android 逆向】整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )

    文章目录 前言 一.DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 二./bin/dexopt 源码分析 前言 上一篇博客 [Android 逆向]整体加固脱壳 ...

最新文章

  1. Sass函数:Sass Maps的函数-map-has-key($map,$key)
  2. 面试题6:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList
  3. 对接FusionInsight HD 6.5.1
  4. pyqt5使用本地摄像头
  5. 从零开始学wordpress 之四
  6. 计算机设备资产台帐,小学固定资产台账表
  7. 杂项:grunt-tmod
  8. 地下城与勇士(DNF)安图恩副本(黑雾之源、震颤的大地、舰炮防御战、擎天之柱、能量阻截战、黑色火山、安徒恩的心脏)(童年的回忆)
  9. 智能音箱音效哪个好_智能音箱这么多,哪个智能音箱,才是现在最好的
  10. vscode 编写html 浏览器显示 空白 白屏
  11. origin画图工具使用,去除注释的方框和图例的红色线框,x轴标注旋转
  12. Excel 公式结果为0时不显示
  13. 三星D828刷机教程,完全经典版(附图)
  14. 计算机信息检索 服务方式,计算机信息检索.ppt
  15. 【Mac 环境配置】-- 配置JAVA环境
  16. ajax中Uncaught (in promise) TypeError: Failed to execute ‘setRequestHeader‘ on ‘XMLHttpRequest‘: Stri
  17. 【】每日360题,2019.11.03日21点财会类考试习题答案
  18. 数字信号处理-3-函数的正交
  19. matlab新手困惑
  20. iOS开发Swift语法回顾之基本的语法与数据类型

热门文章

  1. Automation Test in Maya Plugin Development
  2. Java数据库查询,获得离线数据集的解决办法。
  3. ZJU PAT 1027 Colors in Mars
  4. 我看team work
  5. JavaEE高级-MyBatis学习笔记
  6. ansible role中常代码块
  7. Docker 新网络 overlay 网络
  8. 【作业四】软件案例分析之必应词典
  9. Linux Java连接MySQL数据库
  10. flask基础(上篇)