首页 > 其他分享 >Android脱壳基础知识

Android脱壳基础知识

时间:2023-04-11 19:57:55浏览次数:40  
标签:脱壳 java ClassLoader 基础知识 Java Android 父类 加载

JVM的类加载器:

  1. Bootstrap ClassLoader 引导类加载器:C/C++代码实现的加载器,用于加载制定的JDK核心库,比如java.lang.*、java.util.*等这些系统类。Java虚拟机的启动就是通过Bootstrap,该ClassLoader在java里无法获取,负责加载/lib下的类
  2. Extensions ClassLoader 拓展类加载器:Java中的实现类为ExtClassLoader,提供了除了系统类之外的额外功能,可以在java里获取,负责加载/lib/ext下的类
  3. Application ClassLoader 应用程序类加载器:Java中的实现类为APPClassLoader,是与我们接触最多的类加载器,开发人员写的代码默认就是它来加载,ClassLoader.getSystemClassLoader返回的就是它。
  4. 自定义类加载器:只需要通过继承java.lang.ClassLoader类的方式来实现自己的类加载器即可。

加载器的加载顺序:

加载顺序:

  1. BootStrap ClassLoader
  2. Extension ClassLoader
  3. APPClassLoader

双亲委派

  如果一个类加载器收到了类加载请求,他并不会自己先去加载,而是把这个请求委托给父类加载器去执行,如果父类加载器还存在父类加载器,则进一步向上委托,依次递归,请求最终会到达顶层的启动类加载器,如果父类加载器可以完成加载任务,就成功返回,如果父类加载器无法完成加载任务,子加载器才会尝试去自己加载,这就是双亲委派模式,即每个儿子接到工作都会给父亲去干,当父亲干不了时,再自己去尝试干。

  双亲委派的存在原因:

  1. 避免重复加载,如果加载过一次Class,可以直接读取已经加载的Class
  2. 更加安全,无法自定义类来替代系统的类,可以防止核心API库被随意篡改

类加载时机:

  1. 隐式加载:
    • 创建类的实例来初始化某个类的子类
  2. 显式加载:通过反射来加载我们已知的类来加载:
    • 使用LoadClass()加载
    • 使用forName()加载

类加载流程:

  1. 装载:查找和导入Class文件
  2. 链接:其中解析步骤是可以选择的
    1. 检查:检查载入的class文件数据的正确性
    2. 准备:给类的静态变量分配储存空间
    3. 解析:将符号引用转成直接引用
  3. 初始化:即调用<clinit>函数,对静态变量,静态代码块执行初始化工作

  其中1、2步骤并未类中的函数进行任何调用

 

Android系统中的ClassLoader:

ClassLoader.java为抽象类,BootClassLoader是预加载常用类,单例模式。与Java中的BootClassLoader不同,它并不是用C/C++代码实现的,而是由Java实现的。

  SecureClassLoader继承了抽象类ClassLoader,拓展了ClassLoader类,加入了权限方面的功能,其子类URLClassLoader是由URL路径从jar文件中加载类和资源。

  BaseDexClassLoaderPathClassLoaderDexClassLoaderInMemoryDexClassLoader的父类,类加载的主要逻辑都是在BaseDexClassLoader中完成的。

    PathClassLoader是Android默认使用的类加载器,一个apk中的Activity等类便是其加载。

    DexClassLoader可以加载任意目录下的dex、jar、apk、zip文件,比PathClassLoader更灵活,是实现插件化、热修复以及dex壳的重点。

    InMemoryDexClassLoader从内存中加载Dex文件

 

标签:脱壳,java,ClassLoader,基础知识,Java,Android,父类,加载
From: https://www.cnblogs.com/YoungPionner/p/17304705.html

相关文章

  • Android-APK反编译
    1.原理学习反编译之前,建议先学习一下Apk打包的过程,明白打包完成后的Apk里面都有什么文件,各种文件都是怎么生成的。Apk技术也有非常多的技术可以学习,主要都是围绕着如何减小体积,如何提高打包速度展开,这里先不多说了。下面是一张基本的Apk文件结构图。Apk文件本质上其实是一个zip......
  • Android - AXMLPrinter2.jar的使用方法
    我们需要查看打出的apk包中AndroidManifest.xml文件,但是打开之后发现是一大堆的乱码这是就需要反编译工具,AXMLPrinter2.jarAXMLPrinter2.jar官方介绍:AXMLPrinter2.jarapk分析APK文件,取得APK文件中的包名、版本号及图标,很强大的工具,再一次感受到了批处理的牛逼。可以将android......
  • 成品直播源码,Android实现监听Settings值变化的功能
    成品直播源码,Android实现监听Settings值变化的功能先创建一个内部类继承自ContentObserver   classSettingsContentObserverextendsContentObserver{    publicSettingsContentObserver(){      super(newHandler());    }    ......
  • Android Kotlin mapTo
     在Kotlin中,mapTo是一种用于将集合中的元素转换成另一个集合的函数。它可以将一个集合的元素映射到另一个集合,并将结果添加到目标集合中。mapTo的语法如下:fun<T,R,C:MutableCollection<inR>>Iterable<T>.mapTo(destination:C,transform:(T)->R):C其中:T是源集......
  • Android Debug (调试)注解处理器
     1.addremotedebugconfiguration2.copyjvmoptions:(-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005),andpasteittogradle.propertiesfile.  3.thenclickdebugbuttontoattachlocalhost:5005,expandthegradletasklist......
  • Android布局
    接下来,将文本转换为十进制数字。对 stringInTextField 调用 toDouble(),并将其存储在一个名为 cost 的变量中。valcost=stringInTextField.toDouble()不过,这样行不通-需要对 String 调用 toDouble()。原来 EditText 的 text 属性是 Editable,因为它表示可以......
  • Android MVVM之SavedStateHandle数据保存之详解与使用。
    一、介绍        SavedStateHandle从名字可以看出,是保存状态的。这个类常和MVVM中的ViewModel搭配使用,对页面生命周期的数据状态的缓存与恢复做一个容器。这个容易相对onSaveInstanceState(Bundle)要更强一点,保存的数据类型也比较丰富,数据量也相对较大二、分析     ......
  • Android 短视频和图片无读写权限TargetApi>=29解决方案
    一、背景        目前很多公司在适配API29,也就是targetSdkVersion=29的权限适配。不仅是权限的适配,还有政策的要求。目前就有很多大公司已收到工信部要求,不给读写权限:android.permission.WRITE_EXTERNAL_STORAGE和android.permission.READ_EXTERNAL_STORAGE      ......
  • Android 代码混淆 包名被混淆 主工程二次混淆 一站解决你的混淆
    代码混淆(Obfuscatedcode)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称作代码混淆器。已经存在许多种功能各异的代码混淆器。将代码中的各种元素,如......
  • Android DataStore Proto框架存储接入AndroidStudio教程详解与使用
    一、介绍        通过前面的文字,我们已掌握了DataStore的存储,但是留下一个尾巴,那就是Proto的接入。Proto是什么?Protobuf,类似于json和xml,是一种序列化结构数据机制,可以用于数据通讯等场景,相对于xml而言更小,相对于json而言解析更快,支持多语言官网:LanguageGuide(proto3)|......