Манипулирование байт-кодом Java с использованием asm [закрыто]JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Манипулирование байт-кодом Java с использованием asm [закрыто]

Сообщение Anonymous »

Я работаю над инструментом, который использует ASM для внедрения кода в метод onEnable плагинов Minecraft. В частности, я пытаюсь добавить оператор печати (System.out.println("Hello, World");) в начало метода onEnable. Однако внедрение, похоже, не работает должным образом, и я застрял.
После просмотра измененного файла .jar внедренный код отсутствует в методе onEnable. . Я добавил отладку и автоматическую проверку, и единственная обнаруженная проблема заключается в том, что внедренный байт-код не применяется к полученному .jar.
Ожидаемое поведение:
После внедрения метод onEnable должен содержать следующий код:
System.out.println("Hello, World");
Вот соответствующая часть моего код:

private byte[] modifyClassBytecode(InputStream classInputStream) throws IOException {
ClassReader classReader = new ClassReader(classInputStream);
ClassNode classNode = new ClassNode();
classReader.accept(classNode, 0);

boolean methodFound = false;

for (MethodNode method : classNode.methods) {
if ("onEnable".equals(method.name) && "()V".equals(method.desc)) {
methodFound = true;
System.out.println("Found 'onEnable' method. Injecting code...");

// Create the instructions to inject
InsnList insnList = new InsnList();
insnList.add(new FieldInsnNode(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"));
insnList.add(new LdcInsnNode("Hello, world"));
insnList.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false));

// Inject at the beginning of the method
method.instructions.insert(insnList);
System.out.println("Injection complete.");
break;
}
}

if (!methodFound) {
throw new IOException("The `onEnable` method was not found in the class.");
}

// Write the modified class back to a byte array
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
classNode.accept(classWriter);
return classWriter.toByteArray();
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... -using-asm
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Манипулирование байт-кодом Java с использованием asm [закрыто]
    Anonymous » » в форуме JAVA
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Манипулирование байт-кодом Java с использованием asm [закрыто]
    Anonymous » » в форуме JAVA
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Манипулирование байт-кодом Java с использованием asm [закрыто]
    Anonymous » » в форуме JAVA
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Java, ASM: Как получить имя OpCode и TagValue от ASM Insnnode?
    Anonymous » » в форуме JAVA
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Как я могу дизассемблировать весь obj-файл в допустимом asm, изменить некоторые разделы такого asm-кода и снова собрать
    Anonymous » » в форуме Linux
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»