Здравствуйте, я создаю небольшой простой Java-обфускатор, используя asm в качестве учебного проекта, и потому что java-обфускаторы мне интересны. Теперь я уже сделал функцию, которая изменяет имена всех классов, а также обновляет ссылки на эти классы, вот функция:
public static JarData classesRenamer(JarData jarData) {
NameGenerator gen = new NameGenerator(10);
Map<String, ClassNode> classes = jarData.getClasses();
Map<String, byte[]> out = jarData.getOut();
Map<String, String> mappings = new HashMap<String, String>();
for (ClassNode cn : classes.values()) {
mappings.put(cn.name, gen.getName());
}
SimpleRemapper mapper = new SimpleRemapper(mappings);
for (ClassNode cn : classes.values()) {
ClassWriter cw = new ClassWriter(0);
ClassVisitor remapper = new ClassRemapper(cw, mapper);
cn.accept(remapper);
out.put(mappings.containsKey(cn.name) ? mappings.get(cn.name) : cn.name, cw.toByteArray());
System.out.println("Renamer > Code of Class: " + cn.name + " was renamed to: " + mappings.get(cn.name));
}
return new JarData(classes, out);
}
Теперь я пытаюсь создать функцию, которая изменит все имена методов внутри классов, а также повсюду в коде, где метод вызывается с его новым именем, теперь я попытался сделать Это так же, как то, как я изменил имена классов, но это не сработало, поскольку класс MethodWriter не является общедоступным и, кажется, работает совсем по-другому и не содержит методов, которые я пытался использовать, вот моя попытка:
public static JarData methodRenamer(JarData jarData) {
NameGenerator gen = new NameGenerator(10);
Map<String, ClassNode> classes = jarData.getClasses();
Map<String, byte[]> out = jarData.getOut();
Map<String, String> mappings = new HashMap<String, String>();
for (ClassNode cn : classes.values()) {
for (MethodNode mn : cn.methods) {
mappings.put(cn.name, gen.getName());
}
}
SimpleRemapper mapper = new SimpleRemapper(mappings);
for (ClassNode cn : classes.values()) {
for (MethodNode mn : cn.methods) {
MethodWriter mw = new MethodWriter();
MethodVisitor remapper = new MethodRemapper(mw, mapper);
mv.accept(remapper);
out.put(mappings.containsKey(cn.name) ? mappings.get(cn.name) : cn.name, mw.toByteArray());
}
}
return new JarData(classes, out);
}
Теперь, поскольку MethodWriter не является общедоступным, я думаю, что его следует использовать по-другому, а не так, как я использую ClassWriter, я был бы рад любой помощи