首页 > 其他分享 >打破双亲委派机制

打破双亲委派机制

时间:2023-02-22 12:22:43浏览次数:37  
标签:委派 fis String classPath 打破 双亲 new class name

再来一个沙箱安全机制示例,尝试打破双亲委派机制,用自定义类加载器加载我们自己实现的 java.lang.String.class

public class MyClassload1 extends ClassLoader {


private String classPath;

public MyClassload1(String classPath) {
this.classPath = classPath;
}

@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
Class<?> c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
if (!name.startsWith("com.example.jvm")) {
c = this.getParent().loadClass(name);
} else {
// If still not found, then invoke findClass in order
// to find the class.
long t1 = System.nanoTime();
c = findClass(name);
// this is the defining class loader; record the stats
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}

@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
String pacakge = name.replaceAll("\\.", "/");
FileInputStream fis = null;
byte[] data = null;
try {
fis = new FileInputStream(classPath + "/" + pacakge
+ ".class");
int len = fis.available();
data = new byte[len];
fis.read(data);
fis.close();
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
//defineClass将一个字节数组转为Class对象,这个字节数组是class文件读取后最终的字节数组。
return defineClass(name, data, 0, data.length);
}

public static void main(String[] args) throws Exception {
MyClassload1 myClassload = new MyClassload1("C:/test");
Class<?> aClass = myClassload.loadClass("java.lang.String");
Object user = aClass.newInstance();
Method sout = aClass.getDeclaredMethod("sout", null);
sout.invoke(user, null);
System.out.println(aClass.getClassLoader().getClass().getName());
}
}

标签:委派,fis,String,classPath,打破,双亲,new,class,name
From: https://www.cnblogs.com/avalanche/p/17143927.html

相关文章

  • 为什么要设计双亲委派机制
    为什么要设计双亲委派机制?沙箱安全机制:自己写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改避免类的重复加载:当父亲已经加载了该类时,就没有......
  • JAVA中使用最广泛的本地缓存?Ehcache的自信从何而来3 —— 本地缓存变身分布式集群缓存
    大家好,又见面了。本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。上......
  • 如何在 Golang 中打破一长行代码?
    这是StackOverflow上的一个问题,今天同事问我,我发现我也不知道。原问题译文:我不习惯看到超过80列的代码行。所以当我遇到这个时:err:=database.QueryRow("select*f......
  • JAVA 双亲委派与类加载器
    JAVA双亲委派与类加载器双亲委派虚拟机在加载类的过程中需要使用类加载器进行加载,而在Java中,类加载器有很多,那么当JVM想要加载一个.class文件的时候,到底应该由哪个类加......
  • 基于AD Event日志监测基于资源的约束委派攻击
    01、简介在获取到域控权限后,可以对krbtgt用户设置委派属性,以实现维持权限的目的。02、利用方式 (1)设置属性值并查询Set-ADUserkrbtgt-PrincipalsAllowedToDeleg......
  • 面试官:什么是双亲委派模型?
    双亲委派模型是Java类加载器的一种工作模式,通过这种工作模式,Java虚拟机将类文件加载到内存中,这样就保证了Java程序能够正常的运行起来。那么双亲委派模型究竟说的是啥......
  • JVM之类加载子系统与双亲委派机制
    JVM之类加载子系统与双亲委派机制一、类加载子系统1.类加载子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识,JVM并不是通过检查文件后缀是......
  • 类加载器和双亲委派机制
    类加载器类加载器可以分为三种:引导类加载器(根加载器BootstrapClassLoader):负责加载jre/rt.jar核心类库它本身不是java代码实现的,也不是ClassLoader的子类,获取该......
  • 域内委派攻击
    域委派是指,将域内用户的权限委派给服务账号,使得服务账号能以用户权限开展域内活动。利用委派可获取域管理员权限域委派主要分为三种:非约束性委派约束性委派基于......
  • 委派模式——从SLF4J说起
    作者:vivo互联网服务器团队-Xiongyangxin将某个通用解决方案包装成成熟的工具包,是每一个技术建设工作者必须思考且必须解决的问题。本文从业内流行的既有工具包入手,解......