2015-03-08 2 views
0

У меня есть программа, которую я пишу, где я пытаюсь взять зашифрованный файл класса, дешифровать его при загрузке в память (не расшифровывать его на диске) и выполнять части класса. Я могу сделать это со статическими методами, однако, я бы хотел узнать, возможно ли это сделать.Возможно создание объекта из отражения класса в памяти?

Я также хотел просто указать, что я не пишу ничего злонамеренного. Я на самом деле делаю это как попытку понять рефлексию и, возможно, использую ее как форму защиты исходного кода. Полезная нагрузка просто показалась приятным именем для моего доказательства концепции.

@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(); 
    } 
} 

Мой вопрос, возможно ли было бы создать этот объект, и начать саму нить? Это главное, что я пытаюсь выполнить, поскольку я надеюсь, что это многопоточное.

ответ

2

Class класса имеет getConstructors метод, который вы можете использовать:

Constructor<?> constructor = c.getConstructor(String.class); 
Object payload = constructor.newInstance("ThreadName"); 
((PayloadStarter) payload).start(); 

Payload класса также будет необходимо реализовать общий интерфейс, который находится в пути к классам коды для того, чтобы бросить и вызвать метод start. Я использовал фиктивный PayloadStarter в приведенном выше примере

+0

Полезная нагрузка не распознается как тип объекта при установке типа конструктора. Я чувствую, что мне нужно отразить его, и я не знаю, как это сделать. Но это привело меня гораздо дальше. Любая идея, как заставить его ссылаться на класс полезной нагрузки в типе конструктора? – Kristoff

+1

@Kristoff Вы можете создать объект, но вы не можете использовать имя класса как тип исходного текста, если он не будет присутствовать на исходном CLASSPATH. Вам нужно обратиться к объекту через некоторый тип, который * * доступен, например. Runnable, Task и т. Д. – EJP

+0

@EJP, хороший, не заметил этого. –

 Смежные вопросы

  • Нет связанных вопросов^_^