【问题标题】:How can I load classes into an running Java Programm如何将类加载到正在运行的 Java 程序中
【发布时间】:2018-12-23 20:12:08
【问题描述】:

这是我的 Agent.jar 的代码

public class Agent
{

    public static void agentmain(String s, Instrumentation instrumentation)
    {
        try
        {
            ClassLoader classLoader = null;
            for (Class clazz : instrumentation.getAllLoadedClasses())
            {
                String className = clazz.getName();
                if (className.equalsIgnoreCase("ave")) /* Just a class from the running Programm */
                {
                    classLoader = clazz.getClassLoader();
                }
            }

            /* In the Cheat.jar are Classes which im trying to load */
            ClassLoader loader = URLClassLoader.newInstance(new URL[]{new URL("C:\\Users\\michi\\Desktop\\Injection\\Cheat.jar")}, classLoader);
            Class.forName("de.simplyblack.client.client.module.Category", true, loader);
            Class.forName("de.simplyblack.client.client.module.Module", true, loader);
            Class.forName("de.simplyblack.client.client.module.ModuleManager", true, loader);
        } catch (Throwable t)
        {
            t.printStackTrace();
        }
    }
}

我正在用一个额外的程序加载它。

 VirtualMachine virtualMachine = VirtualMachine.attach(id);
 virtualMachine.loadAgent(new File("C:\\Users\\michi\\Desktop\\Injection\\Client.jar").getAbsolutePath());
 virtualMachine.detach();

但这不起作用。

Later I visit an Class, and make an call for the ModuleManager class.

如果我注入它,我会得到一个

Class not found: de.simplyblack.client.client.module.ModuleManager

错误。

您能告诉我如何解决这个问题吗? 这对我有很大帮助! 谢谢。

【问题讨论】:

  • 这看起来不像minimal reproducible example。你没有显示如何你试图加载任何东西,或者它是如何不工作的。另外,这与汇编语言有什么关系? (assembly 标签。)这是 java-bytecode-asm 吗?
  • 是的,我会修复它。
  • 所有相关代码都应该发布在您的问题中,而不是链接中,最好是minimal reproducible example
  • 谢谢,我修好了。

标签: java code-injection agent java-bytecode-asm


【解决方案1】:

当一个类中的引用被解析时,它的定义类加载器被使用。您的代码标识了您要检测的类的定义类加载器,然后创建一个新的类加载器,将其用作父加载器。

当您要求新的加载器加载您的类时,这些类很可能加载,但它们只能通过您新创建的URLClassLoader 访问。它们不适用于其他类加载器。

使用包含对其他类的新依赖项的代码来检测类可能非常棘手。如果应用类加载器已经加载了检测类,您可以使用Instrumentation.appendToSystemClassLoaderSearch(JarFile) 将您的Cheat.jar 添加到搜索路径中,以使这些类可用。

对于由其他加载器加载的类,事情变得更加复杂。如果它们遵循标准的父委托模型,您可以使用appendToBootstrapClassLoaderSearch(JarFile) 使您的类可用于所有这些类加载器。

对于不遵循委托模型的加载器,您必须深入挖掘,例如使用具有访问覆盖的反射,在其上调用defineClass,使类在该范围内可用。

【讨论】:

    猜你喜欢
    • 2014-10-28
    • 2019-09-11
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多