当前位置: 首页 > news >正文

通过源码分析类加载器里面可以加载的类

类列表

  每一个ClassLoader里面的类列表,类的数量都是固定的。

对上一节中的dex反编译

  使用DexClassLoader类动态加载插件dex
  利用jadx对dex进行反编译可以看到有哪些类

在这里插入图片描述

源码分析

  • BaseDexClassLoader
    BaseDexClassLoader类加载器开始分析
    BaseDexClassLoader类里有一个pathList属性,它的类型是DexPathList,分析DexPathList类的定义
    在这里插入图片描述

  • DexPathList
    DexPathList类里有一个dexElements属性,它是Element类型,分析Element类的定义
    在这里插入图片描述

  • Element
    Element类是DexPathList的内部类,它有一个属性是dexFile,它是DexFile类型,分析DexFile类的定义

    在这里插入图片描述

  • DexFile
    DexFile里找到一个方法getClassNameList(),获取类名,它需要一个参数cookie
    在这里插入图片描述
    cookie参数就是DexFile类的属性mCookie了在这里插入图片描述
    接下来通过反射调用getClassNameList()方法就可以得到类加载器可以加载的类了。

代码

public static void getClassListInClassLoader(ClassLoader classLoader) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {// 获取BaseDexClassLoader类Class BaseDexClassLoaderClass=Class.forName("dalvik.system.BaseDexClassLoader");// 获取BaseDexClassLoader类中的pathList字段Field pathListField = BaseDexClassLoaderClass.getDeclaredField("pathList");// 设置权限pathListField.setAccessible(true);// 从传进去的参数classLoader加载器对象中获取pathList对象Object pathListobj = pathListField.get(classLoader);// 获取DexElemtnt类Class DexElemtntClass = Class.forName("dalvik.system.DexPathList");// 获取DexElemtnt类中的dexElements字段Field dexElements = DexElemtntClass.getDeclaredField("dexElements");// 设置权限dexElements.setAccessible(true);//  pathList对象中获取dexElements对象Object[] dexElementsArratobj = (Object[]) dexElements.get(pathListobj);// 获取Element内部类Class ElementClass = Class.forName("dalvik.system.DexPathList$Element");// 从Element内部类中获取字段dexFileField dexFileField = ElementClass.getDeclaredField("dexFile");设置权限dexFileField.setAccessible(true);  // 取消权限检查// 获取DexFile类Class DexFileClass = Class.forName("dalvik.system.DexFile");// 从DexFile类中获取字段mCookie Field mCookieField = DexFileClass.getDeclaredField("mCookie");// 设置权限mCookieField.setAccessible(true);// 获取字段mFileNameField mFIleNameField = DexFileClass.getDeclaredField("mFileName");// 设置权限mFIleNameField.setAccessible(true);// 从DexFile类中获取getClassNameList方法Method getClassNameListMethod = DexFileClass.getDeclaredMethod("getClassNameList",Object.class);// 设置权限getClassNameListMethod.setAccessible(true);// 遍历dexElements,dexElement里面有dexFilefor(Object dexElementobj:dexElementsArratobj){// 获取dexfile对象Object dexfileObj = dexFileField.get(dexElementobj);// 获取mCookie对象Object mCookieobj = mCookieField.get(dexfileObj);// 获取mFileName对象String mFileNameobj = (String) mFIleNameField.get(dexfileObj);// 调用getClassNameList方法获取类列表String[] classList = (String[]) getClassNameListMethod.invoke(null,mCookieobj);for(String classname:classList){// 打印信息Log.e("classlist",classLoader.toString()+"---"+mFileNameobj+"---"+classname);}}
}

调用getClassListInClassLoader()

getClassListInClassLoader(dexClassLoader)
成功获取到了dexClassLoader类加载器中可以加载的类
在这里插入图片描述

http://www.lryc.cn/news/476112.html

相关文章:

  • RSA算法:数字安全的基石
  • DPDK高性能处理框架VPP
  • Spring工厂方式实现实例化bean有哪些方式?
  • 衡石分析平台系统分析人员手册-指标分析看板
  • 《C++17 结构化绑定:解锁不同类型处理的秘籍》
  • 大型音频模型:AudioLLMs
  • 【ShuQiHere】️理解Python中的相对路径:使用 `..` 和 `.` 的指南
  • DMFLDR数据载入使用实践
  • 发布 NPM 包时,终端显示发布成功但实际上版本并没有更新,可能是由于以下原因
  • Java学习Day57:碧水金睛兽!(Spring Cloud微服务1.0)
  • 物联网开发教程专栏介绍与专栏说明——列表目录查阅(持续更新)
  • uni-app实现app展示进度条在线更新以及定时更新提醒
  • 【Linux】进程间通信(命名管道、共享内存、消息队列、信号量)
  • [Android]从FLAG_SECURE禁止截屏看surface
  • python 五子棋小游戏
  • JeecgBoot集成工作流实战教程
  • 第三十章 章节练习商品列表组件封装
  • NumPy 高级索引
  • C/C++常用编译工具链:GCC,Clang
  • let和war的区别
  • [CUDA] stream使用笔记
  • 第二课:开发工具
  • Vue 学习随笔系列十三 -- ElementUI 表格合并单元格
  • 对于一个含有直流和交流分量的信号,如何使用示波器正确显示并测出直流电压值和交流电压峰峰值?
  • 移动混合开发面试题及参考答案
  • 命令行工具开发秘籍:从零开始创建实用Python脚本(如何创建Python命令行工具)
  • Python - PDF 分割成单页、PDF 转图片(PNG)
  • 【网络】套接字编程——TCP通信
  • PyTorch实践-CNN-验证码识别
  • json和pb的比较