Своя обфускация minecraft.jar: проблема рефлексии в модах

808
3
129
На днях мне взбрело в голову написать утилитку для (полу)автоматической обфускации minecraft.jar с модами. Мне удалось решить все связанные с этим технические проблемы, кроме одной: обращение к полям и методом майна из модов через рефлексию.
Просмотрев по диагонали код популярнейших модов, я выделил три типа модов по способу, которым они получают доступ к приватным полям и методам майна.
  1. Пользуются тем, что на запуске игры фордж объявляет все поля и методы майна публичными и не используют рефлексию вообще. ИМХО самое правильное решение: нет серьезных проблем при смене версии майна, не ухудшается производительность.
  2. Различными костылями обращаются к майну через рефлексию, но нигде в коде не используют названия полей и методов. Обычно они получают весь список полей/методов из класса, пробегаются по нему и ищут нужное поле/метод по типу поля или параметрам метода. Костыльно и может быть неприятным сюрпризом при смене версии майна, но зато не вызывает у меня проблем с обфускацией :D
  3. Обращаются к полям и методам майна по названию. И ладно бы они делали что-то вроде clazz.getMethod("methodName") (обфускаторы такое чинят), так нет же, самый распространённый паттерн - это вот так: MyFuckingReflectionHelper.getMethod(clazz, "deobfMethodName", "func_123456_a", "a"). Естественно, на этом обфускация ломается.
Ну, я думаю, мой вопрос уже понятен: что делать с третьим типом? Чинить каждый мод руками или пилить для него отдельный костыль - это слишком долго и неудобно. Таких модов действительно много. Я проверил несколько крупных популярных модов. Вот какие моды "третьего типа" я нашел: smartmoving, flans, (render) player api, industrial craft. Ещё, кстати, "третьим типом" является LiteLoader. Впрочем, его разрабов можно понять и сделать для лайтлоадера отдельный костыль: у них-то нет возможности пользоваться тем, что фордж делает все поля публичными.

Для сравнения, моды первого и второго типа из списка проверенных: buildcraft, rei's minimap, custom npcs, pixelmon, forestry, carpenter's blocks. Короче говоря, где-то треть крупных модов ломает обфускацию.
 
Нуу...функции можно смотреть в mcpMappingViewer загружаешь mcp нужной версии и вводишь искомую функцию.Вот как то так:
325bbb4fd5.png
 
Не вижу, зачем это делать.

Жутко хочется вообще закрыть тему нахрен.
 
Чтобы отправить лесом всех читеров. Лаунчеры рано или поздно обходятся, а для такого пока особо ничего не придумано. Ну и как приятный бонус - увеличивается защита своих модов.
 
Ну имхо в МСР-среде делать все поля публичными - не вариант. Все-таки по модификатору доступа обычно понятно, что можно снаружи менять, а куда лучше не лезть без четкого понимания что ты делаешь и что от этого изменится.
 
GloomyFolken написал(а):
Чтобы отправить лесом всех читеров. Лаунчеры рано или поздно обходятся, а для такого пока особо ничего не придумано. Ну и как приятный бонус - увеличивается защита своих модов.
А как на читеров может это повлиять?
 
Назад
Сверху