gpt4 book ai didi

c++ - 在运行的 JVM 中注入(inject) Jar 并替换类

转载 作者:行者123 更新时间:2023-11-28 05:13:09 30 4
gpt4 key购买 nike

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

最佳答案

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

  1. 你需要一个 Java Agent那叫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));
    }

    您必须添加具有 Agent-Class 属性的 MANIFEST.MF 并将代理打包到 jar 文件中。

  1. 然后使用动态附加将代理 jar 注入(inject)正在运行的 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++而不是Java API,你可以看看我的jattach效用。

关于c++ - 在运行的 JVM 中注入(inject) Jar 并替换类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43157989/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com