注入 Jar 并在 运行 JVM 中替换 类

Inject Jar and replace classes in running JVM

我希望能够替换和添加一些 类 到已经 运行 的 JVM。我读到我需要使用 CreateRemoteThread,但我并不完全明白。我阅读了有关如何执行此操作的 post (Software RnD),但我无法弄清楚它的作用和原因。除此之外,它只引入新的类,但不改变现有的。我怎样才能用 C++ 做到这一点?

您甚至不需要 CreateRemoteThread - 有一种官方方法可以连接到远程 JVM 并使用 Attach API.

替换已加载的 类
  1. 你需要一个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.MFAgent-Class 属性并将代理打包到 jar 文件中。

  1. 然后使用动态附加将代理 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工具