文章目录

  • 前言
  • 一、DexFile.loadDexFile 函数分析
  • 二、DexFile 构造函数分析
  • 三、DexFile.openDexFile 函数分析

前言


上一篇博客 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexPathList 中根据 File 加载 DexFile | loadDexFile 分析 ) 中 , 介绍了 DexPathList 中通过 File 生成 DexFile 的源码 , 在 makeDexElements 中调用了 loadDexFile 方法 , 在 loadDexFile 又有调用了 DexFile.loadDexFile 函数 , 用于生成 DexFile 实例对象 ;

本博客中介绍 DexFile 相关源码 ;

一、DexFile.loadDexFile 函数分析


DexPathList.loadDexFile 方法中 , 调用 DexFile 构造函数创建了 DexFile 实例对象 ;

下面的代码中 , 列出了 loadDexFile 方法 ;

传入的参数分别是 Dex 文件的路径 , 优化后的 Dex 文件路径 , 标志位 , 一般是 0 ;

/*** 操纵DEX文件。这门课在原则上与我们的课相似* {@link java.util.zip.ZipFile}。它主要由类装入器使用。* <p>* 注意,我们不直接打开并读取这里的DEX文件。它们是内存映射的* 由VM只读。*/
public final class DexFile {/*** 打开一个DEX文件,指定优化的DEX所在的文件* 数据应该是书面的。如果优化表单存在并出现* 要成为最新版本,将使用它;如果没有,VM将尝试* 再生它。** 这是供希望下载的应用程序使用的* 并在通常的应用程序安装之外执行DEX文件* 机制。此函数不应由* 应用;相反,使用类加载器,例如* 达尔维克。系统DexClassLoader。** @param sourcePathName* 带有“classes.dex”的Jar或APK文件。(可将此扩展为包括* 未来的“原始索引”。)* @param outputPathName* 保存优化形式的DEX数据的文件。* @param标志* 启用可选功能。(当前未定义任何内容。)* @返回* 新的或以前打开的文件。* @抛出异常* 如果无法打开源文件或输出文件。*/static public DexFile loadDex(String sourcePathName, String outputPathName,int flags) throws IOException {/** TODO:我们可能希望缓存以前打开的DexFile对象。* 缓存将与close()同步。这会有帮助的* 我们避免在应用程序运行时多次映射同一个索引* 决定多次打开它。实际上,这可能不是* 这是一个真正的问题。*/return new DexFile(sourcePathName, outputPathName, flags);}
}

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

二、DexFile 构造函数分析


loadDexFile 方法 , 调用到 DexFile 构造方法 ;

DexFile 构造方法中 , 调用了 mCookie = openDexFile(sourceName, outputName, flags); 方法打开 Dex 文件 ;

/*** 操纵DEX文件。这门课在原则上与我们的课相似* {@link java.util.zip.ZipFile}。它主要由类装入器使用。* <p>* 注意,我们不直接打开并读取这里的DEX文件。它们是内存映射的* 由VM只读。*/
public final class DexFile {/*** 使用指定文件从给定文件名打开DEX文件* 保存优化的数据。** @param sourceName* 带有“classes.dex”的Jar或APK文件。* @param outputName* 保存优化形式的DEX数据的文件。* @param标志* 启用可选功能。*/private DexFile(String sourceName, String outputName, int flags) throws IOException {if (outputName != null) {try {String parent = new File(outputName).getParent();if (Libcore.os.getuid() != Libcore.os.stat(parent).st_uid) {throw new IllegalArgumentException("Optimized data directory " + parent+ " is not owned by the current user. Shared storage cannot protect"+ " your application from code injection attacks.");}} catch (ErrnoException ignored) {// assume we'll fail with a more contextual error later}}mCookie = openDexFile(sourceName, outputName, flags);mFileName = sourceName;guard.open("close");//System.out.println("DEX FILE cookie is " + mCookie);}
}

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

三、DexFile.openDexFile 函数分析


在 DexFile 的 openDexFile 函数中 , 调用了 native 函数 openDexFileNative , 打开 Dex 文件 , 该函数是使用 C 代码生成的 ;

/*** 操纵DEX文件。这门课在原则上与我们的课相似* {@link java.util.zip.ZipFile}。它主要由类装入器使用。* <p>* 注意,我们不直接打开并读取这里的DEX文件。它们是内存映射的* 由VM只读。*/
public final class DexFile {/** 打开一个DEX文件。返回的值是一个神奇的VM cookie。在…上* 失败时,将引发IOException。*/private static int openDexFile(String sourceName, String outputName,int flags) throws IOException {return openDexFileNative(new File(sourceName).getCanonicalPath(),(outputName == null) ? null : new File(outputName).getCanonicalPath(),flags);}native private static int openDexFileNative(String sourceName, String outputName,int flags) throws IOException;
}

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

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

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

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

  2. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | RawDexFile.cpp 分析 | dvmRawDexFileOpen函数读取 DEX 文件 )

    文章目录 前言 一.RawDexFile.cpp 中 dvmRawDexFileOpen() 方法分析 前言 上一篇博客 [Android 逆向]整体加固脱壳 ( DexClassLoader 加载 ...

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

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

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

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

  5. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | 类加载器构造函数分析 | DexPathList 引入 )

    文章目录 一.DexClassLoader 类加载器构造函数分析 二.DexPathList 引入 一.DexClassLoader 类加载器构造函数分析 DexClassLoader 是加载 dex ...

  6. 【Android 逆向】ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )

    文章目录 一.DexClassLoader 源码分析 二.参考 Dalvik 下的 DexClassLoader 类加载流程 一.DexClassLoader 源码分析 ART 虚拟机下的 DexCl ...

  7. 【Android 逆向】ART 脱壳 ( DexClassLoader 脱壳 | oat_file_assistant.cc 中涉及的 oat 文件生成流程 )

    文章目录 前言 一.dalvik_system_DexFile.cc#DexFile_openDexFileNative 函数分析 二.oat_file_manager.cc#OpenDexFiles ...

  8. 【Android 逆向】ART 脱壳 ( DexClassLoader 脱壳 | exec_utils.cc 中执行 Dex 编译为 Oat 文件的 Exec 和 ExecAndReturnC函数 )

    文章目录 前言 一.exec_utils.cc#Exec 函数分析 二.exec_utils.cc#ExecAndReturnCode 函数分析 前言 在上一篇博客 [Android 逆向]ART 脱 ...

  9. APK加壳【3】通用内存加载dex方案分析

    来源 Andorid APK反逆向解决方案:梆梆加固原理探寻 CSDN 作者Jack_Jia 该篇博文中的:"3. 如何使DexClassLoader加载加密的dex文件? "这部 ...

最新文章

  1. 如何解决VS2015编译C4996错误
  2. 当当的羊毛又该剪了!官方活动基础上的额外优惠券,速领!
  3. JAVA File方法各类文件复制操作
  4. 中国华南:狼性创业者的天堂
  5. 训练网络指定层pytorch实现方法
  6. word2vec原理_word2vec论文阅读笔记
  7. 程序功能:延时(定时)
  8. 弹出新窗体 winform 1615018696
  9. 深度linux不能联网,Deepin Linux 无法上网
  10. 【thm】windows内网提权之Windows PrivEsc Arena
  11. 基于STM32的微信视频电话机,让家里的老人也能轻松使用微信视频电话
  12. 全球第二大硬盘磁头专业制造商成都建基地
  13. golang六个常用的web 框架
  14. 软件版本中的Alpha,Beta,RC,Trial是什么意思?
  15. 笔记-5:mysql数据更新
  16. javaOOP -- 笔记
  17. 科幻电影里的机器人假肢已经照进现实
  18. 价格行为交易策略:锤子十字线,Fakey,内部日烛线
  19. 【赵强老师】什么是PL/SQL?
  20. Franka Emika Panda机械臂规划路径时,rviz中手爪显示碰撞

热门文章

  1. passwd 修改用户密码
  2. android技术下载
  3. hibernate 初学 第一个例子
  4. python脚本监控网站状态 - 赵海华_运维之路 - 51CTO技术博客
  5. 做业务与技术之间的桥梁
  6. linux之vsftpd虚拟用户搭建
  7. 心得体悟帖---12、志向还是太短浅,目光也是
  8. SectionList的使用
  9. 初学者浅谈我对领域驱动设计(DDD)的理解
  10. Linux 运维工作中的经典应用ansible(批量管理)Docker容器技术(环境的快速搭建)...