Java类加载器 自定义加密解密

如果想看一下简单的类加载器怎么自定义,可以跳转简单自定义类加载器

自定义加密解密类加载器
测试简单的class文件加密解密(取反操作)。取反加密只是一个简单示例。

加密工具类(字节按位取反)

package com.feng.ClassTest;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 加密工具类
 * @author feng
 *
 */

public class EncrpUtil {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		encrpt("E:\\myjava\\HelloWorld.class", "E:\\myjava\\temp\\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 temp = -1;
			while((temp = fis.read()) != -1) {
				fos.write(temp^0xff);	//异或,每个字节按位取反
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			
			try {
				if(fis != null) {
					fis.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			try {
				if(fos != null) {
					fos.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
}

解密类加载器

package com.feng.ClassTest;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 加载文件系统加密后的class字节码的类加载器
 * @author feng
 *
 */

public class DecreptClassLoader extends ClassLoader {
	
	private String rootDir;
	
	public DecreptClassLoader(String rootDir) {
		this.rootDir = rootDir;
	}
	
	@Override
	protected Class<?> findClass(String name) throws ClassNotFoundException {
		
		Class<?> c = null;
		
		byte[] classData = getClassData(name);	// 自定义方法获取类字节码
		if(classData == null) {
			throw new ClassNotFoundException();	// 如果字节数组为空,抛出异常
		} else {
			try {
				c = defineClass(name, classData, 0, classData.length);
			} catch (ClassFormatError e){	// 加载错误
				e.printStackTrace();
				c = null;
			}

		}
		
		return c;
		
	}
	
	private byte[] getClassData(String classname) {
		// 拼出类class文件地址
		String path = rootDir + "/" + classname.replace('.', '/') + ".class";
		
		InputStream fis = null;
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		try {
			fis = new FileInputStream(path);
			
			int temp = -1;
			while((temp = fis.read()) != -1) {
				baos.write(temp^0xff);	//异或,每个字节按位取反
			}
			
			return baos.toByteArray();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			return null;
		} finally {
			
			try {
				if(fis != null) {
					fis.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			try {
				if(baos != null) {
					baos.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
		
	}
	
}

测试自定义解密类加载器

package com.feng.ClassTest;

public class Demo04 {
	
	public static void main(String[] args) throws ClassNotFoundException {

		//加密后的class文件,正常的类加载器 无法加载,会报FormatError错误
		//FileSystemClassLoader loader = new FileSystemClassLoader("E:\\myjava\\temp");
		//Class<?> c = loader.findClass("HelloWorld");
		//System.out.println(c);
		
		// 使用解密类加载器
		DecreptClassLoader loader = new DecreptClassLoader("E:\\myjava\\temp");
		Class<?> c = loader.loadClass("HelloWorld");
		System.out.println(c);
		
	}

}
发布了59 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/dandanfengyun/article/details/97484809