【发布时间】:2015-05-09 10:46:28
【问题描述】:
我有一个正在编写的程序,我试图获取一个加密的类文件,在加载到内存时解密它(而不是在驱动器上解密它),并执行部分类。我可以用静态方法做到这一点,但是,我想知道是否可以做到这一点
我也想说明一下,我没有写任何恶意的东西。我实际上是在尝试理解反射,并可能将其用作源代码保护的一种形式。对于我的概念证明,有效负载似乎是一个令人满意的名称。
@SuppressWarnings("resource")
Scanner scan = new Scanner(System.in);
System.out.print("Enter password:");
String pass = scan.nextLine();
MessageDigest md5 = MessageDigest.getInstance("md5");
byte[] keyBytes = md5.digest(pass.getBytes("UTF-8"));
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
InputStream in = Master.class.getClassLoader().getResourceAsStream("Payload\\ENC\\Payload.class");
int read = 0;
byte[] buffer = new byte[1024];
ByteArrayOutputStream boas = new ByteArrayOutputStream();
while ((read = in.read(buffer)) != -1)
{
boas.write(buffer, 0, read);
}
byte[] encrypted = boas.toByteArray();
try
{
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5padding");
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
byte[] decrypted = cipher.doFinal(encrypted);
PayloadLoader loader = new PayloadLoader(Thread.currentThread().getContextClassLoader(), decrypted);
Class<?> c = loader.loadClass("Payload.Payload");
Method main = c.getMethod("main", String[].class);
main.invoke(null, (Object) args);
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("Invalid Password");
}
上面是它被加载到内存中并执行的地方。然而,我不想调用 Main 方法,而是想创建这个线程的一个实例,然后启动它。下面是基本线程本身
private Thread t;
private String threadName;
Payload(String name){
threadName = name;
if(config.DEBUG)
System.out.println("Creating Thread - " + threadName);
}
public void setName(String name){
threadName = name;
}
public void run()
{
if(config.DEBUG)
System.out.println("Running Thread - " + threadName);
}
public void start()
{
if(config.DEBUG)
System.out.println("Starting Thread - " + threadName);
if(t == null)
{
t = new Thread (this, threadName);
t.start();
}
}
我的问题是,是否可以创建这个对象并启动线程本身?这是我想要完成的主要事情,因为我希望拥有这个多线程。
【问题讨论】:
标签: java multithreading encryption reflection introspection