已加载代理JAR但代理无法初始化

时间:2017-07-08 14:43:32

标签: java jvm jvm-hotspot

我试图"注射"一个使用Agents的jar,现在的Java版本都是1.8,而且这些工具来自我的JDK lib文件夹,所以我认为没有任何错误

这是我的加载类

public static void main(final String[] args) throws Exception {
    final File jarFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
    System.out.println("Starting Lizard...");
    try {
        Class.forName("com.sun.tools.attach.VirtualMachine");
    }
    catch (ClassNotFoundException e2) {
        System.out.println("ERROR: Couldn't load VirtualMachine class, is tools.jar present?");
        return;
    }
    System.out.println("Loading attach library...");
    extractLibrary(jarFile);
    try {
        System.loadLibrary("attach");
    }
    catch (Exception e3) {
        System.out.println("ERROR: Couldn't load attach libary!");
        return;
    }

    System.out.println("Attach library loaded.");
    System.out.println("Searching for Minecraft JVM...");
    for (final VirtualMachineDescriptor descriptor : VirtualMachine.list()) {
        if (descriptor.displayName().startsWith("net.minecraft.launchwrapper.Launch")) {
            System.out.println("Minecraft found, attaching...");
            System.out.println(descriptor.id());
            final VirtualMachine vm = VirtualMachine.attach(descriptor.id());
            final String vmJavaVersion = vm.getSystemProperties().getProperty("java.version");
            final String clientJavaVersion = System.getProperty("java.version");
            System.out.println("vmJava: " + vmJavaVersion);
            System.out.println("ClientJava: " + clientJavaVersion);
            if (!vmJavaVersion.equals(clientJavaVersion)) {
                System.out.println("WARN: Lizard and Minecraft Java version do not match, agent might fail!");
            }
            System.out.println("Loading agent...");
            try {
                vm.loadAgent(jarFile.getAbsolutePath());
            }
            catch (Exception e) {
                System.out.println("ERROR: Agent failed to load (" + e.getMessage() + ")!");
                System.out.println("1: "+ e);
                e.printStackTrace();
                return;
            }
            System.out.println("Agent successfully loaded, detaching...");
            vm.detach();
            System.out.println("Lizard started successfully.");
            System.exit(0);
            return;
        }
    }
    System.out.println("Minecraft not found, exiting.");
    JOptionPane.showMessageDialog(null, "No Minecraft JVM found.", "Lizard", 0);
}

这是我的代理人

public static void agentmain(String args, Instrumentation instrumentation) {
    try {
        @SuppressWarnings("rawtypes")
        Class[] arrclass = instrumentation.getAllLoadedClasses();
        int n = arrclass.length;
        int n2 = 0;
        while (n2 < n) {
            Class<?> clazz = arrclass[n2];
            if (clazz.getName().equals("net.minecraft.client.Minecraft")) {
                LaunchClassLoader classLoader = (LaunchClassLoader)clazz.getClassLoader();
                classLoader.addURL(Agent.class.getProtectionDomain().getCodeSource().getLocation());
                Class<?> spookyNan = classLoader.loadClass(gorilla.Gorilla.class.getName());
                spookyNan.newInstance();
                return;
            }
            ++n2;
        }
    }


    catch (Exception e) {
        JOptionPane.showMessageDialog(null, e.toString());
        JOptionPane.showMessageDialog(null, e.getStackTrace());
    }
}

现在我得到的堆栈跟踪是:

com.sun.tools.attach.AgentInitializationException: Agent JAR loaded but agent failed to initialize
    at sun.tools.attach.HotSpotVirtualMachine.loadAgent(HotSpotVirtualMachine.java:121)
    at com.sun.tools.attach.VirtualMachine.loadAgent(VirtualMachine.java:540)
    at gorilla.Main.main(Main.java:47)

Line47就是这一行

vm.loadAgent(jarFile.getAbsolutePath());

2 个答案:

答案 0 :(得分:3)

AgentInitializationException: Agent JAR loaded but agent failed to initialize表示agentmain方法抛出了未捕获的异常。检查控制台或目标Java应用程序(Minecraft)的日志以查看原因。

注意:一旦您将代理加载到目标应用程序中,您就无法加载同一代理的修改版本。这尤其意味着,如果您的代理程序曾因异常而失败,即使您已修复错误并尝试再次加载正确的类,代理仍将失败并出现相同的错误。

为了加载更新的代理,您必须重命名代理类将其打包到不同的 JAR文件中。

答案 1 :(得分:0)

我最近遇到了同样的问题。确保您正确定义了清单。这是我的一个有效的例子。

Manifest-Version: 1.0
Agent-Class: com.embah.OSBotFreedom.Attach.Agents.OSBotAgent
Permissions: all-permissions

如果文件位于相同的主目录中,只需输入类的名称即可。

希望这对您的冒险家有帮助!