📄 decryptclassloader.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 + -