У меня есть программа, которую я пишу, где я пытаюсь взять зашифрованный файл класса, дешифровать его при загрузке в память (не расшифровывать его на диске) и выполнять части класса. Я могу сделать это со статическими методами, однако, я бы хотел узнать, возможно ли это сделать.Возможно создание объекта из отражения класса в памяти?
Я также хотел просто указать, что я не пишу ничего злонамеренного. Я на самом деле делаю это как попытку понять рефлексию и, возможно, использую ее как форму защиты исходного кода. Полезная нагрузка просто показалась приятным именем для моего доказательства концепции.
@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();
}
}
Мой вопрос, возможно ли было бы создать этот объект, и начать саму нить? Это главное, что я пытаюсь выполнить, поскольку я надеюсь, что это многопоточное.
Полезная нагрузка не распознается как тип объекта при установке типа конструктора. Я чувствую, что мне нужно отразить его, и я не знаю, как это сделать. Но это привело меня гораздо дальше. Любая идея, как заставить его ссылаться на класс полезной нагрузки в типе конструктора? – Kristoff
@Kristoff Вы можете создать объект, но вы не можете использовать имя класса как тип исходного текста, если он не будет присутствовать на исходном CLASSPATH. Вам нужно обратиться к объекту через некоторый тип, который * * доступен, например. Runnable, Task и т. Д. – EJP
@EJP, хороший, не заметил этого. –