Всё в худших традициях пиратских антологий:
- все стилизованные (оригинальные) установщики с красивой графикой заменены на стандартные;
- часть оригинальной музыки лежит на DVD в виде неаккуратного рипа в WAV файлы с именами вида «01-AudioTrack 01.wav»;
- во время игры мы не слышим оригинальной музыки — игре никто не сказал, что музыку нужно брать из wav файлов, а не из Audio CD, как это было в оригинальной версии;
- после установки последних официальных обновлений с сайта Microsoft игра не признаёт DVD как родной и отказывается запускаться.
Никто и не занимался адаптацией игры для DVD издания!
Потеряли исходный код? Не нашли подходящего разработчика для пары мелких правок и компиляции нового исполняемого файла? Или может быть страшная бюрократия в Microsoft, из-за которой даже мелкие и легко исправимые ошибки просто объявляются особенностью архитектуры приложения?
Все исполняемые файлы устанавливаются в расшифрованном виде без SafeDisc (защита от копирования), которая использовалась на оригинальных CD. Ok, дешифрованные версии исполняемых файлов у издателя вполне могли быть. Но что с зашитой в исполняемые файлы проверкой метки диска?
Как оказалось, всё дело в крэках!
Да-да, все факты указывают на то, что взломанные версии исполняемых файлов для этого издания были взяты из сети Интернет и… немножко отредактированы, возможно, для сокрытия этого факта.
Рассмотрим это на примере Age of Empires II: The Conquerors 1.0c. Возьмём оригинальный зашифрованный исполняемый файл age2_x1.icd — в нём отлично просматривается вся структура PE файла, а зашифрованы только некоторые участки машинного кода. Используя известные методы снятия SafeDisc получаем расшифрованный файл age2_x1.exe. Теперь у нас есть эталонный файл. Далее для исследования возьмём известный в сети NoCD для этой версии игры, судя по всему созданный в недрах уже несуществующего клана Berserkers в конце 2001 года (age2_x1_bsk.exe). Также с DVD коллекционного издания установим английскую версию The Conquerors (/AOE2CONQ/EN/setup.exe) и возьмём установленный исполняемый файл игры (age2_x1_dvd.exe).
Итак, приступим к исследованию
Сравним файлы друг с другом. Первой бросается в глаза разница в описании секций exe файла:
Как известно, имена секций никак не влияют на выполнение программы. По сути они носят исключительно информационный характер. Однако, обычно компиляторы дают всем секциям привычные имена типа «.code», «.data» и т.д. Но в оригинальном исполняемом файле некоторые секции имеют нетипичные названия «THIS_COD», «THIS_DAT» и «Inf32Dat». Скорее столь специфичные имена секций связаны с использованием SafeDisc. В файле с DVD эти секции переименованы в более привычные «.code», «.data2» и «.idata», причём очевидно, что вручную — лишние символы забиты пробелами (код 0x20), а не нулями. То есть явно кто-то открыл исполняемый файл в HEX редакторе и вручную исправил названия секций. Возможно для того, чтобы исполняемый файл выглядел более типично.
Также мы видим, что в BSK оставили немного служебной информации для SafeDisc из зашифрованного файла age2_x1.icd перед началом первой секции:
И в конце файла:
Эта информация хранится в незначащих участках файла и никак не используется игрой. Как видно, в DVD версии нет никакой служебной информации, указывающей на то, что файл ранее был защищён SafeDisc. Но в конце каждой секции есть одна маленькая зацепка.
После работы декодера SafeDisc в конце каждой секции появляется метка в виде последовательности 00 05 43 1F
. В исходном icd файле там нули. Поскольку это конец секции, для основной программы это также ничего не значит. В версии файла от BSK мы видим, что их никто не удалял (не мешают — и ладно). В версии с DVD мы видим, что они также никуда не делись.
Ну и самое интересное — сравним машинный код
Сразу же находим участок машинного кода, который отвечает за проверку наличия CD.
Эта функция начинается со смещения 485A0h
и я уже рассказывал о ней в статье о модификации этой игры. В ней описана достаточно сложная логика проверки наличия диска, но в результате функция просто возвращает 0 в случае неудачи и 1 в случае успеха. Я предлагал для патча заменить код всей этой здоровой функции на простую последовательность, всегда возвращающую 1:
xor eax, eax inc eax retn 4
Но в BSK подошли к душой к этому делу. Намётанный глаз и без дизассемблирования видит, что они заменили пару условных переходов jz (74h)
и jnz (75h)
на безусловный jmp (EBh)
и ещё много чего 🙂 Причём если дизассемблировать этот участок, можно проследить небольшой просчёт крэкера из BSK — если в реестре не будет записи с буквой диска, откуда установлена игра — код будет возвращать 0, и игра будет требовать вставить диск.
Ну а теперь самое важное — в исполняемом файле, установленном с официального коллекционного DVD, весь машинный код совпадает до байта с версией от BSK, включая (сюрприз для любителей AoC) несколько других странных патчей кода, судя по всему не относящихся к проверке диска вообще (с этим ещё предстоит разобраться):
То есть не остаётся сомнений в том, что в основу исполняемого файла для коллекционного издания лёг пропатченный файл от BSK.
И напоследок
Хочу заметить, что у меня на руках есть только официальное русское издание от «Новый Диск». Но есть все основания полагать, что и в других коллекционных изданиях проблема несовместимости игр с DVD решена подобным образом.
Данным постом я хотел лишь подчеркнуть всю комичность ситуации, когда даже официальный издатель вынужден использовать крэки, созданные вроде как «нехорошими дядями» для «нехороших целей».
Кстати да, все файлы предоставлены в ознакомительных целях. После их изучения вы обязаны их удалить.
Спасибо за внимание.
ссылка на оригинал статьи http://habrahabr.ru/post/168269/
Добавить комментарий