Преобразование имен и информации FieldInsnNode - PullRequest
0 голосов
/ 15 января 2019

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

Моя проблема сейчас в фактическом байт-коде. Я пытаюсь изменить значения FieldInsnNode и MethodInsnNode, чтобы изменить их имена. Пример: g.y.x(); должно быть node.next.generateHash().

MethodInsnNode min = (MethodInsnNode) insn;

min.name = remappedNames.getOrDefault(min.owner + "." + min.name + min.desc, min.name);
min.owner = remappedNames.getOrDefault(min.owner, min.owner);
min.desc = transformMethodDesc(min.desc);

Я думаю, что неправильно понимаю, как зовут, владельца и описание. Вот мое текущее понимание:

name = фактическое имя переменной. Например. в моем предыдущем примере next обфусцированное поле name значение равно y.

Владелец немного сбивает с толку, я не совсем уверен, что именно, я предполагаю, что это класс, на который отвечает переменная. Например, владельцем здесь будет g.

Буду признателен за любые разъяснения, поскольку даже когда я делаю что-то вроде min.name = "TEST", я не замечаю никакой разницы в декомпилированном выводе.

1 Ответ

0 голосов
/ 19 января 2019

Я выяснил ответ на вопрос.

Узлы поля / метода являются представлением класса, но очевидно, что их изменение ничего не изменит в самом классе. Чтобы изменить классы, вы должны вывести его обратно на диск, используя что-то вроде JarOutputStream и ClassWriter.

Простой пример:

JarOutputStream jos = ...
ClassWriter cw = new ClassWriter();
cw.accept(myClassNode);
byte[] bytes = cw.toByteArray();

Затем вы можете записать байты обратно на диск

Надеюсь, это поможет!

...