java - 如何将类加载到正在运行的 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
错误。
你能告诉我如何解决这个问题吗?这对我有很大帮助!谢谢。
解决方案
当一个类中的引用被解析时,它的定义类加载器被使用。您的代码标识了要检测的类的定义类加载器,然后创建一个新的类加载器,将其用作父加载器。
当您要求新的加载器加载您的类时,这些类很可能已加载,但它们只能通过您新创建的URLClassLoader
. 它们对其他类加载器不可用。
使用包含对其他类的新依赖项的代码来检测类可能非常棘手。如果应用程序类加载器已经加载了检测类,您可以使用Instrumentation.appendToSystemClassLoaderSearch(JarFile)
将您的类添加Cheat.jar
到搜索路径中,以使这些类可用。
对于由其他加载器加载的类,事情变得更加复杂。如果它们遵循标准的父委托模型,您可以使用appendToBootstrapClassLoaderSearch(JarFile)
使您的类可用于所有这些类加载器。
对于不遵循委托模型的加载器,您将不得不更深入地挖掘,例如使用具有访问覆盖的反射,以调用defineClass
它以使类在该范围内可用。
推荐阅读
- javascript - 可以循环 setTimeout 以在每次运行时延迟循环吗?
- c - 为什么 bpf 代码无法访问 cpumap_enqueue_ctx 的前 8 个字节?
- sql - 如何有效地将数据存储在文件中?
- r - 仅选择月份和年份
- java - 如何为 XtextGenerator 指定 Xtext 语言生成的顺序?
- sql - 如何在一侧有额外字符的字段上连接两个表?
- javascript - 如何在进入 CalendarCont 之前检测 OnClick 是否完成?
- android - 如何通过单击按钮将选定日期(仅第一个和最后一个)从一个活动发送到另一个活动中的文本视图?
- javascript - 从字符串创建数组
- ruby - 使用 Ruby 2.6 隐藏命令的输出