Загруженные изображения

Может кто знает, или нет, здесь ведётся альтернативный лаунчер и зеркало. Так вот, сейчас я работал над портированием Galaxy, под зеркало. И вот тут, возникла очередная проблема с подделыванием мода. На этот раз: Ender IO. Информацию об этом я вложил в .md файл, читать с любого Markdown ридера. Там как раз прописано и то, как самим проверить подделывание мода. Аой. А тут нельзя прикрепить подобный файлик. В таком случае, пропишу информацию ниже, это будет неудобнее для прочтения, но что поделать:

Ender IO в клиентах: что за версия и что с ней сделали

В клиентах едет Ender IO, объявляющий себя версией 5.2.0. Такой версии не существует: релизы для 1.12.2 идут 5.2.56, 5.2.57, 5.2.59, 5.2.60, 5.2.61, 5.2.66, дальше линейка 5.3.x. Ниже разбор, что это на самом деле за сборка и чем она отличается от настоящей.
Файл один и тот же в разных сборках: в Galaxy и TechnoMagic лежит джарка с одинаковым sha1.

Как определялась настоящая версия

Номер версии в моде хранится в трёх местах, и только первое правится текстовым редактором:
  • mcmod.info, обычный текст;
  • аннотация @Mod в скомпилированном классе, то есть строка в constant pool;
  • META-INF/fml_cache_annotation.json, кеш аннотаций, который генерирует ForgeGradle при сборке.
Дальше содержимое сверяется с официальными релизами по CRC каждого файла внутри архива. CRC уже посчитаны в zip, так что распаковывать ничего не нужно и сравнение идёт быстро даже по двум десяткам версий подряд.

Это 5.2.61

Сравнение со всей линейкой 5.x дало однозначный ответ. По составу файлов джарка совпадает с релизом 5.2.61 полностью:
версия    файлов   общих    байт-в-байт   только в клиенте   только в релизе
5.2.61      3853     3853          3795                  0                 0
5.2.60      3851     3851          3764                  2                 0
5.2.59      3841     3838          3587                 15                 3
5.2.56      3841     3838          3585                 15                 3
5.1.55      3813     3806          3347                 47                 7
5.0.50      3654     3598          2792                255                56
Ни одного лишнего или недостающего файла с любой стороны только у 5.2.61. Для сравнения: у 5.1.55, ближайшей из предыдущей линейки, расхождений втрое больше.

Что именно изменено

Из 58 различающихся файлов:
Строка версии переписана с 5.2.61 на 5.2.0 в одиннадцати классах модулей (базовый, машины, кондуиты, интеграции с TiC, Forestry, AE, RS, OpenComputers), в Config.class, в mcmod.info и в кеше аннотаций. Размеры этих файлов на байт-два меньше оригинальных ровно потому, что 5.2.0 короче, чем 5.2.61.
Архив переподписан. У Ender IO на каждую сборку выписывается одноразовый самоподписанный сертификат сроком на 90 дней, так что по нему нельзя судить об авторстве: такой выпишет кто угодно. У официального 5.3.72 это CN=Bell Master, выписанный в день релиза, у джарки из клиента CN=Ford Doctor от 22 февраля 2021.
Испорчена кодировка. В assets/enderio/lang/en_us.lang во всех 165 строках, где встречается символ форматирования §, он превратился в В§. Это UTF-8, прочитанный как CP1251 и сохранённый обратно. Видно в игре: лишний символ перед каждым цветовым кодом в подсказках десятков предметов. Та же порча попала в одну строку внутри ItemCapacitor.class.
Это не осознанная правка, а последствие пересохранения файла в неверной кодировке. Чинить некому: официальной сборки с номером 5.2.0 не существует, а значит и обновиться не на что.
Дата и часовой пояс сборщика остались в файлах рецептов. Ender IO генерирует 39 файлов рецептов в формате PDF во время сборки, и каждый хранит внутри дату создания:
официальный 5.2.61:  /CreationDate (D:20200929235851+02'00')
джарка из клиента:   /CreationDate (D:20210222153643+03'00')
Дата официальной сборки, 29 сентября 2020 года, приходится на канун публикации 5.2.61. Джарка из клиента собрана 22 февраля 2021 года, через пять месяцев после релиза, на машине в другом часовом поясе.
Кода при этом не трогали: все 3795 совпадающих файлов совпадают побайтно, набор классов идентичен, ни одного своего класса не добавлено.

Почему нельзя просто подставить настоящий мод

Две причины, и обе проверяемые.
Хендшейк. Ender IO не объявляет acceptableRemoteVersions, поэтому Forge требует точного совпадения строки версии между клиентом и сервером. Сервер сообщает enderio 5.2.0 и одиннадцать своих модулей тем же номером, так что клиент с настоящим 5.2.61 будет отвергнут при подключении.
Более новая версия тоже не подходит. В линейке 5.3 переписан сетевой слой: появился пакет ExecPacket, который регистрируется первым. Номера пакетам раздаёт счётчик по порядку регистрации, поэтому все последующие уезжают на единицу, начиная с нулевого. Клиент на 5.3.72 против сервера на этой сборке будет разбирать каждый пакет как соседний тип.
А вот настоящий 5.2.61 по сети совместим полностью: во всех пяти каналах (базовый, кондуиты, машины, powertools, OpenComputers) зарегистрированы те же пакеты в том же порядке, 37, 12, 36, 18 и 2 соответственно.
То есть подставить настоящий мод можно, но только вместе с подменой заявки в хендшейке.

Как проверить самому

Нужен любой JDK и распаковщик zip.
# настоящая версия, из кеша аннотаций
unzip -p EnderIO.jar META-INF/fml_cache_annotation.json | tr -d ' \n' | grep -o '"version":{"value":"[^"]*"' | sort -u
# дата и часовой пояс машины, на которой собирали
unzip -p EnderIO.jar assets/enderio/config/recipes/vat.pdf | grep -a CreationDate
# подпись: чья и не вынимали ли файлы после неё
jarsigner -verify -certs EnderIO.jar
# порча кодировки
unzip -p EnderIO.jar assets/enderio/lang/en_us.lang | grep -c 'В§'
Сравнение с официальным релизом делается по CRC записей внутри zip, без распаковки обоих архивов.
Создано сегодня в 00:12 | Ответить

Для ответа в этой теме войдите под своим аккаунтом или зарегистрируйтесь.

Войти на сайт