首页 > 解决方案 > 如何将类加载到正在运行的 Java 程序中

问题描述

这是我的 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

错误。

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

标签: javacode-injectionagentjava-bytecode-asm

解决方案


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

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

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

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

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


推荐阅读