編寫和測試自己編寫的解密類加載器

    由於自己編寫的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進行解密然後加載運行

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