java 自定义加密_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());

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值