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());
相关文章推荐
- 222_尚学堂_高淇_java300集最全视频教程_JVM核心机制_深入类加载器_自定加密解密类加载器
- 【Java高级】JVM内存区域模型和加载过程
- JVM系列:四、Java类加载机制总结
- Java中class是如何加载到JVM中的(Class.forName("name")和ClassLoader.loadClass("name")的区别)
- 从JVM分析Java的类的加载和卸载机制
- Java JVM:编译加载机制与自定义类加载器
- java 类加载过程、JVM -verbose参数详解
- JVM——Java类加载机制总结
- Java提高篇——JVM加载class文件的原理机制
- Java原理 JVM加载class文件的原理机制
- 223_尚学堂_高淇_java300集最全视频教程_JVM核心机制_线程上下文类加载器_web服务器类加载机制_OSGI技术模块开发原理介绍
- java加密class和解密class加载运行
- JVM(1):Java 类的加载机制
- 简单的C++加载jvm实现--简单的日志输出--JAVA端程序
- 【转】jvm系列(一):java类的加载机制
- java核心机制——jvm运行以及类加载全过程
- JVM(1):Java 类的加载机制
- Java类中各模块的加载顺序的JVM本质理解
- Java类中各模块的加载顺序的JVM本质理解
- JVM(1):Java 类的加载机制