- 808
- 3
- 129
На днях мне взбрело в голову написать утилитку для (полу)автоматической обфускации minecraft.jar с модами. Мне удалось решить все связанные с этим технические проблемы, кроме одной: обращение к полям и методом майна из модов через рефлексию.
Просмотрев по диагонали код популярнейших модов, я выделил три типа модов по способу, которым они получают доступ к приватным полям и методам майна.
Для сравнения, моды первого и второго типа из списка проверенных: buildcraft, rei's minimap, custom npcs, pixelmon, forestry, carpenter's blocks. Короче говоря, где-то треть крупных модов ломает обфускацию.
Просмотрев по диагонали код популярнейших модов, я выделил три типа модов по способу, которым они получают доступ к приватным полям и методам майна.
- Пользуются тем, что на запуске игры фордж объявляет все поля и методы майна публичными и не используют рефлексию вообще. ИМХО самое правильное решение: нет серьезных проблем при смене версии майна, не ухудшается производительность.
- Различными костылями обращаются к майну через рефлексию, но нигде в коде не используют названия полей и методов. Обычно они получают весь список полей/методов из класса, пробегаются по нему и ищут нужное поле/метод по типу поля или параметрам метода. Костыльно и может быть неприятным сюрпризом при смене версии майна, но зато не вызывает у меня проблем с обфускацией
- Обращаются к полям и методам майна по названию. И ладно бы они делали что-то вроде clazz.getMethod("methodName") (обфускаторы такое чинят), так нет же, самый распространённый паттерн - это вот так: MyFuckingReflectionHelper.getMethod(clazz, "deobfMethodName", "func_123456_a", "a"). Естественно, на этом обфускация ломается.
Для сравнения, моды первого и второго типа из списка проверенных: buildcraft, rei's minimap, custom npcs, pixelmon, forestry, carpenter's blocks. Короче говоря, где-то треть крупных модов ломает обфускацию.