В середине 90-х самой крутой покупкой для ПК, помимо невероятно дорогого Intel Pentium, был привод CD-ROM. С объёмом 640 МиБ (втрое больше, чем на жёстких дисках того времени) CD открывали энтузиастам путь в мир мультимедиа: фотографии высокого разрешения 640x480 с 256-цветной палитрой, звуковые дорожки в формате VOC и «плавные» видео 240x179 с частотой 12 кадров в секунду через Video For Windows, длившиеся до нескольких секунд.
Для разработчиков игр CD-ROM оказался странным зверем. Объём диска значительно превышал количество контента, который студии успевали произвести. Несколько тайтлов — 7th Guest (1993), Wing Commander III: Heart of the Tiger (1994), Phantasmagoria (1995) — представили полноэкранное видео (в эпоху, когда анимировалась лишь часть экрана). Кто-то добавлял качественную музыку. Особенно запомнилось высказывание ведущего разработчика id Software Джона Кармака на эту тему.
От CD-игр люди ждут тонны цифровой речи и видео [...] Шутка в том, что если мы когда-нибудь сделаем CD-версию DOOM, вы получите игру и «Как снимался DOOM» — часовой документальный фильм. Джон Кармак (январь '94) для «ATARI EXPLORER ONLINE»
Хорошая идея на бумаге, но не на CD
К июню 1996 года, после трёх лет напряжённой работы, id Software закончила следующий проект — Quake. Как и с предыдущей игрой, планировалось выпустить как шареварную, так и полную версию. Поскольку шаревар занимал всего 22 МиБ, в студии решили использовать оставшееся место на диске с толком: почему не включить зашифрованные версии всего каталога игр id? Это исключало посредников и давало геймерам мгновенный доступ — один телефонный звонок и кредитная карта.
Идею реализовали. Диск анонсировали 3 июля 1996 года, а выпустили 30 августа. Хакерская группа GNOMON выпустила архив Quakecrk.zip всего 39 дней спустя. В архиве находился QCRACK.EXE — инструмент, позволяющий расшифровать абсолютно любую игру с диска.
Розничный шареварный эксперимент Quake обернулся катастрофой. Теоретически id планировала исключить розничных продавцов, позволяя геймерам купить шаревар, а затем позвонить по номеру 800, сделать заказ и получить пароль, открывающий остальную часть игры.
Но геймеры не теряли времени и взламывали шаревар, чтобы бесплатно открыть полную версию игры. Хуже того, вся рутина распределения и обработки заказов выходила из-под контроля. В отчаянной попытке id пыталась притормозить розничную шареварную схему, но было слишком поздно. На складах осталось почти 150 000 нераспроданных CD. Дэвид Кушнер (Masters of Doom)
Что же произошло на самом деле? Разберёмся детально.
Покупка диска Quake retail shareware
Благодаря архивам usenet-группы rec.games.computer.quake.misc сохранились подробные обсуждения того, как это работало. Геймер мог зайти в любой из сотен магазинов CompUSA или Computer City и купить диск за $9.95.
Упаковка была весьма качественной для шареварного продукта. На одном из экземпляров наклейка на обложке уточняет, что это «Shareware version», с инструкциями позвонить по номеру 1-800-669-9342 (он же 1-800-ID-GAMES) для разблокировки полной игры.
Этот телефонный номер до сих пор активен. Однако дозвониться до центра разблокировки уже не получится — сеть CompUSA закрылась между 2007 и 2008 годами. Вместо оператора разблокировки автоответчик пытается продать что-то из старых товаров.
При звонке оператору пользователи должны были также назвать «SOURCE CODE» — этот код не участвовал в генерации кода разблокировки. Вероятно, он служил способом для дистрибьюторов получить комиссию за транзакцию. При просмотре eBay встречается множество кодов с названиями, указывающими на прошлых и настоящих ритейлеров: 12-BSTBY (BestBuy), 24-CCITY (Computer City), 22-CUSA (CompUSA), 38-EB (Electronic Boutique), 44-FTRSP (Future Shop, Канада), 34-EGGH (Egghead Software), 56-MCTR (Media Play/Musicland).
Как это должно было работать
Первое взаимодействие с диском выглядело безупречно. Интерфейс был сделан аккуратно. Пользователи могли сразу перейти в Quake Shareware, а могли нажать на QUAKE UNLOCK.
Диск также содержал раздел ID STUFF, позволявший просматривать каталог игр id и разблокировать любую из них. Там присутствовали несколько версий DOOM, а также HEXEN и HERETIC.
После запуска процесса разблокировки интерфейс генерировал CODE NUMBER (в статье он называется CHALLENGE), который нужно было сообщить оператору по телефону. После оплаты пользователь получал UNLOCK CODE NUMBER (SERIAL). Контрольные суммы у обоих чисел снижали вероятность ошибок при передаче через примитивную телефонную связь.
Чтобы избежать replay-атак, CHALLENGE менялся при каждом запуске программы и обновлялся каждые 5 минут во время работы интерфейса.
На экране присутствовала характерная провокационная интонация раннего id Software (упоминание «тех, кто слишком жаден»). Также присутствовало предупреждение о необходимости сделать резервную копию игры после разблокировки — поскольку CHALLENGE включал элемент случайности, повторно использовать один и тот же SERIAL было невозможно.
На первый взгляд процесс выглядел надёжным. Пользователю нужно было позвонить в сервис разблокировки, чтобы получить пароль, и только с этим паролем можно было завершить разблокировку. Так что же пошло не так?
TestDrive: что внутри
Инструмент, обеспечивающий блокировку и разблокировку, поставляла компания TestDrive Corp (архивная версия сайта www.testdrive.com). Идея заключалась в том, чтобы дать игрокам возможность «попробовать перед покупкой» и сразу же приобрести полную версию программы.
Их шифровальщик умел «денатурировать» исполняемый файл .EXE: заменял первые 32 КиБ на собственный заголовок (при попытке запустить денатурированный файл появлялось сообщение «This application has been disabled»), переименовывал файл в .MJ3, шифровал исходный заголовок в файл .ST3 и выдавал «семя» (seed).
Внутри образа диска Quake shareware с помощью сгенерированной карты файлов можно увидеть по одному файлу MJ3 на каждую доступную игру. Там же, внутри архива PAGEMKR, находятся все файлы ST3. Всё необходимое для того, чтобы вернуть MJ3 обратно в исполняемый установщик игры, присутствует на диске — кроме секретного «семени», которое должно было быть производным от SERIAL.
Описанный таким образом процесс не содержит очевидных изъянов. Секретное «семя» приходило с сервера разблокировки, привязанное к паре CHALLENGE/SERIAL, которую нельзя было использовать повторно. Но хакерская команда GNOMON нашла способ обойти защиту.
Как работает QCRACK.EXE
Выпущенный 10 августа 1996 года, всего 39 дней после появления диска Quake retail shareware в магазинах, QCRACK.EXE представлял собой инструмент, автоматически генерирующий SERIAL по заданному CHALLENGE.
Участники группы GNOMON выяснили, что SERIAL, полученный по телефону, вообще не содержал никакого секрета. Это было просто подтверждение оплаты.
Программа разблокировки Quake — FLOW.EXE, поставляемая на диске, — сама по себе способна сгенерировать SERIAL из CHALLENGE. Всё, что она делает — сравнивает локально сгенерированный SERIAL с тем, который ввёл пользователь. Весь механизм защиты держался на принципе security by obscurity — секретности через неясность алгоритма.
Цепочка преобразования CHALLENGE в SERIAL выглядит запутанной, но была реконструирована в 2016 году исследователем rmolina.
- 11-значный CHALLENGE разбивается на 4-значный GAME-ID и 7-значное число, дающее OFFSET и DEPTH.
- GAME-ID индексирует зашифрованную базу данных SKU.17, которая возвращает кодовое имя (например, doom2).
- По кодовому имени извлекается 512-байтовый DOC-файл (например, DOOM2.DOC) внутри архива FLOWLIB.LIB.
- Совместно с кодовым именем и строкой "Testdrive Corp." DOC-файл преобразует жёстко закодированную 508-байтовую таблицу в таблицу из 254 16-битных значений, уникальных для конкретной игры.
- DEPTH и OFFSET проходят эту таблицу в обратном порядке, XOR-я значения с DEPTH, чтобы получить одно 16-битное значение MEM.
- SERIAL вычисляется по формуле
unlock = ((reverse7(GAME_ID) + MEM + 0x18) & 0x7F) + 0x83 * ((MEM ^ 0x1EA3) + 0x1700A1), выводимой с ведущей буквой B.
Дальше — ещё больше недочётов
Чем глубже исследовался вопрос, тем очевиднее становилось: у того, кто занимался этой системой, просто не было времени всё довести до конца.
Никогда не приписывай злому умыслу то, что можно объяснить глупостью. И никогда не приписывай глупости то, что можно объяснить нехваткой времени. Правило Фаба
Копание внутри диска Quake shareware вскрывает ещё несколько проблем.
- Часть системы разблокировки выглядит так, будто её вообще не тестировали. Final Doom не удавалось разблокировать через звонок в центр из-за банальной опечатки. GAME-ID для «Final Doom» — 12. В файле SKU.17 закралась ошибка: GAME-ID 12 указывает на кодовое имя «Final» (с большой буквы), тогда как правильным значением было «final». Из-за этого генерация SERIAL обращалась к неверному DOC-файлу. В результате возникла до боли знакомая ситуация: нелегальные пользователи получали лучший опыт, чем платящие клиенты.
- В пошаговом описании упоминается зашифрованный файл
SKU.17. Но внутри архиваFLOWDIRлежит незашифрованная текстовая версия того же самого файла —SKU.TXT. Там же находится ещё несколько TXT-файлов, соответствующих зашифрованным .17-версиям (PRODUCT.TXT, EXE.TXT). - Несколько файлов оказались временными (DM.TMP), артефактами редактора (FLOWWORK.BAK) или вовсе не использовались (ENCRYPT.EXE).
- Формат библиотеки не зашифрован и не запутан. Разобраться в формате
.DIRоказалось несложно — это давало лёгкий доступ ко всем DOC-файлам, необходимым для генерации SERIAL.