当变量明显存在时,Javassist 没有这样的字段
Javassist no such field when variable clearly exists
我正在尝试使用 javassist 将代码注入 minecraft 1.8 jar。 insertBefore
& insertAfter
方法工作得很好。但是 insert at 方法没有按预期工作。我收到此错误:
https://gist.github.com/czaarek99/dda36426318f331ce6b0
这是处理注入的代码:
if (className.equals(mappingManager.getMapping(CommonMappings.MINECRAFT_CLASS))) {
CtClass ctClass = classPool.get(mappingManager.getMapping(CommonMappings.MINECRAFT_CLASS, true)); //returns "bsu"
CtMethod tickMethod = ctClass.getDeclaredMethod(mappingManager.getMapping(CommonMappings.RUN_TICK_METHOD)); //returns "r"
tickMethod.insertBefore("EventManager.call(new TickEvent(TickEvent.PRE_UPDATE));");
tickMethod.insertAfter("EventManager.call(new TickEvent(TickEvent.POST_UPDATE));");
String varName = mappingManager.getMapping(CommonMappings.KEYBOARD_KEYCODE_VARIABLE); //returns "var1"
int lineToInsertAt = Integer.valueOf(mappingManager.getMapping(CommonMappings.KEYBOARD_NEXT_LINE)); //returns "1372"
tickMethod.insertAt(lineToInsertAt, true, "KeyPressEvent keyPressEvent = new KeyPressEvent("+ varName +");EventManager.call(keyPressEvent);");;
CtMethod runGameMethod = ctClass.getDeclaredMethod(mappingManager.getMapping(CommonMappings.START_GAME_METHOD)); //returns "aj"
runGameMethod.insertAfter("InjectClient.getInstance().loadModules();");
byte[] newCode = ctClass.toBytecode(); //line that throws the error
ctClass.detach();
return newCode;
}
我已经评论了它获取映射的行,基本上这些是 minecraft 混淆变量和函数名称,因为这是我要插入的内容。
好吧,所以合乎逻辑的解释是 var1
不存在?这不是真的。如果我们看一下混淆后的 bsu
class 的代码,我们可以看到:
好的,我明白了。原来 javassist 不知道是否定义了局部变量,它假设 var1
是一个字段。我通过创建自己的变量并将其设置为与 var1
具有相同的值来解决它。
来源:http://jboss-javassist.github.io/javassist/tutorial/tutorial2.html
我正在尝试使用 javassist 将代码注入 minecraft 1.8 jar。 insertBefore
& insertAfter
方法工作得很好。但是 insert at 方法没有按预期工作。我收到此错误:
https://gist.github.com/czaarek99/dda36426318f331ce6b0
这是处理注入的代码:
if (className.equals(mappingManager.getMapping(CommonMappings.MINECRAFT_CLASS))) {
CtClass ctClass = classPool.get(mappingManager.getMapping(CommonMappings.MINECRAFT_CLASS, true)); //returns "bsu"
CtMethod tickMethod = ctClass.getDeclaredMethod(mappingManager.getMapping(CommonMappings.RUN_TICK_METHOD)); //returns "r"
tickMethod.insertBefore("EventManager.call(new TickEvent(TickEvent.PRE_UPDATE));");
tickMethod.insertAfter("EventManager.call(new TickEvent(TickEvent.POST_UPDATE));");
String varName = mappingManager.getMapping(CommonMappings.KEYBOARD_KEYCODE_VARIABLE); //returns "var1"
int lineToInsertAt = Integer.valueOf(mappingManager.getMapping(CommonMappings.KEYBOARD_NEXT_LINE)); //returns "1372"
tickMethod.insertAt(lineToInsertAt, true, "KeyPressEvent keyPressEvent = new KeyPressEvent("+ varName +");EventManager.call(keyPressEvent);");;
CtMethod runGameMethod = ctClass.getDeclaredMethod(mappingManager.getMapping(CommonMappings.START_GAME_METHOD)); //returns "aj"
runGameMethod.insertAfter("InjectClient.getInstance().loadModules();");
byte[] newCode = ctClass.toBytecode(); //line that throws the error
ctClass.detach();
return newCode;
}
我已经评论了它获取映射的行,基本上这些是 minecraft 混淆变量和函数名称,因为这是我要插入的内容。
好吧,所以合乎逻辑的解释是 var1
不存在?这不是真的。如果我们看一下混淆后的 bsu
class 的代码,我们可以看到:
好的,我明白了。原来 javassist 不知道是否定义了局部变量,它假设 var1
是一个字段。我通过创建自己的变量并将其设置为与 var1
具有相同的值来解决它。
来源:http://jboss-javassist.github.io/javassist/tutorial/tutorial2.html