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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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());    

以上是关于java JVM-自定加密和解密类加载器的主要内容,如果未能解决你的问题,请参考以下文章

JVM进阶之自定义类加载器

JVM进阶之自定义类加载器

JVM学习记录-类加载器

JVM -- 类加载器;双亲委派机制;线程上下文类加载器

JVM -- 类加载器;双亲委派机制;线程上下文类加载器

JVM探究之 —— 类加载器-双亲委派模型