您的位置:首页 > 编程语言 > Java开发

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

2019-09-19 21:37 2041 查看

简单加密解密(取反)操作
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());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: