文章目录

  • 前言
  • 一、Class.cpp#dvmDefineClass 函数分析
  • 二、Class.cpp#findClassNoInit 函数分析
  • 三、DexFile.cpp#dexFindClass 函数分析

前言

上一篇博客 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | native 函数查询 | dalvik_system_DexFile.cpp#defineClassNative 函数 ) 中 , dalvik_system_DexFile.cpp#Dalvik_dalvik_system_DexFile_defineClassNative 函数中 , 调用了 Class.cpp#dvmDefineClass 函数 ;

一、Class.cpp#dvmDefineClass 函数分析


在 Class.cpp#dvmDefineClass 函数中 , 主要调用了 Class.cpp#findClassNoInit 函数 ;

Class.cpp#dvmDefineClass 函数源码 :

/** 从指定的DEX文件加载命名类(按描述符)。* 由类装入器用于从* 虚拟机管理的DEX。*/
ClassObject* dvmDefineClass(DvmDex* pDvmDex, const char* descriptor,Object* classLoader)
{assert(pDvmDex != NULL);return findClassNoInit(descriptor, classLoader, pDvmDex);
}

源码路径 : /dalvik/vm/oo/Class.cpp#dvmDefineClass

二、Class.cpp#findClassNoInit 函数分析


在 Class.cpp#findClassNoInit 函数中 ,

先调用 dvmLookupClass 函数 , 查询当前已经加载的类 , 一般情况下 , 第一次加载 , 查询到的结果是空的 ;

 // 查询当前已经加载的类 , 第一次加载 , 一般查询不到 clazz = dvmLookupClass(descriptor, loader, true);

然后进入到 clazz == NULL 分支 , 执行 dexFindClass 函数 , 此处调用了 dexFindClass , 就是在该函数中 , 恢复被抽取的函数 , 《Android中实现「类方法指令抽取方式」加固方案原理解析 | 作者 : 姜维》 博客 中恢复抽取函数的 hook 点 , 就是 dexFindClass 中 ;

pClassDef = dexFindClass(pDvmDex->pDexFile, descriptor);

参考 【Android 逆向】Dalvik 函数抽取加壳 ( Dalvik 下的函数指令抽取与恢复 | dex 函数指令恢复时机点 | 类加载流程 : 加载、链接、初始化 ) 博客 ;

Class.cpp#findClassNoInit 函数源码 :

/** 查找命名类(按描述符)。如果还没有加载,* 我们加载并链接它,但不执行<clinit>。(越南船民* 事件可能导致初始化的特定限制。)* * 如果“pDexFile”为空,我们将在bootclasspath中搜索条目。* * 失败时,返回NULL并引发异常。* * TODO:我们需要返回一个是否加载了类的指示* 使用现有的定义。如果有人故意加载* 在同一个类加载器中初始化两次,它们将得到LinkageError,* 但无意中同时引用类应该“正常工作”。*/
static ClassObject* findClassNoInit(const char* descriptor, Object* loader,DvmDex* pDvmDex)
{// 查询当前已经加载的类 , 第一次加载 , 一般查询不到 clazz = dvmLookupClass(descriptor, loader, true);if (clazz == NULL) {// 第一次查询 , 肯定会进入该分支const DexClassDef* pClassDef;dvmMethodTraceClassPrepBegin();profilerNotified = true;#if LOG_CLASS_LOADINGu8 startTime = dvmGetThreadCpuTimeNsec();
#endifif (pDvmDex == NULL) {assert(loader == NULL);     /* shouldn't be here otherwise */pDvmDex = searchBootPathForClass(descriptor, &pClassDef);} else {// 此处调用了 dexFindClass , 就是在该函数中 , 恢复被抽取的函数 //《Android中实现「类方法指令抽取方式」加固方案原理解析 | 作者 : 姜维》 博客// 中恢复抽取函数的 hook 点 , 就是 dexFindClass 中pClassDef = dexFindClass(pDvmDex->pDexFile, descriptor);}return clazz;
}

源码路径 : /dalvik/vm/oo/Class.cpp#findClassNoInit

三、DexFile.cpp#dexFindClass 函数分析


在该 DexFile.cpp#dexFindClass 函数 中 , 恢复被抽取的函数 , 《Android中实现「类方法指令抽取方式」加固方案原理解析 | 作者 : 姜维》 博客 中恢复抽取函数的 hook 点 , 就是 dexFindClass 中 ;

DexFile.cpp#dexFindClass 函数源码 :

/** 按描述符查找类定义条目。* * “描述符”应该像“Landroid/debug/Stuff;”。*/
const DexClassDef* dexFindClass(const DexFile* pDexFile,const char* descriptor)
{const DexClassLookup* pLookup = pDexFile->pClassLookup;u4 hash;int idx, mask;hash = classDescriptorHash(descriptor);mask = pLookup->numEntries - 1;idx = hash & mask;/** 搜索,直到找到匹配的条目或空插槽。*/while (true) {int offset;offset = pLookup->table[idx].classDescriptorOffset;if (offset == 0)return NULL;if (pLookup->table[idx].classDescriptorHash == hash) {const char* str;str = (const char*) (pDexFile->baseAddr + offset);if (strcmp(str, descriptor) == 0) {return (const DexClassDef*)(pDexFile->baseAddr + pLookup->table[idx].classDefOffset);}}idx = (idx + 1) & mask;}
}

源码路径 : /dalvik/libdex/DexFile.cpp#dexFindClass

【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | Class.cpp#findClassNoInit 函数 | DexFile.cpp#dexFindClass 函数分析 )相关推荐

  1. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | native 函数查询 | dalvik_system_DexFile.cpp#defineClassNative 函数 )

    文章目录 前言 一.查询 defineClassNative 函数 二.dalvik_system_DexFile.cpp#Dalvik_dalvik_system_DexFile_defineCla ...

  2. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | DexPathList#findClass 函数分析 | DexFile#loadClassBinaryName 函数 )

    文章目录 前言 一.DexPathList.java#findClass 类加载函数源码分析 二.DexFile.java#loadClassBinaryName 函数源码分析 前言 上一篇博客 [A ...

  3. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | ClassLoader#loadClass 函数分析 | BaseDexClassLoader#findClass 分析 )

    文章目录 一.ClassLoader.java#loadClass 类加载函数源码分析 二.BaseDexClassLoader.java#findClass 函数源码分析 一.ClassLoader ...

  4. 【Android 逆向】Dalvik 函数抽取加壳 ( Dalvik 下的函数指令抽取与恢复 | dex 函数指令恢复时机点 | 类加载流程 : 加载、链接、初始化 )

    文章目录 前言 一.Dalvik 下的函数指令抽取与恢复 二.dex 函数指令恢复时机点 1.dex 函数指令恢复 2.Android 源码中搜索 dexFindClass 函数 3.类加载流程 : ...

  5. 【Android 逆向】整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmContinueOptimizati() 函数分析 )

    文章目录 前言 一.DexPrepare.cpp 中 dvmContinueOptimizati() 方法分析 前言 上一篇博客 [Android 逆向]整体加固脱壳 ( DEX 优化流程分析 | D ...

  6. Android App Bundle混淆加密加壳加固保护的解决方案(过Google App上架审核)

    Android AAB简介和AAB包格式 AAB即Android App Bundle,是Google官方发布的一种新的App包格式,可以有效缩减App大小,提升用户安装和更新App的体验.在Goog ...

  7. 【Android 逆向】整体加固脱壳 ( DEX 优化流程分析 | dvmDexFileOpenPartial | dexFileParse | 脱壳点 | 获取 dex 文件在内存中的首地址 )

    文章目录 前言 一.DexPrepare.cpp 中 rewriteDex() 方法分析 二.DvmDex.cpp 中 dvmDexFileOpenPartial() 方法分析 ( 脱壳点 ) 三.D ...

  8. Android so文件保护——使用upx加壳

    最近有人问我关于UPX加壳的问题,关于UPX如何加壳以及脱壳,网上说的很清楚了,这里不细说了,附件是很早之前我配置UPX加壳环境的一些资料和配置包以及成功的实例,有需要的小伙伴可以下下来玩. 附件:点 ...

  9. 【Android 逆向】整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )

    文章目录 前言 一.DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 二./bin/dexopt 源码分析 前言 上一篇博客 [Android 逆向]整体加固脱壳 ...

最新文章

  1. bzoj 3864: Hero meet devil [dp套dp]
  2. select 语句的执行顺序
  3. 文本框字符串长度实时统计jQuery插件,兼容IE6+
  4. VS_自动添加头文件
  5. Nike Barkley Foamposite Max “Rayguns”
  6. cassandra本地连接失败_本地网络发现失败的解决方法连接到OS X中的服务器的问题 | MOS86...
  7. 不是keys,记一次因 redis 使用不当导致应用卡死 的过程
  8. Spring ConfigurationClassPostProcessor Bean解析及自注册过程
  9. rest端点_REST:使用Controller端点?
  10. 单片机编程文件组织形式(个人编程规范)
  11. 领域驱动设计(DDD):领域和子域
  12. 计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...
  13. arduino 停止程序_Arduino用ISD1820语音录放模块制作留言机
  14. java电驴_java写的电驴下载完成关机小程序
  15. 计算机二级2018VB题库百度云,2018年春江苏省计算机二级VB考试真题第1套
  16. 计算机网络工程教程,计算机网络工程实用教程ppt课件
  17. 什么是Heads-up displays(HUD)
  18. Chrome-Chrome源码剖析
  19. mysql权威指南 代码_mysql权威指南学习札记
  20. 剑指offer笔记(七) 第47题至第53题

热门文章

  1. 跨域cookie传递
  2. 各种常用的WINFORM控件遍历
  3. linux常用性能分析命令详解#TOP
  4. Python学习教程:Python爬虫抓取技术的门道
  5. [bzoj2288][pojChallenge]生日礼物【贪心+堆+链表】
  6. java中后端拼接字符串返回前台页面换行显示
  7. 5.1深入理解计算机系统——系统级I/O
  8. Android内容观察者
  9. Linux命令:tail
  10. jquery-ui里日期插件的使用