Автор Тема: [Дэнди/NES/SMD] ROM glitcher - сделай себе хак не зная ромхакинг  (Прочитано 30072 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2676
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
напрямую писать в эмуль было бы лучше. ничего с собой дополнительно носить не надо. типа мой редактор мог бы не создавая файл на жестком диске сразу в эмуль отправлять. с рам-эмулятор-дисками это надо устанавливать софт дополнительно. в 2025 это такое себе. хотелось бы чтоб в одном флаконе все-же было. пока поставил какой-то ImDisk Virtual Disk Driver. пока полет нормальный. но это костыльное решение все-же. большие буквы этож надо шифт жмакать. но в своей теме по программированию я жмакаю :) это в других темах без.

Оффлайн Беларус учит русский

  • Модератор
  • Сообщений: 1381
    • ВКонтакте
    • Steam
    • Просмотр профиля
Новая версия Инвертра:
-поддержка Юникода - теперь в названии рома могут быть русские буквы, иероглифы или вообще всякие смайлики
-можно закидывать ром прямо в окно консоли. Вин7 в этом случае не поддерживает ромы с Юникодом в имени рома, а Вин11 - всякие смайлы и прочую экзотику, поэтому в этих случаях придётса закидывать ром на иконку програмы
-привязка к эмулятру - теперь не надо переключатса на окно эмулятра вручную - только обратно в програму. Надо будет переназначить кнопки переоткрытия рома и загрузки сохранения на F-клавишы
-автообновление програмы - теперь не надо отключать антивирус перед скачиванием новой версии, скачивать архив с ненужным исходником, заменять старую версию новой и потом удалять архив

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5610
    • Просмотр профиля
Вин11 - всякие смайлы и прочую экзотику
Как я понял, _getwch() игнорирует символы из 4 байтов. С _cgetws_s() работает, но путь отображается в консоли и нужно нажать Enter после перетаскивания, я проверил этот код в Win10:

Оффлайн Беларус учит русский

  • Модератор
  • Сообщений: 1381
    • ВКонтакте
    • Steam
    • Просмотр профиля
Всяких get'ов - куча, а штобы не приходилось нажимать Enter после ввода - только _getch() и _getwch(), потому и выбраны они.
И почему тот же самый _getwch() работает по-разному на разных ОС?
Поэтому верю нейросети, которая упорно твердит, што это именно отличие самих ОС:
Цитата
Windows 7 и более старые версии: Консоль по умолчанию работала с кодовыми страницами (OEM-кодировка, например, CP866 для русского). При перетаскивании файла с путем, содержащим Unicode-символы (кириллица, эмодзи, китайские иероглифы и т.д.), система пыталась преобразовать этот путь в текущую кодовую страницу. Если символов не было в этой кодовой странице, они заменялись на знаки вопроса ? или искажались.

Windows 10 (начиная с версии 1809) и Windows 11: Microsoft провела масштабную работу по модернизации консоли и добавила экспериментальную поддержку UTF-8 как на уровне консоли, так и в API. Теперь, при определенных настройках, консоль может корректно принимать и отображать пути в кодировке UTF-8.

И не такая уж это проблема - пользователей Вин7 всё меньше, а всякое странное ("zß水🍌ю" - мой тэст) использовать в имени - это полная дикость.
На крайняк можно ещё скопировать путь такого рома и вставить в консоль правой кнопкой мышы. Если эта опцыя включена в настройках, конешно.

Оффлайн Беларус учит русский

  • Модератор
  • Сообщений: 1381
    • ВКонтакте
    • Steam
    • Просмотр профиля
А почему не Джава? Я сменил ник и ты сразу забыл нашы обсуждения? :ohmy:
Я ж изучаю С++, с чево бы мне изучать другое?
С ИИ ты ж намучился и начал больше писать код сам. У AnyZero вон сколько багов вылезло в "один клик". Вряд ли за месяц нейросети продвинулись сильно в этом плане.

Добавлено позже:
Забываю про тех, кто играет на железе. Поэтому добавил исправление контрольной суммы.

Оффлайн pav13

  • Пользователь
  • Сообщений: 48
  • Сэр с горы
    • Просмотр профиля
добавь возможность указать не только f-клавиши, но и комбинацию, чтобы не переназначать в эмуляторе. пытался забиндить f12 и f11, после f11 окно консоли стало на весь экран и заблокировался ввод, кроме 1/2/3. мне стало больно и дальше не осилил.

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

upd:
как основной вариант развития - сделать gui. и там клавиши указывать, выводить информацию вместо консоли, путь к ром или то же перетаскивание, указать путь к эмуляторам nes и sega, "альтабится" на окно процесса по имени exe-файла, сохранение настроек в config.ini
« Последнее редактирование: 01 Декабрь 2025, 14:12:05 от pav13 »

Оффлайн Беларус учит русский

  • Модератор
  • Сообщений: 1381
    • ВКонтакте
    • Steam
    • Просмотр профиля
Комбинацыы сделать слишком сложно (там разные сложные случаи типа "пользователь сначала нажал букву, а не модификатор"), а ещё у терминала много разных горячих клавиш, оказываетса.
Пользователю в любом случае надо найти комбинацыю для переоткрытия (это самое сложное) - там же и переназначит.
Грузить сохранение удобнее одной клавишей, и вряд ли юзер использует все F-клавишы, штобы было проблемой туда назначить.

после f11 окно консоли стало на весь экран
Мда, неожыданно. В консоли этово нет или не всегда работает, а в терминале уже имеет высокий приоритет. Заблокировать простым способом невозможно, может быть через какие-то хаки-хуки. Поэтому трюк - при нажатии F11 просто нажымаетса снова.
Буду теперь обязательно тэстировать свои поделки в них обоих.

заменит исполняемый файл даже если он переименован? то есть назад на предыдущую версию будет не откатиться
Да, как и везде уж? Зачем тебе старая версия? :neznayu:

запрос бы не помешал
Какое устройство в твоей жызни так делает? Игровые приставки? :)

как основной вариант развития
Усложнять всё - слишком легко. Гораздо интереснее всё упрощать, вот это сложно.

Оффлайн pav13

  • Пользователь
  • Сообщений: 48
  • Сэр с горы
    • Просмотр профиля
Lua скрипт для эмулятора  FCEUX
ROM Glitcher: Instruction Inverter
Инструмент для казуального поиска глитчей

303238-0


Идея Глитчера: perfect_Беларус. Реализация скрипта: pav13



Доступно на двух языках - русском и английском.
Поддержка FCEUX 2.2.3+.

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

Как пользоваться:
  • Запустить эмулятор
  • Загрузить ROM игры
  • File -> Load Lua Script
  • Выбрать файл скрипта
  • Нажать Start
  • Следовать подсказкам в консоли

Управление и другие параметры можно изменить в файле rom-glitcher-FCEUX-config.cfg.







Цитата: ... всё тот же великий человек
«Я не учитель. Я просто помогаю тебе изучать глитчи.»
« Последнее редактирование: 10 Декабрь 2025, 06:32:22 от pav13 »

Оффлайн euror

  • Пользователь
  • Сообщений: 39
  • Пол: Мужской
    • Просмотр профиля
@pav13 что я делаю не так? у меня ошибка ROM Glitcher FCEUX v0.1.1
…/rom-glitcher-fceux-0.1/rom-glitcher-fceux-0.1.lua:60: attempt to call getfilename (a nil value)

Добавлено позже:
euror, возможно старая версия эмулятора 2.2.3, я всё проверял на последней 2.6.6

пофиксил нейросеткой постоянный вызов с rom.getfilename(): , по крайне мере у меня теперь окно не вызывается постоянно с этой ошибкой :) но все равно не работает, буду дальше гонять нейронку для положительного результата.
Добавлена функция safe_get_rom_filename(), которая использует pcall для безопасного вызова rom.getfilename(). Если rom не существует или метод недоступен (например, ROM не загружена), возвращается nil без краша. Это исправляет ошибку "attempt to call field 'getfilename' (a nil value)" в строках, где вызывался этот метод (примерно строки 560 и 699 в оригинальном коде).
« Последнее редактирование: 09 Декабрь 2025, 20:55:26 от ghostdog3 »

Оффлайн pav13

  • Пользователь
  • Сообщений: 48
  • Сэр с горы
    • Просмотр профиля
обновил Lua скрипт для FCEUX

0.2.0
* совместимость с FCEUX 2.2.3+ (работает менее стабильно чем с 2.6.6)
* один русскоязычный файл скрипта для Qt и не-Qt версии
* улучшение консольного интерфейса
+ добавлена возможность сохранения модифицированного ROM
+ добавлены инструкции ветвлений: BCC, BCS, BMI, BPL, BVC, BVS
+ добавлена возможность выбора групп инструкций для поиска
+ сохранение настроек в cfg-файл (можно редактировать управление и другое)
+ добавлен режим отладки с выводом в файл
- убрано определение размера ROM по заголовку NES 2.0 (временно)


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

Оффлайн Cyneprepou4uk

  • Пользователь
  • Сообщений: 211
  • Пол: Мужской
  • Самый лысый ромхакер
    • ВКонтакте
    • Просмотр профиля
Можно добавить поддержку CDL и игнорировать незалогированные команды, если стоит цель найти что-то конкретное, а не рандомные сюрпризы. Сэкономит кучу времени при поиске.

Пример: активировать Konami Code в Contra. Запустил логгер, запустил игру, нажал Start на титульнике, загрузил 1й уровень, остановил логгер. Прогнал ром через прогу, реверснув только залогированные команды.

Оффлайн Беларус учит русский

  • Модератор
  • Сообщений: 1381
    • ВКонтакте
    • Steam
    • Просмотр профиля
Такая идея тоже была, но:
-народу интереснее искать што-то забавное
-усложнение процеса, определённые эмулятры
-што делать с проверкой контрольной суммы в случае с Сегой? Т.е. когда весь ром отмечаетса как данные.

Добавлено позже:
Но если Луа в FCEUX имеет доступ к CDL, и Genesis Plus GX тоже умеет логировать, то это дельное улучшение, да.

Оффлайн Cyneprepou4uk

  • Пользователь
  • Сообщений: 211
  • Пол: Мужской
  • Самый лысый ромхакер
    • ВКонтакте
    • Просмотр профиля
За код и данные отвечают разные биты CDL.

Прямого доступа к CDL нет в FCEUX Lua, надо искать одноименный файл в папке с ромом.

Оффлайн Беларус учит русский

  • Модератор
  • Сообщений: 1381
    • ВКонтакте
    • Steam
    • Просмотр профиля
За код и данные отвечают разные биты CDL.
Функцыя игры читает весь ром, логер весь ром из-за этого помечает как данные - разве нет? Или потом новые доступы обновляют, перезаписывает метку "данные"?

Оффлайн Cyneprepou4uk

  • Пользователь
  • Сообщений: 211
  • Пол: Мужской
  • Самый лысый ромхакер
    • ВКонтакте
    • Просмотр профиля
Ну помечает весь ром как данные, и что) это же не пометка выполненного кода. В FCEUX биты кода и данных CDL ставятся независимо друг от друга. Насчет Gens я хз.

Оффлайн pav13

  • Пользователь
  • Сообщений: 48
  • Сэр с горы
    • Просмотр профиля
Можно добавить поддержку CDL и игнорировать незалогированные команды, если стоит цель найти что-то конкретное, а не рандомные сюрпризы.
будет ли такой поиск более эффективным - однозначно да, но будет ли практичным - тут уже вопрос.
когда переглючиваются случайные инструкции в rom, то пользователю "достаётся" лишь часть из них на каждом шаге и это не так сильно ломает игру.
если обрабатывать только задействованные инструкции, то придётся буквально по несколько штук менять, чтобы игра хоть как-то "ворочалась".
опять же как ведут себя данные CDL и являются ли они частью savestate? потому как весь процесс завязан на loadstate.

Сэкономит кучу времени при поиске.
после добавления Глитчера в эмуляторы с этим проблем нет, каждый шаг это одно нажатие и доли секунды занимает.

Оффлайн Беларус учит русский

  • Модератор
  • Сообщений: 1381
    • ВКонтакте
    • Steam
    • Просмотр профиля
Тоже так думал, но штобы можно было выбирать двух одинаковых персонажей в Hard Corps - это всё ещё очень долго, чуть более 100 шагов, вот тут это сильно помогло бы.
При этом в поиске этого игра почти всё время сломанная, хуже вряд ли будет :)

как ведут себя данные CDL и являются ли они частью savestate?
Просто отбираютса инструкцыы по нему и всё, далее он не участвует и сохранки-загрузки уже не важны.

Оффлайн Cyneprepou4uk

  • Пользователь
  • Сообщений: 211
  • Пол: Мужской
  • Самый лысый ромхакер
    • ВКонтакте
    • Просмотр профиля
В FCEUX сейвы никаким образом не связаны с CDL. Но в Mesen для каждого сейва есть свой лог, если я правильно помню.