码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-09-20 00:14:16      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:载器   output   prot   字节码   src   world   tac   加密和解密   string   

简单加密解密(取反)操作
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-自定加密和解密类加载器

标签:载器   output   prot   字节码   src   world   tac   加密和解密   string   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!