首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Android 逆向】启动 DEX 字节码中 Activity 组件 ( 使用 DexClassLoader 获取组件失败 | 失败原因分析 | 自定义加载没有加载组件权限 )

DexClassLoader 加载普通 com.example.dex_demo.DexTest 并执行 test() 方法 , 是可以执行成功 ; 但是加载 Activity 组件失败了...; 其中最主要原因是 , 加载双亲委派机制 , 加载 Android 组件需要使用系统指定加载 , 这些加载设置在 LoadedApk 实例对象中 , 并且这些加载只能从特定位置加载字节码文件...; 自己自定义 DexClassLoader 没有加载组件权限 ; 如果要加载组件 , 有两种方案 : 替换加载 : 使用自定义 DexClassLoader 加载替换 ActivityThread...中 LoadedApk 中加载 , 将原来 LoadedApk 中加载设置为新节点加载 ; 插入加载 : 基于双亲委派机制 , 只要将我们自定义加载插入到系统加载之上就可以..., 在 组件加载 和 最顶层启动加载之间插入自定义 DexClassLoader 加载即可 ;

99130

深入浅出Java加载机制使用自己类别载入

Java只有当需要使用时候,才会将载入。java载入,是通过加载进行。...JVM启动并初始化完成之后,就会产生Bootstrap Loader这个加载,这个加载通常是c或c++写。...Bootstrap Loader随后又会继续载入Extended Loader这个加载,并且设定Extended Loader加载为自己Bootstrap Loader。...image.png 我们发现系统加载会去加载当前程序project所在class路径。 我们来总结一下加载载入过程。...** loadclass方法载入实例时,不会执行静态区域,而是会等到真正使用来初始化实例时候执行 ** 使用自己类别载入 由同一个classloader载入,会只有一个class对象实例

70220
您找到你想要的搜索结果了吗?
是的
没有找到

【Android 逆向】加壳 Android 应用启动流程 | 使用反射替换 LoadedApk 中加载流程

文章目录 一、加壳 Android 应用启动流程 二、使用反射替换 LoadedApk 中加载流程 一、加壳 Android 应用启动流程 ---- 加壳 Android 应用启动流程 :...加壳 Android 应用执行时 , 壳代码获取应用执行权限 , 然后将加壳应用修正后 , 获得真正字节码文件 , 由加载加载真正字节码文件 , 然后执行应用业务逻辑 ; ① BootClassLoader...在 Application attachBaseContext 方法中 需要 解密 加壳 DEX 文件 , 反射设置 LoadedApk 中加载 ; 在 Application onCreate...对象 ; 二、使用反射替换 LoadedApk 中加载流程 ---- ActivityThread 是 Android 应用 主线程 起点 , ActivityThread 是全局单例 ,...ClassLoader 加载 对象 ; public final class LoadedApk { private ClassLoader mClassLoader; } 源码路径 :

1.4K10

内存泄漏 - 从Class加载说起

其中重点提到了: “关于websphere在控制台中进行重启应用,不是重启整个websphere,这时候静态是不能回收,造成些不能销毁,占用着内存,而且这些内存是不能重复使用,可以说是内存泄露...加载机制 Java应用程序运行时,在Class执行和被访问之前,它必须通过加载加载使之有效,加载是JVM代码一部分,负责在JVM虚拟机中查 找和加载所有的Java 本地lib库。...b) 一个子类加载能够委托它加载查找和加载,一个加载请求会从子类加载发送到加载,但是从来不会从父加载发送到子类加载。...d) 如果一个加载依赖于另一个或一些,那么这些被依赖必须存在于这个加载查找路径上,或者加载查找路径上。...4、 尽量避免使用Java 1.5语法定义 enum ,如果使用了enum,必须确认开发库保持在应用EAR加载这一级别之下,千万不能放置到WebSphere或JVM库路径中。

2.6K40

【面经】面试官:讲讲加载、链接和初始化?

这三个步骤中,对开发人员直接可见是Java加 载,通过使用Java加载(class loader)可以在运行时刻动态加载一个Java链接和初始化则是在使用Java之前会发生动作。...由于代理模式存在,启动一个加载过程加载和最终定义这个加载可能并不是一个。前者称为初始加载, 而后者称为定义加载。...这个逻辑是封装在java.lang.ClassLoader loadClass()方法中。一般来说,优先策略就足够好了。...比如,Apache Tomcat为每个Web应用都提供一个独立加载使用就是自己优先加载策略。IBM WebSphere Application Server则允许Web应用选择。...前面提到,加载代理模式默认使用优先策略。这个策略实现是封装在 loadClass()方法中。如果希望修改此策略,就需要覆写 loadClass()方法。

45430

即使技术再精,面试时一问这个必挂!!

这三个步骤中,对开发人员直接可见是Java加 载,通过使用Java加载(class loader)可以在运行时刻动态加载一个Java链接和初始化则是在使用Java之前会发生动作。...由于代理模式存在,启动一个加载过程加载和最终定义这个加载可能并不是一个。前者称为初始加载, 而后者称为定义加载。...这个逻辑是封装在java.lang.ClassLoader loadClass()方法中。一般来说,优先策略就足够好了。...比如,Apache Tomcat为每个Web应用都提供一个独立加载使用就是自己优先加载策略。IBM WebSphere Application Server则允许Web应用选择。...前面提到,加载代理模式默认使用优先策略。这个策略实现是封装在 loadClass()方法中。如果希望修改此策略,就需要覆写 loadClass()方法。

30610

Tomcat如何打破双亲委托机制?

这是个递归调用,即子加载持有加载引用,当一个加载加载一个Java时,会先委托加载加载,然后父加载在自己加载路径中搜索Java,当加载在自己加载范围内找不到时,才会交还给子加载加载...假如你手滑写个与JRE核心类同名,比如Object,双亲委托机制能保证加载是JRE里那个Object不是你写Object。...Tomcat加载 Tomcat自定义加载WebAppClassLoader打破了双亲委托机制: 首先自己尝试去加载某个,如果找不到再委托给加载,目的是优先加载Web应用自己定义...); } return clazz; } 工作流程 先在Web应用本地目录下查找要加载 若未找到,交给加载查找,即AppClassLoader 若加载也没找到这个,抛ClassNotFound...若ExtClassLoader加载失败,即JRE无此类,则在本地Web应用目录下查找并加载本地目录下无此类,说明不是Web应用自己定义,那么由系统加载加载

65010

Tomcat如何打破双亲委托机制?

这是个递归调用,即子加载持有加载引用,当一个加载加载一个Java时,会先委托加载加载,然后父加载在自己加载路径中搜索Java,当加载在自己加载范围内找不到时,才会交还给子加载加载...假如你手滑写个与JRE核心类同名,比如Object,双亲委托机制能保证加载是JRE里那个Object不是你写Object。...Tomcat加载 Tomcat自定义加载WebAppClassLoader打破了双亲委托机制: 首先自己尝试去加载某个,如果找不到再委托给加载,目的是优先加载Web应用自己定义...); } return clazz; } 工作流程 先在Web应用本地目录下查找要加载 若未找到,交给加载查找,即AppClassLoader 若加载也没找到这个,抛ClassNotFound...若ExtClassLoader加载失败,即JRE无此类,则在本地Web应用目录下查找并加载本地目录下无此类,说明不是Web应用自己定义,那么由系统加载加载

39120

java 虚拟机内存划分,加载过程以及对象初始化

----  不是虚拟机运行内存区域 ? 加载 java代码编译成class文件之后,就形成了信息-二进制字节流 想要使用,肯定要加载 ? 生命周期 ?...而且,对于非数组加载阶段,准确说是加载阶段中获取二进制字节流动作行为 是多样性 可以使用系统提供引导加载 也可以用户自定义加载 开发人员可以通过定义自己加载去控制字节流获取方式...,不过这一步骤是程序员最关心,单独拿出来说 加载过程最后一步,到了这个阶段才真正开始执行中定义Java程序代码(或者说是字节码) 初始化阶段是执行构造 ()方法过程 ?...所有的-->  变量 和 静态语句块 () 对于或者接口并不是必须,如果一个没有静态语句块 也没有对变量赋值操作 编译可以不为这个生成()方法 接口中不能使用静态语句块...但是仍然有变量初始化,所以接口与一样,也会生成这个方法 但是与不同是,不需要先执行接口()方法  只有当接口定义变量使用时,接口才会初始化 虚拟机会保证一个<clinit

78330

JVM架构体系与GC命令小总结

,碎片太多导致分配较大对象时无法找到足够连续内存不得不提前触发另一次gc 复制算法Copying:它将可用内存按容量划分为大小相等两块,每次只使用其中一块。...,负责加载JAVA_HOME/lib下合法文件 扩展加载extension classloader,负责加载JAVA_HOME/lib/ext下合法文件 应用程序加载application...JVM通过双亲委派模型进行加载,先交给其最底层加载无法加载时才自己试着去加载。...去加载,如果缓存了,就直接返回,否则再委派给classloader;直到最后bootstrap classloader,如果其缓存找不到,则在其路径下找,找到则至二级返回,否则往其子类返回,让其子类在其路径下找...,执行环境上下文 本地方法栈Native Method Stacks:线程内共享,与JVM Stack所发挥作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,本地方法栈则是为虚拟机执行

52030

java虚拟机

四、加载机制 是在运行期间第一次使用时动态加载不是编译时期一次性加载。因为如果在编译时期一次性加载,那么会占用很多内存。...注意,实例化不是加载一个过程,加载发生在所有实例化操作之前,并且加载只进行一次,实例化可以进行多次。 初始值一般为 0 值,例如下面的变量 value 被初始化为 0 不是 123。...这里加载之间父子关系一般通过组合(Composition)关系来实现,不是通过继承(Inheritance)关系实现。 1....工作过程 一个加载首先将加载请求传送到加载,只有当加载无法完成加载请求时才尝试加载。 2....由于双亲委派模型存在,所以在 rt.jar 中 Object 比在 ClassPath 中 Object 优先级更高,这是因为 rt.jar 中 Object 使用是启动加载 ClassPath

80120

关于Java加载双亲委派机制思考(附一道面试题)

一、预定义加载和双亲委派机制 1、JVM预定义三种类型加载: 启动(Bootstrap)加载:是用本地代码实现装入,它负责将/lib下面的加载到内存中(比如rt.jar)。...由于引导加载涉及到虚拟机本地实现细节,开发者无法直接获取到启动加载引用,所以不允许直接通过引用进行操作。...2、双亲委派机制描述 某个特定加载在接到加载请求时,首先将加载任务委托给加载,依次递归,如果加载可以完成加载任务,就成功返回;只有加载无法完成此加载任务时,才自己去加载。...如果使用委托机制,会递归查找,也就是首选用Bootstrap尝试加载,如果找不到再向下。...System是Bootstrap加载加载,就算自己重写,也总是使用Java系统提供System,自己写System根本没有机会得到加载

33510

【BATJ面试必会】Jvm 虚拟机篇

为了更容易管理方法区,从 JDK 1.8 开始,移除永久代,并把方法区移至元空间,它位于本地内存中,不是虚拟机内存中。 运行时常量池 运行时常量池是方法区一部分。...四、加载机制 是在运行期间第一次使用时动态加载不是一次性加载。因为如果一次性加载,那么会占用很多内存。 生命周期 ?...加载之间父子关系一般通过组合关系(Composition)来实现,不是继承关系(Inheritance)。 ? 1....工作过程 一个加载首先将加载请求转发到加载,只有当加载无法完成时才尝试自己加载。 2....由于双亲委派模型存在,所以在 rt.jar 中 Object 比在 ClassPath 中 Object 优先级更高,这是因为 rt.jar 中 Object 使用是启动加载 ClassPath

33320

面试必问 JVM 加载机制,你懂了吗?

1)使用双亲委派模型来组织加载之间关系,有一个显而易见好处就是 Java 随着它加载一起具备了一种带有优先层次关系。...2)重写 loadClass 方法,实现自己逻辑,不要每次都先委托给加载,例如可以先在本地加载,这样就破坏了双亲委派模型了。 8、Tomcat 加载?...例如你写了一个 java.lang.String ,放在当前应用 /WEB-INF/classes 中,如果没有此步骤保证,那么之后项目中使用 String 都是你自己定义不是 rt.jar...5)尝试从本地加载,如果步骤5中加载失败也会走到本步骤,这边打破了双亲委派模型,优先本地进行加载。...7)走到这,代表步骤6加载失败,如果之前不是使用双亲委派模式,则在这边会委托给加载来尝试加载。 8)走到这边代表所有的尝试都加载失败,抛出 ClassNotFoundException。

55220

Java加载原理机制

初始化步骤:         1)如果这个还没有被加载和链接,那先进行加载和链接         2)假如这个存在直接,并且这个还没有被初始化(注意:在一个加载中,只能初始化一次),...加载顺序是自顶向下,也就是由上层来逐层尝试加载此类。 5.委派机制 VM在加载时默认采用是双亲委派机制。...通俗讲,就是某个特定加载在接到加载请求时,首先将加载任务委托给加载,依次递归,如果加载可以完成加载任务,就成功返回;只有加载无法完成此加载任务时,才自己去加载 6.对象初始化顺序...-->子类静态代码块-->普通代码块-->构造函数-->子类普通代码块(如果有的话)-->子类构造函数 总之一句话,加载顺序优先于子类,静态块优先于其他代码块,先父静态块,再子类静态块...,除此之外,其他代码块都要等加载完再加载,普通代码块优先于构造块,先父普通代码块,再构造块,最后子类普通代码块,子类构造块

1.4K100

Java-JVM

Java加载过程 加载分为三步:加载、连接、初始化 加载:是将class文件读入内存并为之创建一个Class对象,存放在JVM方法区。任何使用时系统都会建立一个Class对象。...连接: (1)检查:检查载入class文件数据正确性 (2)准备:给静态变量分配存储空间 (3)解析:将符号引用转成直接引用 初始化: 1)如果类存在直接并且这个还没有被初始化,那么就先初始化...加载通过后,接下来分配内存。然后内存空间初始化操作,接着是做一些必要对象设置,最后执行方法。 为对象分配内存 加载完成后,接着会在Java堆中划分一块内存分配给对象。...栈为后进先出(LIFO),即每次删除(出栈)总是当前栈中最新元素,即最后插入(进栈)元素,最先插入被放在栈底部,要到最后才能删除。...例如说在Windows上IBM JDK不是免费公开,而是要跟IBM其它产品一起捆绑发布使用IBM Rational、IBM WebSphere的话都有机会用到J9 VM(也可以自己选择配置使用别的

1K30

Java 基础概念·Java 虚拟机

为避免以上原因引起 Full GC,可采用方法为增大永久代空间或转为使用 CMS GC。 是在运行期间第一次使用时动态加载不是一次性加载所有。因为如果一次性加载,那么会占用很多内存。...“非法向前引用” } static int i = 1; } 由于 () 方法先执行,也就意味着中定义静态语句块执行要优先于子类。...下图展示了加载之间层次关系,称为双亲委派模型(Parents Delegation Model)。该模型要求除了顶层启动加载外,其它加载都要有自己加载。...工作过程 一个加载首先将加载请求转发到加载,只有当加载无法完成时才尝试自己加载。 2....由于双亲委派模型存在,所以在 rt.jar 中 Object 比在 ClassPath 中 Object 优先级更高,这是因为 rt.jar 中 Object 使用是启动加载 ClassPath

40920

java虚拟机知识点简要梳理

加载有四种,启动加载,是C/C++实现,无法在java代码中调用,扩展加载、应用加载和自定义加载,双亲委派模型指的是当前加载加载某个时候,如果没有找到,首先调用加载,...如果加载没有找到这个,则再往上查找,一直到顶层启动加载,如果还是找不到,则启动加载尝试加载这个,如果没有加载成功,则返回空给子加载,子加载如果也没有加载到,则继续往下加载走...(2).每一层加载都把加载请求委派给加载,直到所有的加载请求都应该传递给顶层启动加载。...(3).如果顶层启动加载无法完成加载请求,子类加载尝试去加载,如果连最初发起加载请求加载也无法完成加载请求时,将会抛出ClassNotFoundException,不再调用其子类加载去进行加载...双亲委派模式加载机制优点是java加载一起具备了一种带优先层次关系,越是基础,越是被上层加载进行加载,保证了java程序稳定运行。

55830

阅读 Flink 源码前必知必会 - SPI 和 ClassLoader

如果加载还存在其父加载,则进一步向上委托,依次递归,请求最终将到达顶层启动加载。...如果加载可以完成加载任务,就成功返回,倘若加载无法完成此加载任务,子加载才会尝试自己去加载,这就是双亲委派模式。 双亲委派模式好处是什么?...第一,Java 随着它加载一起具备了一种带有优先层次关系,通过这种层次关系可以避免重复加载,当加载已经加载过一次时,没有必要子类再去加载一次。...加载时候,首先判断不是已经被加载过了,如果没有被加载过,则看自己加载不是为空。...如果不为空,则使用加载加载;如果加载为空,则使用 BootStrapClassLoader 加载最后,如果还是没有加载到,则使用 findClass 来加载

1.2K20

JDK源码解析之 java.lang.ClassLoader

如果是第一次加载(向上传递任务),分为两种:1、parent != null ;当前加载不是BootStrapClassLoader,直接调用加载loadClass来加载该类。...其中Bootstrap ClassLoader是Extention ClassLoader加载,Extention ClassLoader是APP ClassLoader加载,但不是父子类关系...判断两个不是同一个,除了名字相同还要是加载相同才可以。 三、拓展 1、加载过程 一个在被使用之前,会经历class文件生成—>加载—>连接—>初始化等阶段。...当一个加载想要加载一个时,它会先把该加载任务委托给它加载(parent),不是自己先尝试加载,以此类推,加载又会委托自己加载去执行加载任务,直到最顶层BootStrapClassLoader...,以此类推,直到某个加载在自己命名空间中找到该类Class文件,并加载到内存中 可以看出,从下往上传递任务,秉着优先让上层加载加载原则,从上到下传递任务,秉着优先让自己去加载原则 好处

32230
领券