Dex文件加载以及类加载流程

2023-11-18

Dex文件加载以及类加载流程
安卓源码连接:http://androidxref.com/4.4.4_r1
app在启动的过程中创建了PathClassLoader加载dex文件,那么我们跟进PathClassLoader:
/libcore/dalvik/src/main/java/dalvik/system/PathClassLoader.java:
在这里插入图片描述
构造函数直接调用了父类的方法,我们查看BaseDexClassLoader的方法:构造函数里返回了一个DexPathList的实例
在这里插入图片描述
跟进DexPathList:
在这里插入图片描述
在这里插入图片描述
构造函数里面有个重要的 makeDexElements方法返回了一个Element数组,而Element类主要是用来保存dex或资源文件路径的类:
在这里插入图片描述
makeDexElements遍历所有资源文件,并调用loadDexFile来加载dex文件,它最终返回一个DexFile结构对象。接着分析loadDexFile函数:
在这里插入图片描述
这里出现了两种情况,1是没有设置保存优化dex目录的时候,则直接创建一个DexFile对象,2是直接调用DexFile类的loadDex方法完成家在解析dex工作:
第一种情况:
在这里插入图片描述
第二种情况:
在这里插入图片描述
都调用了openDexFile函数返回了mcookie这个int值:openDexFile值最终调用了openDexFileNative这个方法
在这里插入图片描述
去native源码查看这个函数的定义:
在这里插入图片描述
重要的有两个函数,1是dvmRawDexFikeOpen,2是dvmJarFileOpen这两个,顾名思义,1是加载Dex,2是加载Jar。
跟进dvmRawDexFikeOpen:
在这里插入图片描述
首先跟进dex文件的优化,dvmOptimizeDexFile:
在这里插入图片描述
新开了一个子进程调用opt进行优化,那么我们去看一下opt程序是怎样进行优化的-/dalvik/dexopt/OptMain.cpp:
在这里插入图片描述
调用FromDex方法进行优化,Fromdex方法里主要调用了两个方法:
在这里插入图片描述
这里我们关注dvmContinueOptimization这个进行实际优化工作的函数:
先放一张图
在这里插入图片描述
代码层面:
在这里插入图片描述
看到了熟悉的早期加固的脱壳关键函数dvmDexFileOpenPartial函数:第一个参数dex地址、第二个参数dex大小,跟进这个函数,最终会调用DexFileParse来解析Dex文件,这也是一个脱壳点:
在这里插入图片描述
这里就看完了优化的过程,紧接着回到dvmRawDexFikeOpen,看完了优化来看解析:
在这里插入图片描述
在这里插入图片描述
跟进FileParse函数:
在这里插入图片描述

FileParse函数执行完成后,Dex文件的解析也告一段落,接下来就该分析类加载了,类加载机制接下来的工作就是根据虚拟机的运行需要,从Dex文件中加载指定类,并将其装入虚拟机的运行时环境中。类加载的目的其实就是为所需的类生成一个ClassObject的实例,然后需要的时候调用这个实例对象。
回到最开始的BaseClassLoader:获得DexPathList的实例化对象后,调用DexPathList类的findclass方法,由findclass方法(往里面深入findclass方法最终调用了findClassNoInit方法)来在dalvik中得到该类的ClasssObject。
在这里插入图片描述
在这里插入图片描述
之前element数组的操作如下:可见里面存放了dex文件和其他资源文件。
在这里插入图片描述
findclass又调用了DexFile的loadclassBinaryName方法:
在这里插入图片描述
loadclassBinaryName又调用了defineClass方法:
在这里插入图片描述
defineClass又调用了defineClassNative方法:
在这里插入图片描述
defineClassNative方法里又调用了dvmDefineClass方法:
在这里插入图片描述
dvmDefineClass方法又调用了findClassNoInit方法:
在这里插入图片描述
findClassNoInit方法首先调用dvmLookupClass判断本类是否已经被加载,若已加载,直接使用,结束函数。

dvmLookupClass函数如下,作用是调用dvmHashTableLookup在哈希表中判断本类是否已经被加载,若找到返回类在dex文件地址,否则返回null:
在这里插入图片描述
回到findClassNoInit方法中,如果没有找到:
在这里插入图片描述
若是用户类,则调用dexfindclass得到DexClassDef类的实例化对象,然后利用这个对象调用loadClassFromDex得到该类的ClassObject结构体。之后将加载了的这个类的ClassObject对象添加到全局变量gDvm的loadedClasses成员中,该成员主要是保存加载到内存中的类对象。当Dalvik要运行某一个类方法的时候,是通过运行在内存中的ClassObject对象中的资源去执行,最后调用dvmInterpret方法初始化解释器并执行字节码指令。
在这里插入图片描述
下面我们来看下在dalvik在加载过程中使用到的数据结构:
 Method: java方法在dalvik中的结构体,是dalvik的执行单位;拥有指向字节码指令的指针insns,是ClassObject结构体中的成员之一
 ClassObject: java类在dalvik中的结构体,包含多个Method结构;拥有指向DvmDex的指针;拥有指向加载该类的ClassLoader指针
 DvmDex: 拥有指向dexFile的指针
 dexFile: dex在dalvik的描述结构

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dex文件加载以及类加载流程 的相关文章

  • Linux逆向 - Mirai-上

    Mirai Mirai 变种 资料 源码 Mirai源码 xd0ol1 Mirai 源码分析 https paper seebug org 142 绿盟 MIRAI源码分析报告 http blog nsfocus net mirai sou
  • Js逆向练习制造Token与Id

    前言 闲来无聊 把 Pyhton3网络爬虫开发实战 第二版 看完了Js逆向部分 最后的实战部分感觉挺有挑战性的 正好崔佬也有详细的教程 平时的逆向都是野路子 刚好快回学校了有时间 那为什么不自己动手下呢 下面记录下过程 只会更加详细 观察页
  • 记一次在Tweak中引入Swift framework的过程

    最近想在一个插件里打通App和web端 实现通过web控制App 方案是选用socket io作为服务端和web前端 iOS端socket io是一个纯swift实现的库 目前Theos对swift的支持还不是很完善 但是可以完成一般的工作
  • 被魔改md5加密坑了?某网站魔改md5加密逆向还原 (多种语言还原)

    大家好 我是TheWeiJun 最近由于工作太忙好久没有更新了 静下心来 突然很想念各位读者朋友 所以晚上抽空更新一篇 今天分享一篇关于魔改md5实现的加密算法逆向分析 本文将用多种语言还原加密算法 解决不同语言还原加密算法的难题 希望各位
  • 天翼云登录破解js逆向

    网站 https m ctyun cn wap main auth login redirect 2Fmy 账号 234555551 qq com 密码 fffffffffff 666 抓包分析一下 密码直接加在url后面进行请求 打个xh
  • 静态逆向简单的ELF

    看到csdn中一篇文章 http blog csdn net fisher jiang article details 6783922 该文章使用动态调试进行破解找到密码 由于自己对linux不熟悉需要学习段时间 就使用ida静态反汇编进行
  • ARM处理器寻址方式

    往期推荐 ARM指令集 ARM汇编语言程序结构 Android与ARM处理器 反射调用Java层方法 寻址的概述 寻址是指寻找寄存器里存放的数据或者是地址里存放的数据并加以使用 寻址有以下八种方式 1 立即寻址 2 寄存器寻址 3 寄存器移
  • PE 文件结构解析

    PE 文件格式由一个线性的数据流组成 由一个DOS 头开始 接着是一个PE 文件头 这些之后是所偶的区块部 包含重分配信息 符号表信息以及字符串表数据 PE 文件结构 如下图所示 文件被划分为四大部分 包含 DOS 部分 PE 文件头 节表
  • 极验4参数分析

    目标链接 aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v 接口分析 开发者人员工具进行抓包 刷新页面 抓到了一个名为 load captcha id xxx 的包 Query String Parameters 包含了一些
  • 安卓逆向入门指南:介绍与准备

    安卓逆向入门指南 介绍与准备 简介 安卓逆向工程是指通过分析 修改和破解安卓应用程序 获取其内部逻辑 探索其实现细节或者进行二次开发的技术过程 在这个系列博客中 我们将介绍安卓逆向的基础知识 常用工具和技术 并通过实例演示来帮助初学者入门
  • Xposed框架安装、使用及插件开发

    往期推荐 HOOK startActivity HOOK框架 动态代理 HOOK框架 静态代理 实战案列分析 Crakeme01 需要相关资料的朋友 可以 加入此处即可打包获取 Xposed框架是一款可以在不修改APK的情况下影响程序运行
  • ubantu环境下IDA pro运行时碰到某些so找不到的问题

    最近帮组员解决IDA的问题 做个记录 问题 执行启动idea时出现报错 IDA Pro idaq64 报错如下 idaq64 error while loading shared libraries libgthread 2 0 so 0
  • 你参与的APP开发项目安全吗?

    Android将安全设计贯穿系统架构的各个层面 覆盖系统内核 虚拟机 应用程序框架层以及应用层各个环节 力求在开放的同时 也恰当保护用户的数据 应用程序和设备的安全 Android安全模型主要提供以下几种安全机制 进程沙箱隔离机制 应用程序
  • 安卓逆向入门指南:修改与重打包应用

    安卓逆向入门指南 修改与重打包应用 概述 介绍修改与重打包应用的目的和应用场景 强调合法性和道德准则 在逆向工程过程中需要遵守相关法律法规 理解应用结构与资源 APK文件结构 解释APK文件的基本结构 包括AndroidManifest x
  • IDA反编译的几个注意和技巧

    IDA逆向程序的经验总结 关于一些类型转换以及指针和地址的总结 关于F5汇编代码不能转成c的伪代码的几个问题总结 1 jmpout的问题 2 positive sp value has been found 的问题 3 call analy
  • 某某analysis参数算法分析

    作者 TheWeiJun 来源 逆向与爬虫的故事 今天给大家带来一个干货分享 由于想要查看某些APP的详细信息 需要通过APP名称去某麦网站进行搜索查看 而整个过程中涉及到逆向分析 为了方便大家学习 本次完整流程记录如下 目录 一 确定要获
  • 某站弹幕Protobuf协议逆向分析

    一杯敬明天 一杯敬过往 大家好 我是TheWeiJun 时间过得好快 转眼间春节已过 此刻大家都已经开始复工了吧 首先祝大家新年快乐 2023年一路旺旺旺 小编也是心情激动 才有了前面的开场白 直入主题 今天给大家带来某站弹幕protobu
  • IDM 6.4.1逆向分析笔记

    环境准备 安装过程不做说明 1 x64dbg 官网地址 https x64dbg com 2 火绒剑 官网地址 https www huorong cn SPY 下载地址 https github com westoncampbell Sp
  • 逆向面试常见问题(陆续更新ing)

    资料大部分收集于网络 点击对应标题有原帖地址 PE 怎么判断PE是DLL 还是EXE 文件值属性 加载基址 怎么判断PE文件是32位还是64位 PE加载过程 基础 Windows下的调用约定 通用寄存器有哪些 段存器 怎么找到函数地址 调试
  • android so 调试

    安卓调试 环境 tool JDK 8X 之前用15版本的 monitor一直无法启动 链接 https pan baidu com s 12LUwB7ZOVEcblAzkO8hxyA 提取码 5lw0 monitor bat 流程 开启调试

随机推荐

  • 使用Java 8函数式编程生成字母序列

    在 Java 8 中使用函数式编程生成字母序列是一个很大的挑战 Lukas Eder 愉快地接受了这个挑战 他将告诉我们如何使用 Java 8 来生成ABC的序列 当然 肯定不是一种蹩脚的方式 我被 Stack Overflow 上网友 m
  • C++ xml库的选择

    自从触及xml文件的读写 一直以来都是用的tinyxml2 接口简单 然而近期项目频繁出错 跟踪调试发现 问题出在了xml文件的读写上 当节点数超过百万级别的时候 内存暴增到G的当量 很显然程序会由于内存申请不足崩掉了 果断寻找替代品 百度
  • Android开源框架之Picasso(图片加载框架)

    简介 Picasso是Square公司出品的一个强大的图片下载和缓存图片库 在adapter中需要取消已经不在视野范围的ImageView图片资源的加载 否则会导致图片错位 Picasso已经解决了这个问题 使用复杂的图片压缩转换来减少内存
  • ue4 蓝图通信的几种方式

    一 设置公有变量 完成通信 1 蓝图类Door bp中声明变量NewVar 1 为公有 确定好变量类型 编译 2 关卡视口中选中这个蓝图类Door bp的实例 世界大纲视图下的细节面板中 默认下出现公有变量名称NewVar 1 用吸管吸取关
  • springboot+poi开发excel导出 加载Excel模板导出 Excel导出详解

    提到Excel导出功能 可能很多人都使用springmvc框架做过 笔者今天要给大家分享的是基于springBoot开发Excel复杂模板导出功能 所谓复杂模板指在模板里的特定表头里有不同的单元格合并以及背景色 字体颜色的填充 文本内容的对
  • linux下libpcap抓包分析

    linux下libpcap抓包分析 一 首先下载libpcap包http www tcpdump org latest release 然后安装 安装完成后进入安装根目录的tests文件夹 编译运行findalldevstest c 编译时
  • 实现mnist手写数字识别(第一周)

    本文为 365天深度学习训练营 中的学习记录博客 参考文章 365天深度学习训练营 第P1周 实现mnist手写数字识别 Pytorch实战 第P1周 实现mnist手写数字识别 qq com 原作者 K同学啊 接辅导 项目定制 我的环境
  • 使用codestriker搭建代码评审平台

    codestriker是用perl语言开发的 可以使用apache cgi进行访问的代码评审web站点 搭建过程如下 1 yum install perl 2 yum install highlight 3 配置codestriker co
  • k8s部署minio

    安装krew插件 官网地址 https krew sigs k8s io docs user guide setup install set x cd mktemp d OS uname tr upper lower
  • 图论算法<三>:判断有向图中是否有存在循环 ,以及环的个数和各个环中的元素

    1 目的 判断有向图中是否有存在循环 以及环的个数和各个环中的元素 2 示例效果 2 1 原始数据 路线起终点整理如下 共计12个顶点 19条边 起点 终点 1 最后的1代表起点终点是连通的 起点 终点 1 2 4 1 起点 终点 1 9
  • 深度学习理论及运用(三)Deep feedforward network

    转化成非线性 1 RBF径向基函数 2 利用sift特征以及K means 3 用数据去训练 举例 异或门 使用非线性运算 用图来表示实现线性可分的过程 目的 优化目标函数 Cost Functions 目标函数 交叉熵 公式前加负号转化为
  • Mybatis-Plus&&Druid多数据源配置

    多数据源配置思路 yml中配置多个数据源 通过AOP自动切换不同的数据源 配合Mybatis plus使用 yml配置 spring datasource druid db1 url jdbc mysql 10 168 1 118 3306
  • JPA对象的四种状态

    JPA对象的四种状态 1 瞬时状态 Transient 与数据库没有对应 跟Session没有关联 一般是新new出的对象 2 持久化状态 Persist 对象再Session的管理之中 最终会有对应的数据记录 特点 a 有OID 唯一标示
  • keyshot环境素材文件_做设计,用keyshot简单6步渲染出满意效果图,上手容易你也学得会...

    点击上方 机械设计一点通 关注我们 每天学习一个机械设计相关知识点 KeyShot是一个完全基于CPU为三维数据进行渲染和动画操作的独立渲染器 广泛用于高精度图像的实时呈现 为设计师 工程师和CG专业人士轻松地创建逼真的图像和三维模型动画提
  • python学习笔记---高级特性【廖雪峰】

    高级特性 切片 Slice 对应上面的问题 取前3个元素 用一行代码就可以完成切片 gt gt gt L 0 3 Michael Sarah Tracy L 0 3 表示 从索引0开始取 直到索引3为止 但不包括索引3 即索引0 1 2 正
  • 用c++编写网络爬虫

    include
  • el-date-picker时间选择器设置可选范围当前时间的六个月内

    el date picker时间选择器
  • Vue3快速上手

    Vue3快速上手 1 Vue3简介 2020年9月18日 Vue js发布3 0版本 代号 One Piece 海贼王 耗时2年多 2600 次提交 30 个RFC 600 次PR 99位贡献者 github上的tags地址 https g
  • 三分钟看懂神经网络机器翻译

    神经网络机器翻译 NMT 已成为本地化行业中最热门的话题之一 与以往基于统计的机器翻译 SMT 相比 可以使翻译质量提升 30 同时解决了远距离语言对的复杂性问题 如中文到英语 日语到英语等 SDL 的一项近期调查显示 61 的受访者认为机
  • Dex文件加载以及类加载流程

    Dex文件加载以及类加载流程 安卓源码连接 http androidxref com 4 4 4 r1 app在启动的过程中创建了PathClassLoader加载dex文件 那么我们跟进PathClassLoader libcore da