gpt4 book ai didi

Java BCEL 注入(inject)/替换出错

转载 作者:太空宇宙 更新时间:2023-11-04 07:52:46 27 4
gpt4 key购买 nike

背景:我正在注入(inject) Minecraft 启动器来获取小程序(我已经完成了),但现在我希望通过我的类加载器加载 Minecraft 的文件。我找到了GameUpdater.java(Minecraft的gameupdater,也是客户端小程序的调度程序)的方法,并且在该方法下有一个名为“createApplet”的方法。

GameUpdater.java:

public Applet createApplet() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class localClass = classLoader.loadClass("net.minecraft.client.MinecraftApplet");
return (Applet)localClass.newInstance();
}

好吧,很简单,用你自己的静态加载方法替换 classLoader.loadClass 。所以,我尝试在我的类加载器中,这是我的转换代码:

for(Method method : generator.getMethods()) {
if(method.getName().equals("createApplet")) {
ConstantPoolGen cpg = generator.getConstantPool();
MethodGen methodGen = new MethodGen(method, generator.getClassName(), cpg);
Instruction instruction = null;
InstructionList instructionList = methodGen.getInstructionList();
InstructionHandle[] instructionHandles = instructionList.getInstructionHandles();
for(int i = 0; i < instructionHandles.length; i++) {
//System.out.println(instructionHandles[i].getInstruction()); //debug
if(instructionHandles[i].getInstruction() instanceof LDC) {
instruction = instructionHandles[i].getInstruction();
InstructionFactory instructionFactory = new InstructionFactory(generator, cpg);
InvokeInstruction classLoaderCall =
instructionFactory.createInvoke(
"MinecraftLauncher", "loadClass", Type.CLASS, new Type[]{Type.STRING},Constants.INVOKESTATIC);
instructionList.insert(instruction, classLoaderCall);
methodGen.setInstructionList(instructionList);
instructionList.setPositions();
methodGen.setMaxStack();
methodGen.setMaxLocals();
methodGen.removeLineNumbers();
generator.replaceMethod(method, methodGen.getMethod());
generator.getJavaClass().dump("gameupdater.class");
}
}
}

然而,我还是脸朝下摔倒了。这是更新后的 gameupdater.class(如您在上面看到的,我转储了它)

public Applet createApplet() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class localClass = MinecraftLauncher.loadClass(classLoader).loadClass("net.minecraft.client.MinecraftApplet");
return (Applet)localClass.newInstance();
}

这是 GameUpdater 中 createApplet 方法的字节码图片 bytecode info

现在,我不知道还能怎么做。如果有人能指出我正确的方向,那就太棒了!与此同时,我将继续尝试并阅读 bcel 文档。

如果您对更多代码等有任何疑问,请告诉我。

最佳答案

已解决。诀窍是在添加新的(用静态方法替换加载函数)后删除 InvokerVirtual(从指令列表中删除操作码)。

示例

instructionList.insert(instruction, classLoaderCall);
instructionList.delete(instruction);

关于Java BCEL 注入(inject)/替换出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14178980/

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