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());
原文作者:wx5d21d5e6e5ab1
原文地址: https://blog.51cto.com/14437184/2439462
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.51cto.com/14437184/2439462
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章