sun.misc.Unsafe
java底层的某个类,属于sun.* API中的类,做一些比较底层的操作,可以有一些神奇的利用姿势。
Unsafe是内部专用 API,获取Unsafe对象的方法:
不能继承
不能被new
使用反射实例化sun.misc.Unsafe
Field f = Unsafe.class.getDeclaredField("theUnsafe"); //Internal reference
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
@CallerSensitive // 获取Unsafe无参构造方法 Constructor constructor = Unsafe.class.getDeclaredConstructor(); // 修改构造方法访问权限 constructor.setAccessible(true); // 反射创建Unsafe类实例,等价于 Unsafe unsafe1 = new Unsafe(); Unsafe unsafe1 = (Unsafe) constructor.newInstance();
sun.misc.Unsafe的使用
1.突破限制创造实例
allocateInstance方法无视构造方法创建实例
2.直接获取内存,实现浅克隆
3.读取密码
https://blog.csdn.net/fenglibing/article/details/17138079
当限制了classloader 无法在jvm注册类,unsafe.defineclass也可
public native Class defineClass(String var1, byte[] var2, int var3, int var4);
public native Class<?> defineClass(String var1, byte[] var2, int var3, int var4, ClassLoader var5, ProtectionDomain var6);