Защита кода в модах Unreal: почему вырезание исходников ничего не защищает
Killing Floor унаследовал от Unreal Tournament не только модель моддинга, но и старый спор: может ли моддер скрыть свой UnrealScript? Страница Unreal Wiki «Trystan/Code Protection» собрала этот спор в начале 2000-х: Trystan, Mychaeel, El Muerte, Foxpaw, Solid Snake, Xian и другие. Аргументы актуальны и для мутаторов KF, форков ServerPerks и серверных пакетов с вырезанным кодом. Ниже пересказ и практические выводы.
Как пакеты Unreal хранят код
Скомпилированный .u содержит две отдельные вещи:
- байт-код, который выполняет движок;
- исходный текст каждого класса, который лежит рядом обычным текстом, только чтобы его могли показать редакторы и экспортёры.
«Защитить» пакет значит удалить вторую часть, например через ucc editor.stripsourcecommandlet. Байт-код остаётся, он нужен игре. Инструменты вроде UT Package Tool, WOTgreal и позже UE Explorer превращают байт-код обратно в рабочий, хоть и менее красивый UnrealScript. См. чистку вывода UE Explorer и разбор UT Package Tool.
Исходная претензия
Trystan не утверждал, что код нужно прятать. Речь шла о двойных стандартах:
- Когда кодер спрашивает, как защитить свой код, на него наваливается всё сообщество: «код всё равно принадлежит Epic», «по EULA он общий», «защитить нельзя, значит, задумано делиться», «ты учился у нас — делись в ответ».
- Когда кто-то спрашивает, как достать код из защищённого пакета, ему просто объясняют как, ни слова об авторских правах или о том, чтобы спросить автора.
Он разобрал типичные доводы. Авторские права остаются у того, кто написал код; EULA не передаёт код модов ни Epic, ни публике; «защитить нельзя» ничего не говорит о разрешении; то, что ты учился у сообщества, не обязывает публиковать всё. Его просьба: честно отвечать на оба вопроса, а объясняя извлечение, добавлять, что это чужая работа и защищена она, вероятно, не просто так.
Аргументы против вырезания
Ответ Mychaeel стал главным контраргументом:
- Это ничего не защищает. Вор всё равно перекомпилирует байт-код или даже поставит ваш актор из вашего пакета прямо в свою карту. Проигрывают только те, кто хотел научиться.
- Исчезает именно то, что стоит читать: структура, комментарии, имя автора и заголовок с лицензией.
- Это даёт неверный сигнал, будто пакеты с исходниками можно брать свободно. Те, кто не вырезает код, страдают из-за тех, кто вырезает.
- Низкий барьер отпугивает худших. Некоторые воспринимают техническую защиту как вызов и считают её взлом разрешением пользоваться тем, что было внутри.
Лицензии и авторство
Что предлагали в теме вместо вырезания:
- Лицензия в исходнике. El Muerte выпускал работы под GPL, которая требует сохранять открытый код у производных работ. Другие ставили короткий заголовок: «перед использованием свяжитесь с X» или «можно использовать, если...». Добавьте туда и email.
- Чтобы пережить декомпиляцию. spoon заметил, что файл
LICENSEв архиве не попадает в декомпилированный пакет. Его решение: классLicense.uc, который целиком состоит из комментария, и ссылка на него в заголовке каждого класса. - Выбирайте лицензию осознанно. Спорили, подходит ли GPL для модов, которые работают внутри закрытого движка как библиотеки; как альтернативу предлагали LGPL. Лицензия не помешает кому-то присвоить ваш код, но даёт вам основания, а сообществу — понятное правило.
Обфускация и исключение для античитов
Foxpaw и другие обсуждали запутывание кода: бессмысленные имена, пустые функции и параметры. Ответ Mychaeel: это мешает понять код, но не использовать его, а декомпилированный байт-код и так читается тяжело. В Deus Ex античит-мод DXMTL пошёл дальше, а позже утилита ModProtector повторила его приём: заполняет таблицу имён непечатаемыми символами, и UTPT показывает одни квадратики.
Xian, автор античитов, привёл самый сильный довод за сокрытие. Когда каждая проверка читается, авторы читов точно знают, что обходить, а один публичный туториал по обходу порождает десяток читов. Для античитов и кода безопасности админки обфускация покупает время, даже если не защищает полностью.
Когда код всё-таки крадут
MadNad (Excessive) и El Muerte (ServerAdds) рассказали о реальных кражах: мод перекомпилирован под другим именем, из readme удалён автор. Помогло в итоге сообщество: игроки и сайты подняли шум и вернули авторство. Взгляд El Muerte: сцена моддинга Unreal живёт как open source, люди помогают друг другу, пока вы отвечаете тем же.
Практические правила для моддеров Killing Floor
- Читать код, чтобы учиться, нормально. Вставлять его в свой релиз без спроса — нет. Большинство авторов ответят «да», если им написать.
- Указывайте авторов и сохраняйте заголовок с лицензией во всём, что основано на чужом коде, включая декомпилированный.
- Выпускаете мутатор — прикладывайте исходники или хотя бы не вырезайте их. Серверы KF живут годами, авторы уходят, и пакет с исходником — единственный способ, чтобы его потом кто-то починил.
- Если защита действительно нужна (античит, инструменты админа), смиритесь, что вырезание и обфускация только замедляют. Чувствительную логику держите на сервере, куда клиенты её не получают.
- Переименовывайте изменённые пакеты, чтобы они не конфликтовали с оригиналом на серверах и в кэше клиентов.
Как это делали на серверах Killing Floor
На форуме killingfloor.ru в 2011 году scar описал, как «защитить» мутатор для ServerPerks: после компиляции запустить из System
ucc Editor.StripSourceCommandlet YourPackageName.u
pause
Перед этим обязательно сохраните исходники проекта: восстановить их из «защищённого» пакета уже не получится. Flame проверил, что editor.stripsourcecommandlet и editor.stripsource — две записи одного и того же коммандлета, результат одинаковый. LLIePLLIeHb указал на практический минус: пакет без исходников мешает компиляции других мутаторов, которые от него наследуются, поэтому его приходится убирать из EditPackages и пересобирать всё вокруг. Мнения в теме разошлись так же, как в дискуссии выше: одни были рады способу защиты, другие называли это ударом по развитию моддинга KF.