Ромхакинг

Материал из ConsolWiki
Перейти к: навигация, поиск

Ромхакинг (транслит с "ROM hacking") - это процесс внесения изменений в образ ПЗУ видеоигры с целью модификации игровых элементов.

В оригинальном РОМе перерисовали персонажей, изменили скрипт диалогов, даже музыку переписали!

Обычно модификацией увлекаются фанаты взламываемой игры, пытаясь вдохнуть новую жизнь в старые хиты, либо стремясь найти выход своим творческим амбициям, а то и создать совершенно новую игру на основе старой разработки.

РОМхакинг осуществляется при помощи шестнадцатиричного редактора (программа для редактирования нетекстовых данных) и различных специализированных утилит, таких как тайловые редакторы, упаковщики/распаковщики данных, а также специфические для конкретной игры программки (редакторы уровней и т.п.). После успешного завершения ромхакинга полученные хаки распространяются через Интернет, чтобы каждый желающий мог оценить "мод" игры, запустив его с помощью эмулятора.

Не многие из нас в детстве могли понять, о чём говорят любимые персонажи в этой игре...

Одна из наиболее популярных сфер применения ромхакинга - любительский перевод. Помимо этого, существуют так называемые хаки-"антицензоры", которые восстанавливают вырезанные при портировании/официальном переводе фрагменты игры. Неадекватная цензура частенько изменяла старые консольные игры до неузнаваемости, и большинство импортированных японских игр были в той или иной степени ущербны.

Навыки ромхакинга полезны также при планировании спидранов (speedrun - прохождение игры на скорость) и инструментально-обеспеченных прохождений (tool-assisted superplay), так как просмотр внутренностей игры зачастую помогает лучше понять, как пройти её максимально быстро/эффектно.

Ромхакинг - дополнительная степень свободы в общении человека с игрой. Он позволяет фанату увидеть/пощупать свою любимую игру в новом качестве... независимо от желания разработчиков.

Происхождение слова

Так как ПЗУ (ROM) по своему определению не подразумевает внесения изменений в хранящиеся данные, то официальных средств для создания модификаций не предусмотрено. Необходимо взломать (хакнуть) копию ПЗУ игры (сама копия в виде файла уже не Read-Only), отсюда и термин "РОМ-хакинг".

Человеку, не знакомому доселе с этим феноменом, может прийти на ум аналогия со взломом софта (cracking), что имеет под собой вполне реальные основания, но отвергается псевдопуританскими личностями, пытающимися лишний раз подчеркнуть свою полную лояльность закону. В действительности, легальность сферы обусловлена таким расплывчатым понятием, как "добросовестное использование" (fair use), когда общественная польза от ромхакинга полагается выше, чем ничтожный ущерб, нанесённый правообладателю.

Что касается словесного обозначения термина, здесь нет чёткой определённости даже в англоговорящем обществе: называют вразнобой "romhacking", "rom hacking", "ROMHacking", "ROMhacking", а кто-то просто - "hacking", ведь знающие поймут.

Сообщество

Как фанаты определённой игры объединяются в сообщества по интересам, любители ромхакинга образуют свои формы коллективов.

Многие ромхакеры объединяются в группы для достижения синергического эффекта, для решения проблем с веб-хостингом хаков/информации, для обмена наработками и создания совместных проектов, а также (в последние годы) для всевозможных побочных эффектов участия в зарекомендовавшем себя коллективе. Впрочем, некоторые особо аутичные личности предпочитают работать в одиночку - их произведения не теряются лишь благодаря посторонним сайтам-коллекторам хаков.

В ромхакерских группах не все участники обязательно являются ромхакерами - некоторые просто помогают с хостингом или администрированием сайта, другие - моральной поддержкой/потрясающими идеями вдохновляют на новые свершения, а кто-то из бывалых, уходя со сцены, остался в группе на правах уважаемого "дедушки".

Большинство хакерских групп имеют свой архив хаков с описаниями и скриншотами (иногда в архив принимаются хаки и от людей, не состоящих в группе), свой форум и, иногда, свой IRC-чат. Обычно, чтобы стать членом группы, нужно некоторое время пообщаться с участниками желаемого коллектива, а затем подать неформальный запрос на участие кому-то из авторитетных членов группы, либо получить от него персональное приглашение. Опыт ромхакинга может служить весьма веской причиной для принятия, но в конечном итоге всё зависит от группы.

В целом, внутри ромхакерских групп наблюдаются дружественные отношения, хотя на Западе уже был ряд инцидентов, когда хакер уходил из группы, переходил в другую группу, либо был выгнан из коллектива по серьёзным причинам.

В конце 90-х зазвучали термины "эму-сцена", а вслед за ними - и "ромхакинг-сцена". Таким образом некоторые активисты хотят подчеркнуть субкультурность своего занятия. Однако, если рассудить объективно, в ромхакинге даже на данный момент занято слишком мало людей, и, кроме того, особенности развития современных приставок не сулят ромхакингу особых перспектив. Тем не менее, сложившееся сообщество хорошо организовано (что неожиданно для околоигровых хобби), и большинство ромхакеров осознают своё место в нём.

Методология

Игры создаются совершенно разными коллективами, поэтому РОМы подчас ошеломляют разнообразием своей внутренней структуры. Конечно, универсальных способов хакинга не существует, но за годы существования ромхакинга был выработан ряд более-менее стандартных методов, с помощью которых можно изменить ресурсы в большинстве игр.

Теоретически с помощью ромхакинга можно модифицировать любые ресурсы, программный код и остальные элементы игры - изменить видеовставки (как отрендеренные ранее, так и построенные на движке игры), модифицировать анимацию спрайтов или трёхмерных моделей, переписать музыкальное оформление и прочее. Но далеко не у каждого человека найдётся стимул для углублённого изучения внутренностей игры, поэтому большинство ромхакеров ограничивается рядом рассматриваемых в данной статье методов, доступных практически любому желающему (благодаря готовым наработкам – документации и утилитам).

Все методы, основывающиеся на использовании опыта предыдущих поколений, принято условно называть “базовым” ромхакингом. Помимо них существует понятие обратной разработки (reverse engineering), помогающей справляться с нестандартными ситуациями и покорять новые вершины ромхакинга – в соответствии с характером работы такие действия обычно называют “экстремальным” ромхакингом.

При посещении англоязычных сайтов следует учесть, что в плане терминологии сообщество весьма разнородно, и на некоторых форумах словами "basic romhacking" могут называть что угодно, даже просто умение использовать Cheat Engine или отключать слои вывода графики в эмуляторе. Аналогом "экстремального" служат разнообразные эпитеты "Advanced hacking", "ASM Programming" и т.д.

1. Хекс-редактирование

Шестнадцатиричный редактор (по-простому - хекс-редактор) - основополагающий инструмент в репертуаре любого ромхакера. Эти редакторы можно использовать для изменения текста в игре, а также для побайтовой модификации любых других данных, формат которых можно разобрать "на глаз" (например, свойства предметов, или предустановки персонажей). В случае отсутствия более узкозаточенных утилит, хекс-редактор можно использовать практически по любому назначению - переписывать программу игры (в машинных кодах), перерисовывать шрифт (что крайне неудобно с точки зрения визуализации данных), менять карту уровня и т.д.

Просмотр текстовых ресурсов в удобочитаемом виде

Самой простейшей формой хакинга является редактирование текста в РОМе. Так как игры редко хранят свои текстовые ресурсы в ASCII, для редактирования текста в нестандартной кодировке были разработаны специальные хекс-редакторы, которым можно указать соответствие байтовых значений буквам алфавита, чтобы в дальнейшем было проще (нагляднее) редактировать текст в РОМе. Специальный файл, описывающий отношения "этот_байт=такая_буква", получил название "таблица" (table file - *.tbl), хотя по своей внутренней структуре эта таблица больше похожа на список уравнений в один столбик.

Некоторые игры используют простейшее сжатие (а точнее - оптимизацию) данных - MTE (Multi-Tile Encoding, многотайловое кодирование - одному значению байта соответствует цепочка букв-тайлов) и его частный случай - DTE (Dual-Tile Encoding, двутайловое кодирование - одним байтом описывается слог из 2 букв). Большинство шестнадцатиричных редакторов без труда справляются с чтением и редактированием текста, закодированного этим способом.

Ещё одной несложной формой хакинга является взлом палитры, при котором в хекс-редакторе модифицируются RGB-компоненты, либо другие характеристики цвета - зависит от платформы. Обычно палитра взламывается вместе с модификацией графики (перерисовкой спрайтов и т.д.) Например, поменяв палитру, всего за минуту можно превратить Марио в негра.

Шестнадцатиричный редактор - это универсальный инструмент, которым теоретически можно взломать всё. Однако, если имеются более заточенные утилиты (редактор тайловой графики, редактор скриптов конкретной игры, редактор уровней этой игры, ...), более благоразумно использовать их. Хотя существуют игры, карта уровней в которых довольно наглядно смотрится и в окне хекс-редактора.

2. Редактирование графики

Самый очевидный способ модификации игры - изменение графики. Перерисовке могут подвергнуться любые графические ресурсы - шрифт, фоновые пейзажи (BG - backround), спрайты персонажей, надписи и логотипы, текстуры к трёхмерным моделям и т.д.

Формат хранения графики сильно зависит от платформы, а также может изредка меняться от игры к игре. Тем не менее, как для растровых изображений, так и для тайловой графики существует ряд наиболее популярных форматов. Ну а неизвестный формат можно проанализировать, задокументировать и опубликовать, сделав его известным.

Просмотр графических ресурсов в легко распознаваемом виде

Тайл (tile - "плитка") - это квадратный (8x8 точек) кусочек растровых данных. Из тайлов составляются спрайты и бэкграунд (на 2D-платформах графический адаптер аппаратно поддерживал быструю работу с тайлами), поэтому для перерисовки спрайтов нужно отредактировать содержимое составляющих их тайлов (иногда ещё требуется модификация порядка следования тайлов).

Для перерисовки тайлов используются тайловые редакторы - программы, представляющие всё содержимое РОМа в виде тайлов. Таким образом, просматривая РОМ в виде массива разноцветных точек, гораздо проще найти расположение графических ресурсов. Главное назначение тайловых редакторов - обеспечить удобство и наглядность при редактировании графики. Большинство тайловых редакторов позволяют экспортировать выделенный набор тайлов в BMP для редактирования цельной картинки в любом обычном редакторе растровой графики (Paint, Photoshop). В самих же редакторах изображение можно редактировать на уровне отдельных пикселей (пиксель-арт).

С помощью взлома графики можно полностью поменять внешний вид персонажей, уровней, текстовых сообщений и т.д. - то есть серьёзно изменить игру.

В некоторых случаях требуется не просто перерисовать содержимое тайлов, но изменить порядок их отображения. Иногда с помощью хекс-редактора можно найти в РОМе ресурс, отвечающий за последовательность вывода тайлов (будь это карта тайлов или скрипт сообщений), но в других случаях ситуация переходит в лоно экстремального ромхакинга (найти и изменить код, расставляющий тайлы по экрану).

3. Редактирование уровней

Самая востребованная форма ромхакинга схожа по сути с созданием пользовательских модификаций (Mod) для популярных игр на PC - редактирование карт уровней и смена хода сюжетных событий. Для PC редакторы уровней могут выпускаться разработчиками игры, но для приставок таких прецедентов ещё не было. Первые ромхакеры редактировали уровни с помощью одного лишь хекс-редактора, затем для визуализации редактируемого массива данных стали создавать простенькие редакторы карт для себя лично.

Lunar Magic - продвинутый редактор уровней для Super Mario World (SNES)

И наконец, когда редакторы уровней самых хитовых игр были востребованы десятками начинающих ромхакеров, начали появляться довольно профессиональные утилиты для редактирования карт и настроек определённых игр, позволяющие любому желающему легко изменить ресурсы при помощи привычного пользовательского интерфейса. После этого техническая сторона вопроса отходит на второй план, предоставляя ромхакеру-новичку полную свободу для разгула фантазии. Можно усложнить карту уровня, изменить расстановку событий (events), переписать сюжет и т.д. Вкупе с экстремальным ромхакингом, а также модификацией графики (и музыки) можно изменить оригинальную игру до неузнаваемости, добавив новые черты в геймплей (превратить сайд-скроллер в паззл) и игровую атмосферу.

4. Редактирование данных

Редактирование настроек FF1 с помощью Final Fantasy Hackster

Ключевым элементом хакинга консольных игр (а особенно РПГ) является редактирование заранее установленных игровых данных, так называемых "пресетов" (preset) - ресурсов, отвечающих за характеристики персонажей, свойства предметов, баланс геймплея и т.п. Если адреса этих ресурсов в РОМе известны, можно изменить байты вручную (в шестнадцатиричном редакторе), а можно написать программку, которая представит эти байты более образно (например, в виде списка/шкалы/иконки предмета/диаграммы/набора пиктограмм), позволяя всё внимание обратить на творческую составляющую процесса.

С помощью этого метода хакинга можно изменить характеристики оружия, мощь и количество врагов, отведённое на определённый уровень время, начальное число жизней игрока и т.д. Тем самым можно не только усложнить или упростить игру, но и создать новый тип ситуаций, требующих от игрока незапланированного разработчиками решения.

5. Редактирование кода

Использование эмулятора с отладчиком для модификации нужных участков кода

Самый мощный приём ромхакинга, а возможно, и самый сложный для освоения - редактирование игрового кода (машинного кода процессора, установленного в данной приставке), на Западе иногда называемый "ASM hacking" (от "ассемблер" - язык, знание которого требуется для понимания исполняемого кода игры).

Так как код каждой игры уникален, стандартов по его модификации не существует. Необходимы хотя бы базовые знания ассемблера и архитектуры приставки - в Интернете немало информации на эту тему, поэтому единственная трудность - переварить и усвоить всё это.

Иногда усидчивость решает всё - известны случаи успешной модификации кода без малейшего понимания железа приставки - всё, что потребовалось, - три года раскопок при помощи хекс-редактора.

Более рациональные хакеры активно используют инструментарий и документацию, что позволяет добиться аналогичного результата с меньшими затратами времени и нервов.

Хотя освоить программирование на ассемблере нелегко, с его помощью можно осуществить практически любую задумку - возможности ограничены лишь способностями самого хакера. Ряд примеров применения:

  • изменить физику игрового мира
  • усложнить искусственный интеллект (AI) врагов
  • модифицировать способ вывода графики
  • модифицировать способ интерпретации игрой ресурсов из РОМа
  • разнообразить геймплей новыми фичами
  • вставить интро
  • вставить другой звуковой движок

6. Редактирование музыки

Музыкальные хаки - всё ещё редкость, так как в старых консольных играх не было стандартных методов хранения музыкальной информации, даже в рамках одной платформы. Практически к каждой игре нужен свой подход, и знания, полученные после взлома одной игры, вряд ли облегчат музыкальный взлом другой.

FamiTracker, программа-секвенсор для создания nsf-композиций в среде Windows.

Нелегко найти в РОМе данные о музыке (проще всего - методом тыка, т.е. с помощью утилит-коррупторов), но ещё труднее внести адекватные изменения в найденный набор байтов. Кроме того, немалую сложность представляет написание новой музыки/портирование музыки из другой игры - помимо необходимости наличия музкального слуха требуется с нуля разработать инструменты введения/редактирования музыкальных данных (хотя, в ряде случаев можно просто обойтись вездесущим хекс-редактором). Частично здесь могут помочь кросс-платформенные музыкальные редакторы, но без модификации кода в этом случае не обойтись.

Для некоторых старых платформ характерно использование синтеза музыки на лету, в то время как в более современных приставках игры используют заранее созданные сэмплы и потоковый звук. Если для модификации звука в современных играх достаточно найти и переписать соответствующие WAV-сэмплы, то для музыки, существующей, скажем, в виде набора команд для звукового чипа, трудоёмкость процесса гораздо выше - музыку приходится буквально программировать. Впрочем, иногда удаётся найти более простое решение (когда звуковые ресурсы хранятся в легко анализируемом виде). Тем не менее, всё это под силу лишь упёртым ромхакерам, желающим во что бы то ни стало услышать в игре свою музыку.

7. Расширение РОМа

Так как при ромхакинге игра не может быть перекомпилирована, приходится "обманывать" её код, подкладывая свои данные на место старых. Иногда новые данные не помещаются на место старых из-за возросшего объёма/энтропии. В таком случае можно разместить новые данные в другом месте РОМа, а потом либо слегка модифицировать код, отвечающий за работу с ресурсами, либо просто отредактировать таблицу ссылок (поинтеров, указателей, векторов) на ресурсы.

На практике ромхакер пытается найти пустое место в РОМе, либо расширить его (увеличив размер файла). Обычно в конец РОМа добавляются нулевые символы, которые в дальнейшем заполняются добавляемыми ресурсами.

Трудоёмкость процесса зависит от платформы - расширение РОМа для NES наверняка доставит немало головной боли (мэпперы), в то время как та же операция для SNES уже проще, а для GBA - вообще не заставляет задумываться о необходимости что-то учитывать перед расширением.

Чтобы использовать дополнительное пространство в РОМе, может понадобиться частичная модификация кода игры (чтобы игра могла обращаться к новому участку памяти), но иногда (характерно для GBA-игр) достаточно просто изменить таблицу поинтеров.

Необходимо отметить, что у этого метода есть свои физические ограничения, зависящие от пределов адресации процессора. Большинство эмуляторов в этом плане наследует приставочные ограничения, поэтому расширять РОМ до бесконечности не получится. Но так как разработчики практически никогда не используют возможности приставки до предела, у ромхакера обычно имеется определённая свобода действий.

Распространение

Когда хак готов к употреблению, он распространяется среди ретро-геймеров при помощи Internet. Общепринятым форматом хранения данных хака является IPS-патч ("patch" - обновление, исправление), который можно установить на оригинальный РОМ ломаемой игры. Установка патча - это применение указанных в патче изменений к РОМу.

Сам IPS-патч хранит информацию о различиях между оригиналом РОМа и его модифицированной (хакнутой) версией, он не содержит каких-либо данных оригинала, поэтому не применим без экземпляра ломаемой игры. Этот же факт обеспечивает легальность распространения патчей - в отличие от РОМов, патчи не содержат материала, закреплённого авторским правом за разработчиками игры.

Кроме того, патчи отличаются небольшим размером и могут применяться к любым файлам (впрочем, желаемый эффект обычно даёт только нужный РОМ, либо его версии).

Расшифровка аббревиатуры IPS определяется по-разному - то International Patching System, то Intelligent Patching System. Существуют и другие форматы патчей (APS, xIPS, ...), но пока они не приобрели широкого признания.

Обычно в архиве с патчем располагается какая-либо форма документации по хаку, контактные адреса авторов (email, www), изредка - история создания хака и т.п.

Практика

Первые ромхакеры выросли на играх для NES, поэтому ромхакинг для этой платформы принял наибольшие масштабы. NES-игры невелики по размеру, ломать их относительно легко, инструментарий для ромхакинга NES всегда имел наиболее богатые возможности (авторы эмуляторов тоже выросли на NES!).

Кроме NES среди ромхакеров популярны Super NES, Game Boy, Sega Megadrive и более старые платформы. Остальные консоли пока не очень хорошо освоены - мало информации и инструментов, но с ростом производительности PC, а также с появлением в ромхакинге игроков, выросших на PlayStation и Nintendo 64, можно ожидать хаков для новых систем.

Конечно, чаще всего выпускаются хаки для популярных игр - серии Super Mario, Final Fantasy, The Legend of Zelda, MegaMan, Pokemon и т.д. Ведь ромхакеры - это те же геймеры, которым просто хочется новых ощущений от своих любимых старых игрушек.


Ссылки

ROMhacking.net - активно живущий архив патчей, документации и т.д.

Data Crystal Wiki - информация о хаках в виде энциклопедии

ROM Hack City - ещё одна википедия

RHWiki - немецкая википедия

acmlm.org Hack Domain - ценный форум о ромхакинге

Dragon Eye Studios - подзаброшенный, но полезный сайт

Zophar's Domain - древнейший эмуляционный портал, давно не обновляется

Panicus - хостинг ряда ромхакерских сайтов

Хак UMK3 от KABAL - русские Левши