изменение имен всех методов внутри банки с помощью asm - PullRequest
0 голосов
/ 10 июля 2019

Здравствуйте, я создаю небольшой простой 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, я был бы рад любой помощи

...