`

利用sun.misc.Unsafe实现一次类混淆(Type Confusion)

阅读更多
   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类

    JDK8中sun.misc包下的UnSafe类,想查看源码的就拿走,没积分的请与我联系!xtfggef@gmail.com

    JDK8中sun.misc下UnSafe类源代码 UnSafe.java

    在Java编程中,sun.misc.UnSafe类是一个非常特殊的存在。这个类在JDK8中扮演着一个核心的角色,它提供了对Java语言规范中未公开的底层操作的访问。尽管UnSafe类并非设计为公共API的一部分,但它因其强大的功能而被...

    sun.misc.Unsafe源码

    在Java编程语言中,`sun.misc.Unsafe`类是一个神秘而强大的工具,它提供了对内存的直接操作和访问,绕过了Java的一些安全限制。这个类通常不被推荐在生产环境中直接使用,因为它的使用涉及到底层内存操作,可能会...

    sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用已解决

    最近项目实验发现导入工具程序后项目有错,查看发现sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用,找不到相应的类。 二、原因分析 冲浪后发现JDK中的lib\tools.jar和JRE中的lib\rt.jar已从Java SE 9中...

    sun.misc.BASE64Encoder源码及jar包

    在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包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及...

    sun.misc.BASE64Encoder.jar包

    `sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`就是这样的两个类,它们分别用于Base64编码和解码。 Base64是一种用于将二进制数据转换为可打印ASCII字符的编码方式,常用于在网络上传输二进制数据,如电子...

    sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;

    在本例中,`sun.misc.BASE64Decoder.jar`可能包含`BASE64Decoder`和`BASE64Encoder`类的实现,供那些仍需使用这些非标准组件的项目使用。 总的来说,尽管`sun.misc.BASE64Decoder`和`BASE64Encoder`在某些老项目中...

    sun.misc.base64decoder.jar下载

    sun.misc.BASE64Encoder找不到jar包的解决方法? 在MyEclipse中编写Java代码时,用到了BASE64Decoder,import sun.misc.BASE64Decoder;可是Eclipse提示:  Access restriction: The type BASE64Decoder is not ...

    sun.misc.BASE64Encoder 加密源码+完整包.rar

    在Java编程语言中,`sun.misc.BASE64Encoder` 和 `sun.misc.BASE64Decoder` 是两个用于Base64编码和解码的内部类,它们位于`sun.misc`包下。Base64是一种用于在网络上传输二进制数据的文本编码方式,它将任意的字节...

    unsafe:使用sun.misc.Unsafe的各种Java类

    unsafe-helper-包含一些简单的方法,这些方法使使用sun.misc.Unsafe更容易。 unsafe-collection-在ArrayList上建模的示例列表,该列表不存储对集合内对象的引用,而是直接将元素复制到列表中。 这有一些有趣的特性...

    sun.misc.BASE64Decoder.jar最新

    sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar

    Java中的魔法类:sun.misc.Unsafe示例详解

    Java中的`sun.misc.Unsafe`类是一个特殊的存在,它提供了对Java语言规范之外的底层操作的访问。这个类主要用于优化性能和实现一些JVM级别的功能,但同时也因为其潜在的安全风险和不稳定因素,通常不推荐在常规编程中...

    sun.misc.BASE64Decoder相关类

    在Java编程语言中,`sun.misc`包是一个非公开(internal)且不稳定的包,它包含了一些Sun Microsystems在开发Java时使用的内部实现类和工具。这个包中的类并不对外公开,因此在正式的开发中不推荐直接使用。然而,...

    sun.misc.BASE64Decoder.rar

    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.jar包下载

    sun.misc.BASE64Decoder

    在Java编程语言中,`sun.misc.BASE64Decoder`是一个内置的类,它主要用于将Base64编码的数据解码为原始字节。Base64是一种常见的数据编码方式,尤其在网络传输或者存储二进制数据时,因为许多文本格式(如JSON、XML...

    sun.misc.BASE64Encoder 找不到

    在Java编程中,`sun.misc.BASE64Encoder` 类曾是Java标准库早期版本中用于进行Base64编码的一个工具类。然而,由于这个类属于Sun Microsystems的内部实现细节,自Java 9开始,它被标记为废弃,并在后续版本中逐步...

    sun.misc.jar

    Base64算法的加密解密都是使用sun.misc包下的BASE64Encoder及BASE64Decoder来进行的,例如Base64 和 Base64URL等需要依赖它

    sun.misc.BASE64Decoder.zip

    在Java编程中,`sun.misc.BASE64Decoder`是Java 7版本中一个用于解码Base64编码的数据的类。Base64是一种广泛使用的编码方式,它将任意二进制数据转换为可打印的ASCII字符,通常用于在网络上传输或存储包含非ASCII...

Global site tag (gtag.js) - Google Analytics