编写和测试自己编写的解密类加载器

    由于自己编写的class类加密对类进行加密之后,系统的类加载器是无法加载的,此时需要自己编写一个简单的类加载器对自己的类进行加载操作,自己编写的类加载器必须继承ClassLoader,继承的作用是把自己的类加载器挂载到父类的加载器上面,然后覆盖父类的findClass方法

package javatribe.fts.generic;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class MyClassLoader extends ClassLoader{

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
        //源文件路径名
		String srcPath=args[0];
		//目标路径名
        String destDir=args[1];
        //获得输入流
        FileInputStream fis=new FileInputStream(srcPath);
        //获得目标的文件名,即加密之后的文件名称
        String destFileName=srcPath.substring(srcPath.lastIndexOf('\\')+1);
       //目标的路径,即加密之后文件传输到的路径
        String destPath=destDir+'\\'+destFileName;
        //输出流
        FileOutputStream fos=new FileOutputStream(destPath);
        //进行加密运算
        cypher(fis,fos);
        fis.close();
        fos.close();
	}
	private static void cypher(InputStream ips,OutputStream ops) throws Exception{
		int b=-1;
		while((b=ips.read())!=-1){
			ops.write(b ^ 0xff);
		}
	}
	private String classDir;
	@Override
	protected Class<?> findClass(String name) throws ClassNotFoundException {
		// TODO Auto-generated method stub
		String classFiledName=classDir +"\\"+ name.substring(name.lastIndexOf('.')+1) + ".class";
		try {
			FileInputStream fis=new FileInputStream(classFiledName);
		    ByteArrayOutputStream bos=new ByteArrayOutputStream();
		    cypher(fis,bos);
		    fis.close();
		    byte[] bytes=bos.toByteArray();
		    return defineClass(bytes, 0,bytes.length);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return super.findClass(name);
	}
	public MyClassLoader(){
		
	}
	public MyClassLoader(String classDir){
		this.classDir=classDir;
	}
  
}


编写一个测试

/System.out.println(new ClassLoaderAttachment().toString());
	    Class clazz=new MyClassLoader("ftslib").loadClass("javatribe.fts.generic.ClassLoaderAttachment");
		Date d1=(Date) clazz.newInstance();
		System.out.println("!!!!!!!!!!"+d1);

如果把加密之后的ClassLoaderAttachment.class文件放置到和其它.class文件相同的目录

,此时会报错,因为系统的类加载器在加载我的.class的时候是无法解析的。那么为什么我的类加载器找到了自己加密的.class文件不进行加载,反而交给父类加载器,这就要考虑到加载器的优先级问题了,这就是类加载器的委托机制。当父类加载器找到了ClassLoaderAttachment.class会进行加载,这时候就会出错把ClassLoaderAttachment.class
删除了,父类加载器就找不到ClassLoaderAttachment.class,反而自己的加载器找到ClassLoaderAttachment.class,所以进行加载,这时候就会输出正确的结果。

   以上就是自己简单的类加载器,对自己加密之后的.class进行解密然后加载运行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章