美文网首页
dvm虚拟机是如何 找Class的 Native层分析

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

作者: 珍惜Any | 来源:发表于2018-10-29 11:12 被阅读0次

    之前 简单分析过 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

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

    相关文章

      网友评论

          本文标题:dvm虚拟机是如何 找Class的 Native层分析

          本文链接:https://www.haomeiwen.com/subject/muzvtqtx.html