Я пытаюсь зашифровать переменную в параметре в вызове метода с использованием 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;"));
Оказывается, что сбой говорит "Нет достаточного места в стеке".
Пожалуйста, помогите мне в этом представлении.