Как обернуть переменную методом в байт-код ASM JAVA - PullRequest
0 голосов
/ 08 февраля 2019

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

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

т.е.если строка - Logger («Это журнал», a)

Что делает мой алгоритм, так это делает, 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 («Это журнал», encode (a));

Считайте, что я попал в переменную 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;"));

Оказывается, что сбой говорит "Нет достаточного места в стеке".

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

...