[ASM] Цепочка родителей класса

Версия Minecraft
1.7.10
API
Forge
236
4
22
Всем привет, опять у меня вопрос по этому долбаному ASM. Не очень уж давно спрашивал тут, как проверить есть ли определённый класс в цепочке классов-родителей трансформируемого класса, но ответ оказался нерабочим. (Тот самый пост) Я пробовал и полностью скопировать код, и "переиначить" под себя, не выходит. На текущий момент у меня есть такой метод:

Нерабочий поиск наследников:
    private void findSuperClasses(String className, ArrayList<String> list) {
        if(className == null) return;
        ClassReader classReader;
        try {
            classReader = new ClassReader(className);
        } catch(Throwable i) {
            return;
        }
        var superName = classReader.getSuperName();
        if(superName != null && !superName.equals("java/lang/Object")){
            list.add(superName);
            this.findSuperClasses(superName, list);
        }
    }
Этот рекурсивный поиск ломается на 1 же этапе, выбрасывая NPE в try catch при попытке создать класс ридер класса-родителя, из-за чего я не могу идти "в глубину" для сбора полной цепочки родителей класса...

Запускаю этот поиск родителей так::
//в методе transform
var classNode = new ClassNode(); //loombok, если что
var classReader = new ClassReader(basicClass);
classReader.accept(classNode, 0);

ArrayList<String> l = new ArrayList<>();
this.findSuperClasses(classNode.name, l);

Гуглил в Интернете, как же правильно через ASM собрать цепочку родителей класса - ответы, примерно, такие же, как и этот код. Я вставлял System.out.println`ы для отладки - className, передаваемый в конструктор - не равен нулл. Он выглядит примерно так: "path/to/class/TestClass". Интересно также то, что точно такой же поиск обычно без проблем находит всю цепочку родителей, если запускать игру из IDEA через "жука", а вот на сервере - дело плохо. Помогите, пожалуйста!
 
236
4
22
Попутно поинтересуюсь, как точно узнать, идёт трансформация обфусцированных майнкрафтом классов или с маппингами? Суть в том, что нужно знать какое точное имя классов, для редактирования инструкций методов. Смотрел уже некоторые трансформаторы классов на github, везде юзают тернарный оператор на вроде String clazzName = obfuscated ? "ihr" : "net/minecraft/test/NormalClazzName" //Для примерно написал имена такие а булеву берут по разному: то параметр name сравнивают с transformedName в методе трансформации, то сначала пытаются проверить является ли name нужным обфусц. именем, и в случае неудачи, проверить на нормальное название:

Пример:
        boolean isObfuscated = false;
        if(name.equals("apx"))
            isObfuscated = true;
        else if(!name.equals("net.minecraft.world.chunk.Chunk"))
            return basicClass;
Но ведь есть случаи, когда надо "исправить" код из чужого мода - там, конечно, transformedName будет как и просто name - нормальным. Но беда в том, что методы, которые иногда нужно инвокнуть в код, имеют аж 3 имени (SRG - например, "a", "e", "h" и т.п., обфусцированные - "func_1314_a" и т.п. и, наконец, маппинговые - нормальные, "getCommandSenderName", к примеру. Обычно определяют имя метода для трансформации через ту самую булеву, если она true - берут SRG имя, если false - маппинговое. Но как я узнаю обфусцирован код майном или нет, если трансформирую класс не из майнкрафта?
 

tox1cozZ

aka Agravaine
8,456
598
2,893
Мб попробовать костыль из хуклибы?

Но как я узнаю обфусцирован код майном или нет, если трансформирую класс не из майнкрафта?
Если класс никак не связан с майном, логично же что он не обфусцирован.
 
236
4
22
Мб попробовать костыль из хуклибы?
Мне нужен полностью весь этот класс? Неужели одного метода с рекурсивным вызовом не хватит, чтобы просто просканировать лист классов-родителей / интерфейсов (в данный момент, хотя бы родильские классы нужны). Мне кажется, что проблема лишь в том, что нужно что-то другое передать в ClassReader, но не могу понять что... Пробовал передавать путь до класса через точку (.) и через слеш (/), но оба варианта провалились :( Вообще, мне сказали, что нужно загрузить класс сначала, а потом уже через ClassReader смотреть его наследников, но как мне его загрузить?
 
808
3
124
Еще вот этот, здесь костыли для работы с обфускацией кубача (а выше тебе кинули суперкласс этого который ничего не знает про майнообфускацию)

GloomyFolken/HookLib

Не вижу проблемы позаимствовать эту парочку классов, можно поудалять оттуда лишние методы
 
236
4
22
Шо ругаешься, иди кури как оно сделано в хуклибе если не хочешь ее тащить, там никакого рокет саенса в принципе 😤
Глянул твою либу и такой вопрос: можно ли как-то указать в аннотации хука, что требуется хукнуть метод во всех классах extends класса, который идёт 1ым аргументом метода-хука?
 
236
4
22
Нет, и такая фича сильно увеличила бы влияние хуклибы на скорость запуска
Крайне жаль, её категорически не хватает... (Уж промолчим про беду, что хук только в начало/конец метода можно, а очень часто надо перед вызовом какого-то метода в методе хукаться)


Но зато если притащишь либу там будет готовый метод для проверки суперклассов
Ох пипец... От того что есть хук либа (которая, к сожалению, видимо, малофункциональная) опустились теперь вообще руки пытаться что-либо на ASM гнать, а без хуков многие вещи невыполнимы.
 
808
3
124
Ну так сделай сам если категорически не хватает...

Хуклиба делалась как максимально простой и понятный инструмент, когда все или ручками ковыряли ASM или вообще никак кубач не патчили. Если не хватает вставки в начало/конец можно взять какой-нибудь инструмент который уже требует минимального понимания происходящего в байткоде, например миксины или форк хуклибы от hohserg'a (мне несколько не нравится как там выглядит интерфейс, но вроде юзабельно).

Но вот такие приколы как вставка во все сабклассы это правда очень специфичный юзкейс (хоть и не особо сложно делается, просто медленно работать будет). Это во-первых в любом случае самому костылить, а во-вторых звучит как что-то что будет так себе работать на практике.
 
236
4
22
Ну так сделай сам если категорически не хватает...
Та вот выше кинули ссылку на класс, не впираю как его применить, чтобы мой код, который в try catch перестал давать NPE и нормально сканировал родаков класса...
 
7,099
324
1,510
Можно скомпилить хуклибу, добавить как зависимось через shadow plugin с опцией minimize, чтобы шадоу выпилил все неиспользуемые классы
 
Сверху