dvm虚拟机是如何 找Class的 Native层分析

2018-10-29  本文已影响0人  珍惜Any

之前 简单分析过 Dex 4.4 dvm系统中 Dex加载的流程

4.4  Dex  加载流程Native层分析 - 简书

在 java层中 调用 findClass最终会调用

defindClassNative>函数

下面 也是简单分析一下 defindClassNative-> 具体执行流程

先判断是否是合法的 cookie

如果是 dex调用 dvmGetRawDexFileDex->

如果是 jar调用dvmGetJarFileDex->

执行完毕 dvmGetRawDexFileDex->

拿到数据的地址 以后 调用dvmDefineClass->

在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()

loadedClasses 是一个 HashTable(如下图)

用class的 Name 作为key进行保存

添加到HashTable以后 会对类进行连接

比如 进行父类的初始化 具体函数如下

回到defineClassNative->

全部执行成功 以后 会吧 ClassObject* 当参数返回

如图画红色框框

执行完毕 会 把结果 返回

也就是 java层的 findClass函数

下面分析一下在什么地方进行类的 初始化

返回到 dvmFindClass函数 当 dvmFindClassNoInit 函数 执行完毕

不等于NULL的 情况 会进行类的 初始化

跳转到 dvmInitClass->

继续往下走

拿到类的构造方法 ,dvmCallMethod->进行调用

OK类初始化成功

如果对 逆向,脱壳,新技术 感兴趣的 同学 可以加 我Q群 欢迎各位能人志士 一起讨论

欢迎加入故事,群聊号码:773642813 

                                                                    珍惜

                                                                                    2018年10月29日11:12:54

-----------------------------------------------------------------------------------------------------------------------------------------

上一篇下一篇

猜你喜欢

热点阅读