java JVM-自定加密和解密类加载器

简单加密解密(取反)操作
int a=3; //00000011
//^异或操作,相同为1,0xff,表示一个十六进制数,表示a和1111 1111 进行异或操作,结果为1111 1100
System.out.println(Integer.toBinaryString(a^0xff)); //对二进制取反,转换成二进制字符串
//ff表示1111 1111,f=15

public class Lockloader {

public static void main(String[] args) {

    encrpt("d:/myjava/HelloWorld.class","d:/myjava/com/sxt/in/HelloWorld.class");
}

public static void encrpt(String src,String dest)
{
    FileInputStream fis=null;
    FileOutputStream fos=null;
    try
    {
        fis=new FileInputStream(src);
        fos=new FileOutputStream(dest);

        int len=-1;
        while((len=fis.read())!=-1) //会自动读取一个字节的数据
        {
            fos.write(len^0xff);
        }
    }catch(IOException e)
    {
        e.printStackTrace();
    }finally {

        try {
            if(null!=fis)
            {
                fis.close();
            }
        }catch(IOException e)
        {
            e.printStackTrace();
        }
        try {
            if(null!=fos)
            {
                fos.close();
            }
        }catch(IOException e)
        {
            e.printStackTrace();
        }

    }
}
}

加载加密后的class字节码的类加载器

public class DecrptClassLoader extends ClassLoader{

private String dir;
public DecrptClassLoader(String dir)
{
    this.dir=dir;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException
{
    Class<?> c=findLoadedClass(name);

    if(null!=c)
    {
        return c;
    }else
    {
        ClassLoader parent=this.getParent();
        try {
        c=parent.loadClass(name);
        }catch(Exception e)
        {
            //e.printStackTrace();
        }
        if(c!=null)
        {
            return c;
        }else
        {
            byte[] data=getData(name);

            if(data==null)
            {
                throw new ClassNotFoundException();
            }else
            {
                c=defineClass(name,data,0,data.length);
                System.out.println("yes");
            }
        }
    }
    return c;
}

private byte[] getData(String classname)
{
    String path=dir+"/"+classname.replace(‘.‘, ‘/‘)+".class";

    InputStream is=null;
    ByteArrayOutputStream bos=new ByteArrayOutputStream();
    try {
        is=new FileInputStream(path);
        //解密操作

        int len=-1;
        while((len=is.read())!=-1)
        {
            bos.write(len^0xff);  //取反解密
        }

        return bos.toByteArray();
    }catch(IOException e)
    {
        e.printStackTrace();
        return null;
    }finally {
        try {
            if(null!=is)
            {
                is.close();
            }
        }catch(IOException e)
        {
            e.printStackTrace();
        }
        try {
            if(null!=bos)
            {
                bos.close();
            }
        }catch(IOException e)
        {
            e.printStackTrace();
        }
    }

}
}

加密后的class文件加载

/*  //正常加载器无法加载,因为读取的数据取反操作
    Loader loader =new Loader("d:/myjava");
    Class<?> c=loader.loadClass("com.sxt.in.HelloWorld");

    System.out.println(c);   */

    //使用解密加载器
    DecrptClassLoader dloader=new DecrptClassLoader("d:/myjava");
    Class<?> c=dloader.loadClass("com.sxt.in.HelloWorld");

    System.out.println(c.getClassLoader());    

原文地址:https://blog.51cto.com/14437184/2439462

时间: 2024-08-01 16:33:09

java JVM-自定加密和解密类加载器的相关文章

JAVA WEB实现前端加密后台解密

最近在研究登陆密码的加密,下边上具体代码,只是给出核心代码,具体的代码视业务而定吧,给位有什么问题或者意见请留言. 加密方法用的是AES-128-CBC,BASE64用的是org.apache.commons.codec.binary.Base64 JS代码: var password = "1234567890,./"; var key = CryptoJS.enc.Utf8.parse("0102030405060708");//密钥,128位加密密钥为16位

JAVA实现AES的加密和解密算法

原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * AES 是一种可逆加密算法,对用户的敏感信息加密处理 * 对原始数据进行AES加密后,在进行Base6

JAVA中AES对称加密和解密

AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Ba

JVM(三)——类结构与类加载器

类文件结构 class文件是一个8位的字节流.所有16.32.64位数据以连续的数个8位,以big-endian形式存储. Class文件中数据类型 u1.u2.u4代表无符号1.2.4字节数据. 0--*类型数据将会以table的形式表示. ClassFile结构 u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1];

(转)《深入理解java虚拟机》学习笔记8——Tomcat类加载器体系结构

Tomcat 等主流Web服务器为了实现下面的基本功能,都实现了不止一个自定义的类加载器: (1).部署在同一个服务器上的两个web应用程序所使用的java类库可以相互隔离. (2).部署在同一个服务器上的两个web应用程序所使用的java类库可以相互共享. (3).许多Web服务器本身使用java语言实现,因此服务器所使用的类库应与应用程序的类库相互独立. (4).支持JSP应用的Web服务器,需要支持HotSwap功能,因为JSP文件最终是被编译为java的servlet来运行的,当修改JS

asp.net和java这间des加密和解密

最近有个新项目用java做的,老项目是asp.net,接口传输需要des加解密,网上查了些资料,大多数不能拿来就用,自己经过调试加工了一下,具体代码如下: 密钥一定是8位 /// <summary> /// 利用DES加密算法加密字符串(可解密) /// </summary> /// <param name="pToEncrypt">被加密的字符串</param> /// <param name="key">

Java虚拟机JVM学习05 类加载器的父委托机制

Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap) 扩展类加载器(Extension) 系统类加载器(System) 2.用户自定义的类加载器: java.lang.ClassLoader的子类,用户可以定制类的加载方式. JVM自带的加载器 Java虚拟机自带了以下几种加载器. 1.根(Bootstrap)类加载器: 该加载器没有父加载器. 它

C# 加密(Encrypt) 解密(Decrypt) 操作类 java与 C# 可以相互加密解密

public sealed class EncryptUtils { #region Base64加密解密 /// <summary> /// Base64加密 /// </summary> /// <param name="input">需要加密的字符串</param> /// <returns></returns> public static string Base64Encrypt(string input)

JVM类加载器及Java类的生命周期

预定义类加载器(三种): 启动(Bootstrap)类加载器: 是用本地代码实现的类装入器,它负责将<Java_Runtime_Home>/lib下面的类库加载到内存中(比如rt.jar).由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作.扩展扩展(Extension)类加载器: 是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的.它负责将< Java_R