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-自定加密和解密类加载器的主要内容,如果未能解决你的问题,请参考以下文章