【问题标题】:Possible to create object from reflection of a class in memory?可以从内存中的类的反射创建对象吗?
【发布时间】: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


    【解决方案1】:

    Class 类有 getConstructors 可以使用的方法:

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

    Payload 类还需要实现代码类路径中的共享接口,以便转换和调用start 方法。我在上面的例子中使用了虚构的PayloadStarter

    【讨论】:

    • 在设置构造函数类型时,Payload 未被识别为对象类型。我觉得我必须反映参考它,我不确定如何做到这一点。但这让我走得更远。知道如何让它在构造函数类型中引用有效负载类吗?
    • @Kristoff 您可以创建对象,但不能将类名用作源文本中的类型,除非它出现在原始 CLASSPATH 中。您需要通过某种 is 可用的类型来引用对象,例如Runnable、Task等
    • @EJP,不错,没发现。
    • 唯一的问题是,我仍然得到这个... java.lang.NoSuchMethodException: Payload.Payload.(java.lang.String) at java.lang.Class.getConstructor0 (Unknown Source) at java.lang.Class.getConstructor(Unknown Source) at Payload.Master.main(Master.java:61)
    • 是的,上面的异常是在尝试创建构造函数对象时抛出的。我一直在做研究,并尝试了一些东西,例如使用默认构造函数,但它仍然会被抛出。
    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 2023-02-14
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多