[NES Ромхакинг]
Урок № 4. Азы использования Code/Data LoggerВ данном уроке мы рассмотрим азы использования такой встроенной во FCEUX утилиты, как
Code/Data Logger. Да-да, именно азы, поскольку о возможностях Code/Data Logger можно говорить много, а у меня нет достаточно времени, чтобы расписать принцип нахождения того или иного типа данных с его помощью.
Как вы уже поняли,
Code/Data Logger - вещь довольно удобная и хорошая. "Для чего
она нужна?" - спросите вы. Отвечаю: с помощью данной утилиты вы получаете возможность
отыскать любой тип данных в роме, используемый в конкретный промежуток времени, без дизассемблирования рома и прибеганию к помощи сторонних программ. Хотя, в Help-е эмулятора сказано, что его можно использовать как со встроенными, так и со сторонними прогами и утилитами (какими - прочтёте позже)... Какие конкретно данные можно отыскать с помощью
Code/Data Logger?
Код, выполненный во время записи логгером, строение уровней, палитры, музыку, звуковые эффекты, PCM сэмплы, графику, что отображается на текущем экране, кадры анимации, строение блоков уровней и т.д.. Что ж, раз уж мы выяснили, что эта утилита может делать - перейдём непосредственно к ней. Только для этого вам всё равно придётся открыть игру через
FCEUX (если просто открыть FCEUX - эти опции будут неактивны). И, чтобы вас порадовать, возьмём какую-нибудь хорошую игру на NES, в которую играло большинство геймеров 90х - игру Aladdin... Нет, не тот официальный отстойный порт с Nintendo GameBoy! Речь пойдёт о самой известной версии в странах СНГ - SNES-овском порте Aladdin, сделанным китайской конторой Hummer Team. О да, вы в предвкушении великих дел!.. Спешу вас огорчить: на самом деле использование
Code/Data Logger хоть и облегчает работу в отыскании нужных данных - сам процесс взлома игры займёт у вас немало времени хотя бы потому,
сколько всего вам придётся переделать, чтобы заставить оригинальную игру выглядеть совершенно по-другому, как будто это её сиквел. С другой стороны, данный урок поможет вам понять азы работы с данной утилитой.
Теперь скачиваем и открываем файл Aladdin_(Unl)_[p1][hM04]. Можно другой, не столь важно. Открываем его и нажимаем "start". И, как обычно, мы видим типичный экран, где Ал стоит перед бочкой, за которой чуть дальше находится стражник, желающий его проучить.
Самое время перейти к
Code/Data Logger. Заходим в
Debug->Code/Data Logger. Перед вами появляется это окошко:
Это - весь интерфейс данной утилиты. Вверху видно количество данных графики и кода, записанные и не записанные логгером в данный момент времени. Запись пока ещё не велась, так что пока всё по нулям (кроме not logged). Сразу скажу, что вам эти цифры не очень нужны, поэтому можете не обращать на них внимания. Чуть ниже сама утилита подсказывает вам, что же нужно с ней делать. Нажимаете "Start", чтобы записать данные, и "Pause" - чтобы поставить запись данных на паузу. После того, как вы запишите необходимый отрезок уровня/экрана - не забудьте нажать на паузу, иначе данные будут продолжать записываться. Ниже уже установлены флажки для автосохранения *.cdl файлов на компьютере. После записи, данные будут сохранены в файл (хотя, по факту, *.cdl файл создаётся автоматически при открытии логгера). Также вы можете сбросить данные лога после записи, если вы ими уже воспользовались и они вам уже не нужны, сохранить, а также загрузить уже имеющийся файл логгера при следующем запуске FCEUX.
Итак, вы готовы? Жмём "Start"... и понеслась!
Сворачиваем логгер, чтобы он не мешал, доходим Алом до стражника, мочим его и жмём на паузу, также запаузим логгер. Теперь идём искать в записанных данных экраны уровней. Открываем HEX Editor, выставляем View->ROM File и начинаем поиск блоков, из которых состоят экраны уровней. К счастью, долго нам искать не приходится - данные стартового экрана начинаются по адресу 000b00. Как вы видите, использованные данные выделены синим цветом:
Открываем
Help->Help..., в поиске вбиваем "Code/Data Logger" и тут же находим про него краткое описание:
Здесь сказано, вместе с какими программами и утилитами его можно использовать. Также можно прочесть, каким цветом обозначается тот или иной байт. Тёмно-жёлтый - байт-код, синий - данные (чисто данные), сине-зелёный - данные PCM-сэмпла (только в играх, в которых он есть), зелёный - байт является и частью исполняемого кода, и в то же время - данными. Самое интересное, что этот текст из хелпа даёт исчерпывающий ответ на то, что в итоге после записи вы получите и что примерно нужно искать. От себя лишь скажу, что данные уровней, надписей, музыки и звуковых эффектов (кроме PCM)
всегда отображаются синим цветом.
Вернёмся к хекс-редактору. Если присмотреться, то можно заметить, что код перед вами повторяет экран, который вы записали. Найдём блоки, из которых состоит бочка перед Алом. Бочка стоит немного выше песка, на котором стоит Аладдин (байт E8). Соответственно, низ бочки - это 4E и 4F. Смотрим, что отвечает за фон и убираем бочку с прохода, затем сбрасываем игру:
Хочу отметить, что ниже бочки значится байт EF. Чтобы Аладдин не втыкался в пустоту и не проваливался с последующим зависанием игры, мы точно так же должны сделать землю, чтобы Ал мог проходить свободно на том месте, где раньше была бочка. Теперь, чтобы срезанное место выглядело как положено - проходите игру дальше двойных бочек и доходите до экрана, где торчит вкопанная в землю палка. Вернитесь немного назад, убейте стражника, включите логгер снова и пройдите до палки опять. Снова запаузите логгер и сверните его. Прокрутите хекс ещё немного, и - опа, вот оно где всё находится. Нужные нам байты для угла здания находятся по адресу 000eba, и это байты 2A 2B 3A 3B 4A 4B (сверху вниз по 2 байта читать). Вписываем их так же, как и на скрине:
Пройдитесь по экрану. Ну как? Не так-то это и было сложно, да?
Сохраняем изменения через File->Save ROM (Save ROM As...), затем запускаем на любом другом эмуляторе полученный ром. Классно получилось, не так ли.
Однако это ведь только самая верхушка айсберга, учитывая объём данных, которые ещё нужно разобрать (те же байты врагов и их расположение). Научившись распознавать блоки уровней, вы сможете только переставлять эти самые блоки на экранах (хотя, если честно, то далеко не все это умеют). Впрочем, этого вполне будет достаточно, чтобы изучить данные блоков уровней и поупражняться в их распределении.
Благодарю за внимание!