Как обернуть переменную методом в байт-код ASM JAVA

Я пытаюсь зашифровать переменную в параметре в вызове метода с использованием ASM при обходе инструкций в узле метода.

На данный момент я попытался сделать строку для шифрования в предыдущей строке вызова метода (в фактическом коде Java).

то есть. если строка Logger("Это журнал", а)

Мой алгоритм работает так: a = Project.Util.encode(a); в предыдущей строке регистратора. Пример кода приведен ниже.

if(abstractNode instanceof VarInsnNode) {
    VarInsnNode varnode = (VarInsnNode) abstractNode;
        insnList.add(new FieldInsnNode(GETSTATIC, "com/sample/Project", "Util", "Ljava/io/PrintStream;"));
        insnList.add(new VarInsnNode(ALOAD,varnode.var));
        insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/io/PrintStream", "encode", "(Ljava/lang/String;)Ljava/lang/String;"));
       insnList.add(new VarInsnNode(ASTORE,varnode.var));
     }

Я вычисляю параметры из описания вызова метода. Всякий раз, когда я нахожу переменную, я создаю кодировку, изменяя ее значение, и в конце байтовой структуры вызова метода (перемещаясь в восходящем направлении) я вставляю эти инструкции перед ними.

Но я хочу убрать его использование вот так. Вместо этого я хочу сделать так.

Logger("Это журнал", кодировать (а));

Представьте, что я попал в переменную a как абстрактный узел. Я пытаюсь добавить инструкцию до и после этой конкретной переменной, как.

 methodNode.instructions.insertBefore(abstractNode, new FieldInsnNode(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"));
 methodNode.instructions.insertBefore(abstractNode.getNext(),new MethodInsnNode(INVOKEVIRTUAL, "java/io/PrintStream", "encode", "(Ljava/lang/String;)Ljava/lang/String;"));

Получается, что сбой говорит "Нет достаточного места в стеке".

Пожалуйста, помогите мне в этом.

0 ответов

Другие вопросы по тегам