Я работаю с ForgeGradle (платформа для моддинга Minecraft Forge).

Я хотел бы запутать свой мод перед публикацией, но природа платформы Forge не позволяет мне сделать это, просто запустив программу, такую ​​​​как ProGuard, после компиляции (с определенными библиотеками).

Почему? Структура выглядит следующим образом: Mod -> Forge -> Minecraft.

Поскольку Minecraft использует свои собственные запутанные классы, а компилятор ForgeGradle НЕ НАПРЯМУЮ запутывает код мода, чтобы он соответствовал коду Minecraft, невозможно использовать MC.jar в качестве библиотеки при использовании ProGuard. Скомпилированный Forge Mod фактически декодируется Forge во время выполнения с использованием имен SRG. Логику этого нелегко объяснить, поэтому я просто отмечу: я не могу запутать .jar таким образом, чтобы он соответствовал библиотекам.

Так что я мог бы просто взять код моего мода (файлы .java) и переименовать все поля/методы/классы, которые являются МОИМИ до компиляции Forge. Есть ли программное обеспечение, которое позволило бы мне выбрать количество файлов .java и «запутать» их таким образом, чтобы не переименовывать ссылки, которые им не принадлежат?

EDIT (больше пояснений):

Код мода имеет 3 состояния: Разработка, Скомпилировано, Выполняется.

Попробую привести пример: Допустим внутри Minecraft.jar есть декомпилированный метод ItemSword.onHit() И его скомпилированная (обфусцированная) версия выглядит так: bca.aa(), также все пакеты потеряны (сплющены).

В состоянии разработки кода мода (.java), чтобы сослаться на него, мы просто делаем: ItemSword.onHit()

Когда мы скомпилируем мод, вызов будет выглядеть так (.class): ItemSword.func_ab4234() — это SRG, о которой я говорил.

Теперь, когда мод будет загружен в игру, forge будет переводить «ItemSword» в «bca» и «func_ab4234()» в «aa()».

Из-за этого я даже не могу добавить нужную библиотеку - НИ ОДНОЙ. Я всегда буду получать (в ProGuard) предупреждение NoClassDefFound, и я не могу его игнорировать (это приведет к сбою компиляции).

Итак, после этого редактирования - возможно ли сделать обфускацию с помощью ProGuard (учитывая, что мне не может быть назначена «хорошая» библиотека)?

1
Ernio 10 Мар 2015 в 20:49
Конечно, вы можете запутать свои исходные файлы перед компиляцией. Вы можете удалить всю полезную информацию, основанную на именах классов, методов, полей или переменных. Однако некоторые вещи можно запутать только в байтовом коде (в скомпилированном файле .class). Кроме того, убедитесь, что при компиляции не включена какая-либо отладочная информация.
 – 
Tobias
10 Мар 2015 в 20:56
Да, но вопрос в том, как это сделать ОЧЕНЬ быстро и, возможно, случайно? Я использую Eclipse, и я знаю инструмент Refractor, который в значительной степени именно то, что мне нужно, но ему просто нужно сделать это автоматически, несколькими щелчками мыши по всем выбранным файлам. Кто-нибудь знает, существует ли такая штука?
 – 
Ernio
10 Мар 2015 в 20:59

2 ответа

Вы пробовали варианты proguard? http://proguard.sourceforge.net/manual/usage.html

Например для сериализуемых классов и других вещей поместите это в свою конфигурацию proguard (вы также можете сохранить полные классы, если хотите):

<!-- With this code serializable classes will be backward compatible -->
<keepnames implements="java.io.Serializable"/>

<!-- or for native access:-->
<keepclasseswithmembernames>
 <method access="native"/>
</keepclasseswithmembernames>

<!--Preserve all public classes, and their public and protected fields and methods.--> 
<keep access="public">
 <field access="public protected"/>
 <method access="public protected"/>
</keep>
0
Sempfer 10 Мар 2015 в 21:28
Я внес правку в вопрос. Не могли бы вы подтвердить, что все еще возможно то, что вы предлагаете выше? Если это так, я узнаю больше о параметрах хранения.
 – 
Ernio
10 Мар 2015 в 22:51
Одно уточнение: если вы не обфусцируете свой мод, он работает, верно?
 – 
Sempfer
11 Мар 2015 в 15:45

Если я получил ваш вопрос, вы хотите запутать свой собственный код, а не что-то еще. Это то, в чем ProGuard действительно хорош. Предположим, вы создали свои классы в пакетах com.foo и com.bar. Вы можете использовать эту простую команду ProGuard только для запутывания ваших собственных классов:

-keep class !com.foo.**,!com.bar.** { *; }

Он указывает ProGuard не запутывать членов классов, которые не принадлежат ни к com.foo, ни к com.bar.

Если вы получаете ошибки NoClassDef, вы добавили не ту библиотеку. Я предполагаю, что вы используете какую-то IDE (возможно, eclipse). Просмотрите библиотеки, на которые ссылается ваш проект, чтобы найти правильный путь к классам библиотек (например, файл jar). В основном вам нужно найти путь к классам, используемый для компиляции вашего кода, ProGuard также возьмет это, и все должно работать.

0
Tobias 10 Мар 2015 в 23:10
В том-то и проблема, что нет библиотеки, которая могла бы работать с скомпилированным модом. Прочтите мою правку еще раз. Существует ТОЛЬКО библиотека для состояния разработки мода и для запуска мода (полностью запутанная). Нет библиотеки для только что скомпилированного мода. Скомпилированный мод загружается ForgeModLoader и перекомпилируется во время выполнения (при запуске) и для этого нет .jar. Все это делается Трансформерами (:D) с использованием имен, сохраненных в файле .srg (например, .txt). Я не могу получить «правильную» библиотеку. Действительно ли нет обфускатора на основе рефрактора затмения?
 – 
Ernio
10 Мар 2015 в 23:33
Изменяет ли платформа forge файлы классов после компиляции?
 – 
Tobias
10 Мар 2015 в 23:52
Да, при создании мода вы работаете в полностью деобфусцированном рабочем пространстве, затем при компиляции ваш мод компилируется в Forge-universal-names, что независимо от того, какую версию вы используете, мод всегда останется прежним (с каждым методом обновления Minecraft). имена меняются, Forge нет). Затем, когда вы помещаете свой мод в пользовательскую среду, Forge загружает моды и ПЕРЕВОДИТ их в читаемые в Minecraft классы (в зависимости от версии перевод отличается). Перевод происходит на этапе загрузки класса и выполняется ASM. Из-за этого у меня нет библиотеки, которую я мог бы использовать в ProGuard.
 – 
Ernio
11 Мар 2015 в 01:42
Вот почему я ищу, чтобы на самом деле выполнить всю мою частную обфускацию, прежде чем я даже скомпилирую мод в файлах .java. Я не могу поверить, что нет (подобной затмению) программы рефрактора-обфускации (или плагина для eclipse). Я искал часы. Если кто-то знает что-то, пожалуйста, дайте мне ссылку на это, я был бы признателен.
 – 
Ernio
11 Мар 2015 в 01:44
Только что добавил кое-что в мой список дел! Извините, я тоже ничего не знаю (пока)
 – 
Tobias
11 Мар 2015 в 01:46