之前 简单分析过 Dex 4.4 dvm系统中 Dex加载的流程
在 java层中 调用 findClass最终会调用
defindClassNative>函数
下面 也是简单分析一下 defindClassNative-> 具体执行流程

先判断是否是合法的 cookie
如果是 dex调用 dvmGetRawDexFileDex->
如果是 jar调用dvmGetJarFileDex->

执行完毕 dvmGetRawDexFileDex->


在dvmDefineClass ->对参数 进行简单的封装
最终调用 findClassNoInit->

在注释 中可以得知 ,根据描述符 找到 指定的类
但是没有加载 没有运行 没走 类的初始化 函数
(dvm虚拟机 会在 一个 恰当的时间进行初始化)


先会检测是否 有异常 防止 别的进程加载
如果 顺利通过 会调用
dvmLookupClass->查找 是否被加载
如果没被加载 返回 NULL

如果没有 找到指定类 往下执行
会走 dexFindClass->
传入 DvmDex 和 描述符 查找 (函数如下 )

从注释 中得出 描述符 类似
Landroid/debug/Stuff;
会返回 DexClassDef *的 偏移路径
返回上层 拿到DexClassDef * 就可以拿到
指定class的 数据
拿到数据 以后 会调用 loadClassFromDex->

调用完loadClassFromDex -> 以后 会 返回
ClassObject * dvm虚拟机 可以 识别的 类 信息
主要 关注以下函数

开头 会做一些 简单的 效验
拿到 data数据

最终会调用
loadClassFromDex0->
这个函数 的主要 功能 是将
内存中的 数据 添加到 结构体中
函数很长 也很重要 最终 会返回
ClassObject* 这个 可以拿到一个 class的 全部 数据

返回 到
findClassNoInit->

一个类找到了以后 会把
类的 返回结果(ClassObject*) 添加到 gDvm.loadedClasses()


用class的 Name 作为key进行保存
添加到HashTable以后 会对类进行连接
比如 进行父类的初始化 具体函数如下

回到defineClassNative->
全部执行成功 以后 会吧 ClassObject* 当参数返回
如图画红色框框

执行完毕 会 把结果 返回
也就是 java层的 findClass函数
下面分析一下在什么地方进行类的 初始化
返回到 dvmFindClass函数 当 dvmFindClassNoInit 函数 执行完毕
不等于NULL的 情况 会进行类的 初始化

跳转到 dvmInitClass->

继续往下走
拿到类的构造方法 ,dvmCallMethod->进行调用

OK类初始化成功
如果对 逆向,脱壳,新技术 感兴趣的 同学 可以加 我Q群 欢迎各位能人志士 一起讨论
欢迎加入故事,群聊号码:773642813
珍惜
2018年10月29日11:12:54
-----------------------------------------------------------------------------------------------------------------------------------------
网友评论