⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decryptclassloader.java

📁 精通tomcat书籍原代码,希望大家共同学习
💻 JAVA
字号:
import java.io.*; 
import java.security.*; 
import java.lang.reflect.*; 
import javax.crypto.*; 
import javax.crypto.spec.*; 

public class DecryptClassLoader extends ClassLoader { 
	// 这些对象在构造函数中设置,以后loadClass()方法将利用它们解密类 
	private SecretKey key; 
	private Cipher cipher; 

	// 构造函数:设置解密所需要的对象 
	public DecryptClassLoader(SecretKey key) throws GeneralSecurityException, IOException { 
		this.key = key; 
		String algorithm = "DES"; 
		SecureRandom sr = new SecureRandom(); 
		System.err.println("[DecryptStart: creating cipher]"); 
		cipher = Cipher.getInstance(algorithm); 
		cipher.init(Cipher.DECRYPT_MODE, key, sr); 
	} 

	public Class loadClass(String name, boolean resolve) throws ClassNotFoundException { 
		try { 
			// 要创建的Class对象 
			Class clasz = null; 

			// 必需的步骤1:如果类已经在系统缓冲之中不必再次装入它 
			clasz = findLoadedClass(name); 

			if (clasz != null) 
				return clasz;  

			// 读取经过加密的类文件 
			byte classData[] = DealFile.readByteofFile(name+".class"); 

			if (classData != null) { 
				// 解密数据
				byte decryptedClassData[] = cipher.doFinal(classData); 

				// 再把它转换成一个类
				clasz = defineClass(name, decryptedClassData, 0, decryptedClassData.length); 
				System.err.println("[DecryptClassLoader: decrypting class "+name+"]"); 
			} 

			// 必需的步骤2:如果上面没有成功,尝试用默认的ClassLoader装入它 
			if (clasz == null) 
				clasz = findSystemClass(name); 

			// 必需的步骤3:如有必要,则装入相关的类 
			if (resolve && clasz != null) 
				resolveClass(clasz); 

			// 把类返回给调用者 
			return clasz; 
		} catch(GeneralSecurityException gse) { 
			throw new ClassNotFoundException( gse.toString()); 
		} 
	} 

	// 读入密匙,解密类,通过Java Reflection API调用应用实例的main方法 
	static public void main(String args[]) throws Exception { 
		String keyFilename = args[0]; 
		String appName = args[1]; 

		// 这些是传递给应用本身的参数 
		String realArgs[] = new String[args.length-2]; 
		System.arraycopy(args, 2, realArgs, 0, args.length-2); 

		// 读取密匙 
		System.err.println("[DecryptClassLoader: reading key]"); 
		byte rawKey[] = DealFile.readByteofFile(keyFilename); 
		DESKeySpec dks = new DESKeySpec(rawKey); 
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); 
		SecretKey key = keyFactory.generateSecret(dks); 

		// 创建解密的ClassLoader 
		DecryptClassLoader dr = new DecryptClassLoader(key); 

		// 创建应用主类的一个实例,通过ClassLoader装入它 
		System.err.println("[DecryptClassLoader: loading "+appName+"]"); 
		Class clasz = dr.loadClass(appName); 

		// 最后,通过Reflection API调用应用实例的getInfor()方法
		String proto[] = new String[1]; 
		Class mainArgs[] = { (new String[1]).getClass() }; 
		Method main = clasz.getMethod("main", mainArgs); 

		// 创建一个包含main()方法参数的数组 
		Object argsArray[] = { realArgs }; 
		System.err.println("[DecryptClassLoader: running "+appName+".main()]"); 

		// 调用main() 
		main.invoke(null, argsArray); 
	} 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -