пятница, 11 февраля 2011 г.

Исследование файлов сохранения Doom 2

   Некоторым из нас хочется заглянуть под капот и выяснить суть работы того или иного механизма(и не только механизма). Те, кому это нравится — великие люди, ведь именно любопытство является двигателем прогресса, а не любимая всеми лень.
Любопытство иногда заставляет делать совершенно безумные и бессмысленные поступки и об одном из них, как раз сегодня и пойдёт речь.
   Как-то ожидая загрузки уровня в Сталкере, мне показалось любопытным узнать, а как именно устроен файл сохранения в играх? Конечно, мы все знаем что там содержится информация о текстурах, статических, динамических и прочих объектах. Но вот какой рисунок это имеет в байтовом представлении - это и есть цель выяснить.
К сожалению, от идеи исследования save-файлов непосредственно Сталкера, мне пришлось довольно быстро отказаться, потому что те кто играл — знают насколько невыносимо долгими там сделаны загрузки(а если ещё и машина не быстрая, то это вообще ад). Следующим вариантом была GTA: Vice City(порядок игр не случайный, именно они были у меня на тот момент на жёстком диске). С загрузками там был полный порядок, но вот копаться в почти 200 килобайтном файле(а это кто забыл, 200000 символов), мне было абсолютно не в кайф.
Остался всего лишь один вариант. Он же самый древний и самый заслуженный. Это всем известная(и пока не всеми забытая) игра DOOM 2. Это идеальный вариант для реализации сегодняшней нашей цели. Во первых, быстрая загрузка(наверное все уже проапгрейдились со своих 486-х), во-вторых, размер файла всего лишь 16 килобайт, да и его структура не очень сложная(но это уже небольшое опережение).
  Но довольно лирики, почти все действующие лица, которые будут участвовать в сегодняшнем исследовании уже были представлены ранее то есть HEX-редактор и игра Doom 2. Кроме этого, нам понадобится ещё DOSBOX, которая является довольно примитивным эмулятором операционной системы DOS. Но нам и этого хватит.
Загружаем и сразу сохраням игру. Это нужно для того, чтобы размер файла был как можно меньше(соответственно проще). В папке с игрой, тут же материализуется файл DOOMSAV0.DSG(радует глаз, что первое сохранение начинается с нуля, а не с единицы).
Теперь самое время его открыть и посмотреть какие байты он нам сможет предложить.
Как не трудно догадаться, первой строчкой идёт само название файла. Оно может быть не более 22 байт, хотя на деле и того меньше. Следом за именем файла идёт фраза «version 106», которая может и является номером версии, но на деле выполняет больше роль сигнатуры, по которой игра узнаёт свой родной файл. В противном случае, загрузка сохранения просто не состоится. Хотя кроме неё, подобных сигнатур, есть ещё несколько.
По этому результату, уже не сложно получить первое представление о стуктуре .DSG(Doom Save Game) файла, которая начинается с заголовка, но что будет дальше? Для этого за NOP`им следующую строчку которая включает в себя адреса 0x30 – 0x3f. То есть вместо нулей пищем 90. Запускаем игру и видим, что чем дальше мы двигаемся, тем больше «проваливаемся» под текстуры пола. В итоге играть становится просто невозможно. Значит в файле сохранения, хранятся также данные и о текстурах. Довольно неожиданно было встретить их уже в самом начале. Не уходим далеко от этой строки, находим значение по адресу 0x38, которое должно быть равно 00. Если изменить его на 01, то при загрузке вы не сможете не только сдвинуться с места, но и повернуться в разные стороны.
Приведу ещё несколько интересных возможностей:

Адрес Старое значение Новое значение Результат
0x54-0x56 В зависимости от игры FF FF FF Управление уровнем здоровья(может не работать)
0x58 - 0x5A В зависимости от игры FF FF FF Управление уровнем брони(может не работать)
0x60-0x62 00 00 00 FF Таблетка неуязвимости
0x64 0 0 FF Убийтво кулаком с одного удара
0x67 0 0 FF Всё в красном цвете
0x78,0x7C,0x80 0 0 FF,FF,FF Появление синего, красного и жёлтого жетонов
0xd0 В зависимости от игры FF 255 патронов на пистолет
0x128 0x0A FF Игра без оружия( War is Over)

   Как уже наверное стало понятно, всё в итоге свелось к тупому перебору значений и просмотру поведения игры. И это так и есть, только что делать, когда надо изменить, например положение игрока? На перебор всех значений уйдёт ни один день, что само по себе не может радовать(лучше эти несколько дней потратить на более интересные вещи). Для таких случаев, на помощь приходит побайтовое сравнение. Копируем файл со старым сохранением, в какую-нибудь папку, загружаемся, делаем какое-нибудь действие , сохраняемся снова и сравниваем эти два файла. Таким образом, можно довольно быстро узнать о изменениях, которым предшествовали ваши действия. Сравнивать файлы можно в любом приличном HEX-редакторе, которым несомненно является WinHex. Даже при небольшом перемещении, оказалось, что найдено 87 изменений. Значит на те места, надо обратить бОльшее внимание.
Возможно кому-то покажется бессмысленной, сегодняшнее действо. Отчасти это так и есть, но возможно это натолкнёт кого-нибудь на более правильные мысли. Удачи!
   P.S. Напоминаю, что целью данной заметки, была не научить, а вдохновить на какие-нибудь собственные исследования или эксперименты.