Содержание статьи
Во многих играх ресурсы упакованы в специальный файл — игровой архив. Здесь могут лежать модели, текстуры, скрипты, анимация, звуки и прочее. Некоторые разработчики не запариваются и используют ZIP, разве что для минимальной маскировки меняют расширение на какой‑нибудь произвольный набор букв.
Сейчас почти все игры делаются на одном из популярных движков, но в начале двухтысячных разработчики еще частенько делали всё с нуля. У многих фирм были свои уникальные наработки, которые ложились в основу одной или нескольких игр. Потрошить игры на таких движках намного интереснее, чем ковырять ассеты популярных движков, для которых полно готового инструментария.
SweetScape 010 Editor
Кто‑то скажет, что главный инструмент хакера — его мозги. И будет прав. Но на втором месте — удобный Hex-редактор. Я горячо рекомендую SweetScape 010 Editor. Редактор кросс‑платформенный: есть версии для Windows, Linux и macOS.
Дальше в статье я буду активно использовать встроенный Inspector, который интерпретирует байты как числа, даты или ассемблерные опкоды. Кликаешь на интересующий тебя байт и видишь, чем он может быть. Также часто бывает нужна «линейка» — выделяешь мышкой данные и узнаёшь расстояние между структурами.
Формат с кислотным привкусом
Сегодня продегустируем «Ядерный титбит», игру 2003 года, созданную при участии Дани Шеповалова.
Догадаться, какой из файлов в папке игры — это архив с ресурсами, можно, просто глянув на размеры. QUEST.
самый большой и занимает 216 Мбайт. Это явно наш клиент. Открываем его в Hex-редакторе:
0000h: 65 7A 64 FF 4D 08 00 00 3D 75 02 00 D6 9A 82 0D ezd.M...=u..Öš‚.
0010h: 64 6F 6F 72 5F 30 31 2E 6D 65 61 74 00 00 02 00 door_01.meat....
0020h: 00 00 3D 75 02 00 E1 1C 00 00 09 0A 00 00 64 6F ..=u..á.......do
0030h: 6F 72 5F 30 32 2E 6D 65 61 74 00 00 02 00 00 00 or_02.meat......
0040h: 46 7F 02 00 95 21 00 00 53 0B 00 00 64 6F 6F 72 F...•!..S...door
0050h: 5F 30 33 2E 6D 65 61 74 00 00 02 00 00 00 99 8A _03.meat......™Š
0060h: 02 00 71 20 00 00 0F 0B 00 00 64 6F 6F 72 5F 30 ..q ......door_0
Обычно первые четыре байта содержат сигнатуру формата. Здесь мы видим строку ezd.
, что совпадает с расширением файла. Значит, это сигнатура. Если нет явных противоречий, продолжаем разбор с шагом в четыре байта. Структуры часто выравниваются по INT32.
Следующие четыре байта: 0x4D080000. Программа собрана для x86, поэтому числа записаны в обратном порядке байтов. Таким образом, 0x4D080000 интерпретируется как 0x0000084D, что в десятичной системе равно 2125. Что это может быть? Возможно, заголовок архива содержит число файлов. Две тысячи — вполне адекватное число. Проверим эту гипотезу позже.
Далее идет 0x3D750200, это декодируется в число 161 085, что составляет 157 Кбайт. Это может быть размер текущей структуры или смещение начала следующей. Действительно, по адресу 161 085 заканчивается список строк, похожих на имена файлов.
Следующий DWORD — 0xD69A820D, что эквивалентно 226 663 126. Это точно размер файла — 226 663 126 байт.
0x00 657A64FF ezd. Сигнатура формата
0x04 4D080000 2125 Возможно, количество файлов
0x08 3D750200 161085 Неизвестное смещение
0x0C D69A820D 226663126 Размер файла
Опыт подсказывает, что на 16-м байте файловый заголовок заканчивается. Дальше следуют строки, перемешанные с неизвестными числами. Скорее всего, это массив структур, описывающих конкретные файлы. Попробуем определить размер и назначение всех полей.
Первая структура начинается с ASCII-строчки door_01.
. Если размер строки заранее не указан, значит, она читается до нулевого байта. До начала следующей строки 18 байт. Расстояние между случайными строками не меняется, следовательно, это значимые поля.
Сравнивая предполагаемые структуры, замечаем после каждой строки шесть неизменных значений 0x000002000000. Считаем их константой. Остается понять назначение 12 изменяемых байтов.
0x10 646F6F725F30312E6D656174 door_01.meat
0x1C 000002000000 const
0x22 3D750200 161085
0x26 E11C0000 7393
0x2A 090A0000 2569
Что сразу бросается в глаза? Во‑первых, число 161 085 совпадает со смещением из файлового заголовка. Вероятно, это адрес с данными первого файла. Следующие два числа могут быть размером и контрольной суммой. Смещение второго файла — 163 654. Вычитая смещение первого, получаем 2569. Значит, это поле с размером данных.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»