Может кто знает, или нет, здесь ведётся альтернативный лаунчер и зеркало. Так вот, сейчас я работал над портированием 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, без распаковки обоих архивов.
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. Для сравнения: у 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 во время сборки, и каждый хранит внутри дату создания:
Дата официальной сборки, 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, без распаковки обоих архивов.