注入 Jar 并在 运行 JVM 中替换 类
Inject Jar and replace classes in running JVM
我希望能够替换和添加一些 类 到已经 运行 的 JVM。我读到我需要使用 CreateRemoteThread
,但我并不完全明白。我阅读了有关如何执行此操作的 post (Software RnD),但我无法弄清楚它的作用和原因。除此之外,它只引入新的类,但不改变现有的。我怎样才能用 C++ 做到这一点?
您甚至不需要 CreateRemoteThread
- 有一种官方方法可以连接到远程 JVM 并使用 Attach API.
替换已加载的 类
你需要一个Java Agent that calls Instrumentation.redefineClasses.
public static void agentmain(String args, Instrumentation instr) throws Exception {
Class oldClass = Class.forName("org.pkg.MyClass");
Path newFile = Paths.get("/path/to/MyClass.class");
byte[] newData = Files.readAllBytes(newFile);
instr.redefineClasses(new ClassDefinition(oldClass, newData));
}
您必须添加 MANIFEST.MF
和 Agent-Class
属性并将代理打包到 jar 文件中。
然后使用动态附加将代理 jar 注入 运行 VM(进程 ID = pid
)。
import com.sun.tools.attach.VirtualMachine;
...
VirtualMachine vm = VirtualMachine.attach(pid);
try {
vm.loadAgent(agentJarPath, options);
} finally {
vm.detach();
}
the article 中有更多详细信息。
如果你坚持使用C/C++而不是JavaAPI,你可以看看我的jattach
工具
我希望能够替换和添加一些 类 到已经 运行 的 JVM。我读到我需要使用 CreateRemoteThread
,但我并不完全明白。我阅读了有关如何执行此操作的 post (Software RnD),但我无法弄清楚它的作用和原因。除此之外,它只引入新的类,但不改变现有的。我怎样才能用 C++ 做到这一点?
您甚至不需要 CreateRemoteThread
- 有一种官方方法可以连接到远程 JVM 并使用 Attach API.
你需要一个Java Agent that calls Instrumentation.redefineClasses.
public static void agentmain(String args, Instrumentation instr) throws Exception { Class oldClass = Class.forName("org.pkg.MyClass"); Path newFile = Paths.get("/path/to/MyClass.class"); byte[] newData = Files.readAllBytes(newFile); instr.redefineClasses(new ClassDefinition(oldClass, newData)); }
您必须添加
MANIFEST.MF
和Agent-Class
属性并将代理打包到 jar 文件中。
然后使用动态附加将代理 jar 注入 运行 VM(进程 ID =
pid
)。import com.sun.tools.attach.VirtualMachine; ... VirtualMachine vm = VirtualMachine.attach(pid); try { vm.loadAgent(agentJarPath, options); } finally { vm.detach(); }
the article 中有更多详细信息。
如果你坚持使用C/C++而不是JavaAPI,你可以看看我的jattach
工具