Введение в хакинг ROM/RAM: Создаем Game Genie на базе SMS с помощью Lua и Python

Автор: | 02.08.2026

Старые видеоигры печально известны своей невероятной сложностью. В детстве я был поражен, когда обнаружил волшебный предмет под названием Game Genie, который позволял мне проходить некоторые игры. «Читерство», делающее игры проще, было здорово, но некоторые коды Game Genie делали их интереснее, а не просто давали бесконечные жизни. Некоторые из этих кодов изменяли игры удивительными способами, например, заставляли всех врагов бросать молотки в Super Mario Bros.

Как хакер, я обожаю делать безумные вещи с кодом не только потому, что это весело, но и потому, что это отличный способ узнать что-то новое. Я был в восторге, когда узнал, что многие эмуляторы видеоигр предлагают API для языка программирования Lua, предоставляя доступ ко всем видам функций, таким как сохранение состояний и редактирование памяти игры. Представьте, что вы открываете эти классические игры для мощи Интернета. Сегодня мы именно этим и займемся, используя API для манипуляции памятью, чтобы создать Game Genie, работающий через SMS с помощью Twilio.

— Версию эмулятора FCEUX для Nintendo с поддержкой Lua API. Мы будем использовать Windows-бинарник версии 2.2.2. Вы также можете использовать другие эмуляторы, если у них есть такой же Lua API. Этот же код должен работать для Visual Boy Advance (игры Game Boy), SNES9X (игры SNES) и других.

— Wine для запуска Windows-приложений, если вы пользователь Linux или Mac, как я. К сожалению, сейчас Lua API и инструменты отладки чаще встречаются в Windows-версиях этих эмуляторов.

— Бесплатный аккаунт Twilio и один Twilio-номер с возможностью SMS.

— Python с установленными библиотеками Flask и Twilio. Их можно установить с помощью pip.

— ROM-файл The Legend of Zelda, который мы будем использовать для тестирования. Если у вас есть игра, можно купить устройства, позволяющие извлечь ROM-файл с картриджа.

— Неутолимое желание манипулировать старыми видеоиграми и оживлять их с помощью интернета.

**Итак, наше путешествие начинается**

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

Первым пунктом в нашем инвентаре будет выбранный нами эмулятор — FCEUX. Скачайте FCEUX и распакуйте файлы в выбранную директорию, где будет жить наш проект. Если вы пользователь Windows, то все готово. Пользователям Linux или Mac понадобится установить Wine. Если вы пользователь Mac с установленным Homebrew, то можете использовать терминал для установки Wine (вам также нужно установить XQuartz как зависимость, как показано ниже). Возможно, перед установкой потребуется выполнить `brew update`.

Теперь, когда мы хорошо экипированы, давайте напишем немного кода на Lua, чтобы отбиваться от врагов. Откройте новый файл под названием «nesms.lua» в любимом текстовом редакторе. Напишем код для захвата управления выполнением эмулятора.

`emu.frameadvance()`

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

Теперь пришло время открыть FCEUX с помощью Wine. Если вы установили его через brew или другой пакетный менеджер, перейдите в директорию, где находится fceux.exe, и выполните `wine fceux.exe`, иначе просто дважды кликните на файл. Для работы кода необходимо запустить игру. Откройте ROM-файл The Legend of Zelda и запустите код, выбрав «File -> Lua -> New Lua Script Window» и перейдя к скрипту.

Звучит знаменитая победная мелодия — мы выиграли наше первое сражение. Эти очки опыта пригодятся. Теперь, когда мы знаем, как запускать код на Lua, перейдем сразу к настоящему хакингу.

**Прыгай выше, бей сильнее, живи вечно**

Наш скрипт «Hello World» хорош, но он не так волшебен, как мои детские воспоминания о Game Genie. Давайте углубимся в некоторые базовые инструменты, которые нам понадобятся для эмуляции функциональности Game Genie. FCEUX поставляется с множеством потрясающих отладочных утилит. Одним из самых важных инструментов в этом наборе является шестнадцатеричный редактор. С его помощью мы можем просматривать содержимое памяти игры в виде шестнадцатеричных адресов и значений.

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

Все двузначные шестнадцатеричные числа, которые вы видите, представляют значение в оперативной памяти игры по определенному адресу. Вы можете изменить любое значение и посмотреть, что произойдет в игре. Также можно искать определенные последовательности значений. Посмотрите этот пример, чтобы увидеть шестнадцатеричный редактор в действии: найти байты, соответствующие таймеру в Super Mario Bros, и изменить время на ноль, чтобы убить Марио.

Хакинг ROM может быть довольно сложной задачей. Мы собираемся обнаружить, что для выполнения действительно крутых вещей не обязательно быть экспертом.

ROM представляет собой неизменяемое содержимое, которое вы найдете на картридже игры, тогда как RAM — это фактическая память игры во время выполнения программы. Изменения, внесенные в RAM, появляются немедленно, позволяя вносить изменения в реальном времени. Существуют карты памяти NES здесь и здесь, которые подскажут, какие адреса памяти соответствуют определенным объектам в игре.

Давайте попробуем имитировать Game Genie, «улучшая» игры с помощью скриптов на Lua. В качестве примера давайте поэкспериментируем с одной из моих любимых игр всех времен — оригинальной The Legend of Zelda. Используя эту карту RAM, мы будем редактировать определенные значения, чтобы получить забавные эффекты.

Откройте новый файл в текстовом редакторе и добавьте несколько примеров односрочных скриптов для изменения значений RAM и посмотрите, что произойдет. Для работы этих скриптов необходимо запустить ROM The Legend of Zelda в FCEUX и начать новую игру.

Вы увидели, что мы можем сделать с помощью небольшого кода на Lua. Но здесь становится одиноко, поэтому давайте вооружимся. Вместо меча нашим оружием будет возможность общаться с другими языками программирования. Я не очень хорош в Lua, но обожаю Python. Разве не было бы круто манипулировать памятью игры с помощью Python?

Наши скрипты на Lua работают в среде, предоставляемой эмулятором, но мы можем открыть их для внешнего мира несколькими способами. Мы могли бы использовать сокеты или реализовать HTTP-сервер, но давайте пока просто воспользуемся текстовыми файлами.

Вернемся к файлу «nesms.lua» и добавим функцию для чтения текстовых файлов:

Мы будем использовать эту функцию в нашем цикле кадров для прослушивания изменений в двух текстовых файлах: «address.txt» и «value.txt». На каждом кадре мы будем считывать шестнадцатеричную строку из каждого из этих файлов и записывать содержимое value.txt в адрес памяти из address.txt. Давайте добавим это в nesms.lua.

Давайте проверим, работает ли этот код. Запустите новую версию нашего скрипта в эмуляторе и добавьте несколько шестнадцатеричных чисел в файлы, используя ранее упомянутые карты RAM для выбранной вами игры. Попробуем еще один пример с Zelda:

— Загрузите ROM Zelda, если он еще не открыт. Пройдите экран выбора файла и убедитесь, что Линк находится на открытом мире.

— Откройте «address.txt» и напишите «0600» (и ничего больше) в текстовом файле.

— Откройте «value.txt» и напишите «40» (и ничего больше) в текстовом файле.

— Сохраните оба файла и запустите «nesms.lua» в FCEUX.

— Послушайте, как музыка изменится на мелодию подземелья.

**«Вооружаемся» с Twilio и Flask**

Теперь мы можем получать входные данные от других программ, включая вывод терминала роботов доктора Вайли. Идея заключается в том, чтобы оставить наш скрипт nesms.lua работающим и манипулировать памятью игры всякий раз, когда изменяются эти текстовые файлы. Давайте сделаем это еще круче, настроив Twilio-номер, который будет принимать SMS с адресами памяти и значениями для записи в эти текстовые файлы.

Сначала вам нужно создать аккаунт Twilio, если вы этого еще не сделали, и приобрести номер телефона. Мы настроим Flask-приложение для получения запросов от Twilio после настройки нашего номера. Вот как можно купить номер телефона:

Чтобы получать сообщения, давайте создадим веб-приложение на нашем локальном компьютере, которое будет отвечать на HTTP-запросы. Мы будем использовать веб-фреймворк Flask для Python, потому что он легкий и простой в настройке. Сначала установите Flask и Twilio с помощью pip. Мы сделаем это в виртуальном окружении, чтобы не мешать другим программам на вашем компьютере. Если вы не знакомы с pip и virtualenv, ознакомьтесь с этим замечательным руководством по настройке окружения Python.

Перейдите в директорию вашего проекта, создайте виртуальное окружение и активируйте его.

Затем установите Flask и Twilio, чтобы мы могли написать код.

Откройте файл под названием «app.py» в той же директории, что и ваш скрипт на Lua, и попробуйте следующее:

Теперь, когда у нас есть простое Flask-приложение, давайте его запустим:

Посетите http://localhost:5000 в веб-браузере, чтобы убедиться, что все работает.

Давайте создадим маршрут в нашем приложении для ответа на вебхук, который Twilio отправляет при получении сообщений. Мы будем ожидать сообщения в виде четырехзначного шестнадцатеричного адреса и двузначного шестнадцатеричного значения, разделенных пробелом. Это потребует использования библиотеки Twilio для Python для генерации TwiML для ответа на сообщение.

Теперь нам нужно открыть наше локальное окружение для Интернета, чтобы Twilio мог видеть наше веб-приложение. Ngrok — отличный инструмент для этого. Я бы объяснил, как работает ngrok, но мой друг Кевин уже написал отличный (и тематически подходящий) пост, подробно описывающий этот процесс. Как только вы настроите ngrok, вы можете запустить его для прослушивания порта, на котором работает ваше Flask-приложение, в нашем случае это порт по умолчанию 5000.

Вы должны увидеть экран, похожий на этот, с сгенерированной ссылкой, по которой мы можем перейти, чтобы получить доступ к нашему Flask-приложению:

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

Продолжая наш предыдущий пример, откройте ROM Zelda в эмуляторе и убедитесь, что весь ваш код запущен. Отправьте сообщение «0600 10» на ваш Twilio-номер, и это должно изменить музыку на тему финальных титров.

Вот пример сообщения, которое принимается и вносит изменения в Super Mario Bros, чтобы показать, что это работает с любой игрой.

**Но наша принцесса в другом замке**

Вот поворот: мы **не** просто реализовали Game Genie. Возможно, вы заметили, что все эти произвольные шестнадцатеричные значения не похожи на те любимые 8-значные коды из прошлого. Все это было просто развлечением с низкоуровневыми манипуляциями с памятью.

С настоящим Game Genie игрок вводит 6- или 8-значный код из, казалось бы, произвольных букв. Он проходит через шифр и преобразуется в шестнадцатеричный адрес и значение. Аппаратное обеспечение Game Genie перехватывает чтения памяти из игровой консоли и отвечает значением, которое представляет код. Вот довольно хорошее объяснение этого процесса с примерами кода на C.

Game Genie работает, перехватывая чтения из ROM. На самом деле он **не** манипулирует RAM, как это делали мы. Но идея та же: манипулирование адресами памяти в игре и замена их содержимого другими значениями для получения желаемых результатов. Lua API на самом деле дает нам возможность обойти это вручную. Мы можем взаимодействовать с кодами Game Genie напрямую с помощью `emu.addgamegenie`.

Конечно, мы можем напрямую добавлять читы Game Genie в наш эмулятор, но разве вы не рады, что сначала изучили основы редактирования шестнадцатеричных значений и манипуляций с RAM? Путешествие приносит удовлетворение так же, как прохождение каждого уровня в Mario, несмотря на то, что принцесса находится только в последнем замке. Но теперь давайте пройдем этот последний замок, добавив возможность принимать коды Game Genie напрямую через SMS. Вернемся к файлу `nesms.lua`

и внесем эти изменения:

Теперь наш скрипт на Lua проверяет файл `cheat.txt`

на наличие новых кодов Game Genie. Давайте завершим остальное, вернувшись к нашему app.py и добавив это в Flask-приложение:

И на этом мы закончили. Запустите наше Flask-приложение и наш скрипт на Lua снова и попробуйте отправить сообщение «IZLZZZ» на ваш Twilio-номер во время игры в Zelda. Это заставит врагов появляться, когда вы будете проходить сквозь стены. Это может плохо закончиться для Линка.

**Утреннее солнце рассеяло ужасную ночь**

Когда я занимаюсь хакингом старых игр, я чувствую тот же восторг, что и в детстве, используя Game Genie для развлечения с моими картриджами Nintendo. Теперь, когда мы рассмотрели основы хакинга ROM/RAM, я надеюсь, что вы сможете получить такое же удовольствие. Как Саймон Бельмонт с восходом солнца, когда его враждебные враги исчезают, теперь вы можете вооружиться. С помощью небольшого скрипта на Lua, работающего в вашем эмуляторе, вы можете взламывать классические игры с помощью любого языка программирования. Теперь возможности безграничны, ведь мы подключили старые видеоигры к мощи Интернета.

Вы можете:

— Заставить Марио звонить вашему бывшему.

— Обменивать биткоины на рупии в Zelda.

— Заказать пиццу с помощью Майка Тайсона.

Какие безумные идеи можете придумать вы?

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

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

— Email: sagnew@twilio.com

— Twitter: @Sagnewshreds

— Github: Sagnew

— Twitch (стримы живого кода): Sagnewshreds