Электронная библиотека

Хакер


Хакер

Редактирование сэйвов

Xakep, номер #009, стр. 009-076-1


На этот раз я расскажу о становящимся все более и более редком методе хака игр - потрошение сохраненок, или, как их еще нередко называют, сэйвов. Тут можно провести параллели с редактированием оперативной памяти (смотри пред. номера Х), но жизнь осложняется тем, что если в памяти-то все известно - как она и что, то тут мы подчас сталкиваемся с буйной фантазией программистов игры, а это может быть несколько похуже фантазии авторов операционной системы (к ней-то мы хотя бы привыкли :). Ну да боги с ней, с операционкой, интереснее посмотреть, что можно натворить с конкретной сохраненкой... Так, что тут у меня на винте... Might&Magic VII? Вот и отлично. Итак, дорогой читатель, погружаемся в структуру сэйвов M&M VII.

Что из себя представляет ЛЮБОЙ сэйв? Игрок ведь ходит, нажимает на кнопки (события - те же кнопки), собирает некоторые драгоценности тоннами... а, ну да, строит\разрушает что-то там такое в произвольном порядке. В сэйве все это и зафиксировано, как в кэгэбэшном досье: куда ходили, что нажимали и сколько тонн подняли. Беда в том, что все это записано в неизвестном порядке, а именно его, собственно, и предстоит хакать. Причем хакать приходится в основном ручками: иные программисты такой формат сэйва намутят, что ни в какие рамки не лезет. И поэтому на сегодня программ, позволяющих раскрывать сохраненку более-менее на автомате, нет. Не сложился, так сказать, стандарт. Есть, правда, Savegame Editor Construction Kit (www.gamehacking.com/subpages/tools/savgconst.shtml) - вещь неплохая, но, собака, на немецком.

Ну да вернемся к седьмому M&M. Анализ сохраненки можно начинать с обнаружения начала логического блока данных. Например, куска данных о герое. Смотрим в файле имя первого героя (логично предположить что с него начнется информация о героях) и записываем его смещение, потом смотрим то же самое в другой сохраненке. Как видим, смещения каждый раз разные. Что это означает? Сделаем предположение, что сначала в файл пишутся всякие наши действия, а в конец дописывается блок постоянной длины и содержания - инфа о героях, деньги, еда и т.д. Для проверки предположения выдерем из двух сохраненок данные, начиная с имени первого героя и до конца... сравним полученные куски - они оказались одинаковой длины; значит, мы на верном пути. Идея выявления нужных байтиков в общем и целом та же, что и при поиске в оперативной памяти: вносим изменения, записываем их и сравниваем. Единственный облом, который нас тут поджидает, так это то, что побайтовое сравнение нужно производить с файлами одинаковой длины, а длина сохраненки в M&M VII увеличивается с каждой записью. Поэтому-то мы и будем иметь дело с теми блоками постоянной длины, которые сами выдерем при помощи Hiew или Qview. Если немного покопаться в сэйве (например, поискать деньги), то можно увидеть, что блок данных постоянной длины начинается на пару килобайт раньше имени первого героя и имеет длину 98,887 байт. Дальше все просто: записываемся, к примеру, перед тем как выучить какое-нибудь простенькое заклинаньице, кушаем книжку и снова записываемся (в другой файл, естественно). Отрезаем от конца этих двух сохраненок по 98,887 байт и сравниваем полученные филе. Видим примерно 20 различий, и первое же (0 в 1) - это то, что нам надо. Остальные - это просто инфа о месте в инвентаре и прочая лабуда. Ну вот и опаньки. Отправляемся в это место (смещение 0xF6 от имени героя) и видим, что там ну просто море ноликов и непростительно мало единичек. Поменяв с полсотни 0 на 1, мы с чистой совестью грузим этот сэйв в игре и наслаждаемся всеми доступными заклинаниями. Точно таким же методом открываем членство в Гильдиях, уровни мастерства и т.д.

Содержание  Вперед на стр. 009-076-2