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());    

猜你喜欢

转载自blog.51cto.com/14437184/2439462
今日推荐