unsafe是jdk里面非常有意思的函数,不仅仅是名字。具体功能大家可以搜一下看看,简单来说就是,这个类提供了直接操作硬件的方法。
我这边简单利用unsafe的putObject方法,实现一次类混淆,有点儿意思。
代码如下:
Dingo.java : (作用是跑一个计算器)
package ding.yang.controller;
import java.io.IOException;
import java.io.Serializable;
public class Dingo implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public void fuck() {
ProcessBuilder pb = new ProcessBuilder("calc");
try {
pb.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Yang.java: (作用是跑一个记事本)
package ding.yang.controller;
import java.io.IOException;
import java.io.Serializable;
public class Yang implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public void fuck() {
ProcessBuilder pb = new ProcessBuilder("notepad");
try {
pb.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Hello.java:
package ding.yang.controller;
public class Hello {
public Dingo dingo;
public Hello(Dingo dingo){
this.dingo = dingo;
}
}
接着利用putObject,将hello.java类中的dingo这个field,替换为yang.java
package ding.yang.controller;
import java.io.IOException;
import java.lang.reflect.Field;
import java.security.AllPermission;
import java.security.ProtectionDomain;
import sun.misc.Unsafe;
public class TestUnsafe {
public static void main(String[] avgs) throws NoSuchFieldException,
SecurityException, IllegalArgumentException,
IllegalAccessException, IOException {
// 获取unsafe 的实例
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
Unsafe unsafe = (Unsafe) theUnsafe.get(null);
Hello hello = new Hello(new Dingo());
Yang yang = new Yang();
Field f = hello.getClass().getDeclaredField("dingo");
unsafe.putObject(hello, unsafe.objectFieldOffset(f), yang);
hello.dingo.fuck(); // 这里是弹计算器呢还是记事本呢?
}
}
总结:
1、上述代码最后是弹出了记事本,因为我们采用直接操作内存对象的方式,将hello类中的dingo对象,替换成了yang对象。
2、还有一个需要注意的点是,unsafe实例并不能直接获取,因为在unsafe中,判断了当前的classloader如果不是null,也就是root的classloader,会抛出一个securityexception异常,所以我们利用反射的方式,将private置为public,然后获取
3、上述代码当然只能在trust code环境里面运行了。
分享到:
相关推荐
JDK8中sun.misc包下的UnSafe类,想查看源码的就拿走,没积分的请与我联系!xtfggef@gmail.com
在Java编程中,sun.misc.UnSafe类是一个非常特殊的存在。这个类在JDK8中扮演着一个核心的角色,它提供了对Java语言规范中未公开的底层操作的访问。尽管UnSafe类并非设计为公共API的一部分,但它因其强大的功能而被...
在Java编程语言中,`sun.misc.Unsafe`类是一个神秘而强大的工具,它提供了对内存的直接操作和访问,绕过了Java的一些安全限制。这个类通常不被推荐在生产环境中直接使用,因为它的使用涉及到底层内存操作,可能会...
最近项目实验发现导入工具程序后项目有错,查看发现sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用,找不到相应的类。 二、原因分析 冲浪后发现JDK中的lib\tools.jar和JRE中的lib\rt.jar已从Java SE 9中...
在Java编程语言中,`sun.misc.BASE64Encoder`和`BASE64Decoder`是用于进行Base64编码和解码的内部类,它们属于`sun.misc`包,这是一个非公开(非标准)的Java库。`sun.misc`包中的类主要用于JVM内部使用,因此在官方...
sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及...
`sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`就是这样的两个类,它们分别用于Base64编码和解码。 Base64是一种用于将二进制数据转换为可打印ASCII字符的编码方式,常用于在网络上传输二进制数据,如电子...
在本例中,`sun.misc.BASE64Decoder.jar`可能包含`BASE64Decoder`和`BASE64Encoder`类的实现,供那些仍需使用这些非标准组件的项目使用。 总的来说,尽管`sun.misc.BASE64Decoder`和`BASE64Encoder`在某些老项目中...
sun.misc.BASE64Encoder找不到jar包的解决方法? 在MyEclipse中编写Java代码时,用到了BASE64Decoder,import sun.misc.BASE64Decoder;可是Eclipse提示: Access restriction: The type BASE64Decoder is not ...
在Java编程语言中,`sun.misc.BASE64Encoder` 和 `sun.misc.BASE64Decoder` 是两个用于Base64编码和解码的内部类,它们位于`sun.misc`包下。Base64是一种用于在网络上传输二进制数据的文本编码方式,它将任意的字节...
unsafe-helper-包含一些简单的方法,这些方法使使用sun.misc.Unsafe更容易。 unsafe-collection-在ArrayList上建模的示例列表,该列表不存储对集合内对象的引用,而是直接将元素复制到列表中。 这有一些有趣的特性...
sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar
Java中的`sun.misc.Unsafe`类是一个特殊的存在,它提供了对Java语言规范之外的底层操作的访问。这个类主要用于优化性能和实现一些JVM级别的功能,但同时也因为其潜在的安全风险和不稳定因素,通常不推荐在常规编程中...
在Java编程语言中,`sun.misc`包是一个非公开(internal)且不稳定的包,它包含了一些Sun Microsystems在开发Java时使用的内部实现类和工具。这个包中的类并不对外公开,因此在正式的开发中不推荐直接使用。然而,...
Intellij-解决报错:import sun.misc.BASE64Decoder无法找到 报错原因:JDK从1.8升级到9.0.1后sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用 sun.misc.BASE64Decoder
java开发 sun.misc.BASE64Decoder.jar包下载 java开发 sun.misc.BASE64Decoder.jar包下载
在Java编程语言中,`sun.misc.BASE64Decoder`是一个内置的类,它主要用于将Base64编码的数据解码为原始字节。Base64是一种常见的数据编码方式,尤其在网络传输或者存储二进制数据时,因为许多文本格式(如JSON、XML...
在Java编程中,`sun.misc.BASE64Encoder` 类曾是Java标准库早期版本中用于进行Base64编码的一个工具类。然而,由于这个类属于Sun Microsystems的内部实现细节,自Java 9开始,它被标记为废弃,并在后续版本中逐步...
Base64算法的加密解密都是使用sun.misc包下的BASE64Encoder及BASE64Decoder来进行的,例如Base64 和 Base64URL等需要依赖它
在Java编程中,`sun.misc.BASE64Decoder`是Java 7版本中一个用于解码Base64编码的数据的类。Base64是一种广泛使用的编码方式,它将任意二进制数据转换为可打印的ASCII字符,通常用于在网络上传输或存储包含非ASCII...