Разработка и ромхакинг > Ромхакинг
[Дэнди/NES/SMD] ROM glitcher - сделай себе хак не зная ромхакинг
Lance_Kalzas:
--- Цитата: perfect_genius от 22 Февраль 2024, 12:11:48 ---Да, проверка идеи. Но что-то затянуло и выпал из жизни уже на вторую неделю ^_^ Идеи пока не кончаются, так что может что-то из этого и выйдет.
--- Конец цитаты ---
Наверняка будет хорошая утилита, капитан Айдзен :)
Беларус учит русский:
Оказывается, такой способ хакать игру действительно работает (не во всех случаях, смотрите примеры в обновлөнной шапке) и теперь даже не требует часы поиска :wow:
Сделал новую версию, которая ищет в 2-3 раза быстрее первой версии и имеет всякие дополнительные удобства.
Сейчас буду пробовать учить программу искать константы и указатели, чтобы была альтернатива поиску в памяти и всяким гейм-гений кодам.
Беларус учит русский:
--- Цитата: Cyneprepou4uk от 22 Февраль 2024, 01:33:36 ---там лишь пару сотен опкодов (первые 2 байта), а не весь диапазон из 65536 возможных опкодов.
--- Конец цитаты ---
Я неправильно смотрел, во втором байте всө же всякие параметры инструкции типа регистров, направлений и режимов. Так что действительно по двум байтам можно определять, что это инструкция, хоть и придөтся проверять все возможные комбинации. Но пока острой необходимости в этом нет.
Razuka:
--- Цитата: perfect_genius от 20 Февраль 2024, 03:08:38 ---Программа создана в Win11, VS2022 и запакована в zip без сторонних програм самой же ОС. Но при попытке скачивания архива из интэрнэта, ОС ругается на вирусы и удаляет файл. Как назвать такое позорище приличными словами - у меня не хватает фантазии
Если кто не доверяет, то исходный код могу дать в личку.
--- Конец цитаты ---
Подтверждаю, что perfect_genius - добросовестный ром-хакер :)
Да, Антивирус может ругаться, но, вероятно, это из той же серии, что и алармы при распознавании кряков к играм.
Я уже 3 версии Глитчера скачивал с момента релиза, так что могу подтвердить безопасность архива :cool:
Cyneprepou4uk:
perfect_genius, почему бы не включить в поиск остальные команды условного перехода, а не только BEQ/BNE?
SeregaZ:
jmp еще надо :) чтоб все как у меня в декомпилере получилось.
Беларус учит русский:
Cyneprepou4uk, может и добавлю со временем, но пока не нашёл причины.
Идея была как можно меньше ломать работоспособность игры. Sharpnull предлагал трогать ещё BRA и NOP'ы, но старый алгоритм ломал инструкции блоками, подряд, поэтому это не подходило. Новый же перемешивает, поэтому можно попробовать добавить и их.
Пока буду ждать игру, к которому нельзя сделать хак трогая только BEQ/BNE.
Сейчас есть RoboCop Versus The Terminator и Battletoads, в которых не удалось отключить счөтчик очков отдельно от остального интэрфэйса, поэтому буду пробовать искать их координаты, чтобы установить его за экран.
Для инструкций "больше/меньше" не получается придумать хак.
SeregaZ, jmp сейчас тоже ковыряю. Вернее, только его адрес.
SeregaZ:
а jsr? а bgt? а dbf?
Беларус учит русский:
Все абсолютные адреса в роме, независимо от инструкции.
В итоге очередной провал, нужного не добился. Хотел сделать, чтобы в UMK3 при старте игры начинался не выбор режима боя, а Галага. Когда-то ковырял ром в отладчике и запомнилось, что легко перенаправлял экраны в друг друга меняя адреса прыжков.
Алгоритм поиска кандидатов в адреса был такой - проходим по чётным байтам рома и если этот байт - ноль, то смотрим следующие 3 байта.
Если это трёхбайтное число больше размера рома или меньше 512 (первые байты рома - векторы прерываний, прыжки на них не интересуют) - то пропускаем.
Сначала хотел собирать и перекрывающиеся кандидаты, но в итоге решил, что в любом случае повредим оба варианта и увидим результат на экране, поэтому оставил алгоритм простым.
Сначала искал момент прыжка в экран выбора режима боя. Заменял все кандидаты адресом самой первой инструкции игры. Ожидалось, что однажды нажму Start и игра покажет не экран выбора режима, а логотип Сеги. Это случилось уже примерно через 50 попыток, адрес прыжка найден? Но оказалось, что в логотип уходит и при выходе из настроек, и ещё где-то. Как так то? Я ж менял адрес только в одном месте... Выходит, что все эти экраны прыгают не на начало игры, а на код до места, где я изменил адрес.
Ок, всё равно проверим-ка изначальную идею. Теперь решил искать адрес прыжка на Галагу, нашёл быстро. Вставил этот адрес вместо прыжка на логотип Сеги и в итоге при старте происходит синий экран смерти :D
Тут пришла идея, что кандидатов лучше портить сразу адресом прыжка на Галагу, а не на логотип. Начал новый поиск и... ничего.
Видимо, перед прыжком на Галагу происходят всякие инициализации, которые пропускаются в случае старта из меню основной игры.
Впервые с начала разработки Глитчера заглянул в отладчик - а возможно ли вообще легко сделать то, что я хочу? Увидел спагетти кода UMK3 в этом месте, приуныл и решил оставить эту идею.
Далее решил искать числа в роме. Например, в Streets of Rage в начале даются 3 жизни - найти это число. Альтернатива поиску в памяти, т.е.
Не нашёл, зато нашёл континиусы, их тоже оказалось 3.
Решил снова глянуть в отладчик. Оказалось, что игра зачем-то формирует это число на ходу - вносит 1 в регистр, потом прибавляет это число на себя, добавляет ещё один 1 и раздаёт эту тройку обоим игрокам. Кто знает - что это? Защита от Game Genie? :neznayu:
В настройках можно выбрать уровень сложности, но это не влияет на количество жизней.
В итоге на эту идею тоже пока забил.
Добавлено позже:
Пока писал это, вдруг дошло, что я забыл проверять кандидаты на адреса - на чётность :facepalm:
100308 -> 65787 (отсеялось 35% кандидатов)
Вряд ли это изменит ситуацию, конечно.
Беларус учит русский:
SeregaZ, есть некоторые успехи с указателями. Алгоритм ищет группы байтов, похожие на указатели или смещения, и сдвигает их на одну позицию. В итоге в игре то спрайты персонажей меняются местами, то звуки, то ещё что. Т.е., как и писал ранее, можно будет объект/звук поменять на другой или размножить. Можешь поиграться с UMK3, может и обнаружишь нужные тебе адреса.
Примеры того, что получил (число - это номер группы указателей/смещений):
UMK3
1 - поменялось управление - подножка теперь апперкот, например. Файребол Сони тормозит, ракета Сектора тянет противника будто сетка Сайракса...
4 - У Сони не работает захват ногами. У Страйкера пистолет наносит урон только вблизи
Streets of Rage 2
1 - спрайты героев
2 - звуки в меню и падения
3 - координаты активных предметов
4 - ? (выпрыгивающие из люка сбивают других)
5 - ? (у минибосса неуязвимость на летящие ножи?)
7 - сила перекидывания?
Contra Hard Corps
7 - указатели уровней
11 - кадры анимации смены портретов
14 - спрайты состояний персонажей
Ром надо переименовать в rom.gen, он будет повреждаться и восстанавливаться при каждом нажатии. При этом серьёзных багов такой способ хака не вызывает :ohmy:
Это только проба идеи, так что текущий неудобный интэрфэйс - временный.
SeregaZ:
то есть работу с эмулятором через образ памяти внутри эмулятора ты не сделал? то есть не создавая временный файл на жестком диске.
Беларус учит русский:
Ты не ответил, в чём у тебя проблема с жёстким диском, вот и не сделал. Переходи уже на SSD, не сопротивляйся :D
Ну или создай RAM-диск.
SeregaZ:
проблемы особо как бы и нет. это просто не вежливо миллион раз создавать файл на жестком диске. память то в этом плане гораздо удобнее и быстрее и ресурс у неё куда побольше будет, чем у жесткого диска.
Беларус учит русский:
У временной памяти вообще нет ресурса, вроде бы. Или предел недостижим.
Глитчер не создаёт файлы (только при выходе), но редактирует ром, да. Сотня/две сотни изменений мелкого файла - ерунда для ресурса накопителя, он даже не заметит.
Рамдиск для тебя слишком сложно?
SeregaZ:
для меня нет. но видишь ли автор софта должен позаботиться обо всем заранее, чтобы пользователю софта было очень приятно пользоваться, без необходимости всяких танцев с бубном. а то тут получится как с той Идой... питон поставь, саму иду поставь, плагин поставь, что-то там настрой, и после один хрен оно работать с ASM68K.exe не будет. это же просто капец капецные костыли :)
особенно порадовала рекомендация про SSD. как раз таки он наоборот не любит, когда ему пишут и пишут без конца.
видимо с миром что-то не так, раз только я один понимаю этот момент :)
AnyZero:
Замечательная штука, что мне удалось в ней сделать, на получение результата примерно полчаса уходило, а то и меньше.
Beyond oasis - чит-меню(начало со всем оружием итп), неуязвимость.
Wayne's World - неуязвимость.
Life on Earth - открытие ачивок и внутриигровых роликов.
Comix Zone - неуязвимость.
И это в играх выбранных наугад.
Беларус учит русский:
AnyZero, если не шутишь, то это очень здорово! :wow: Ты первый, кто отписался, поэтому может и первый, кто им активно пользовался.
Как пользоваться - понял из описания тут или в самой программе?
Ромхакинг до этого знал?
Есть какие-то моменты, которые хотелось бы улучшить?
Было такое, что нажал не ту клавишу и пришлось откатить изменение перезапуском программы?
Что не удалось найти и в какой игре?
Смотрю, у тебя в хаках часто "неуязвимость" - а это побочный хак, эту логику не предполагалось ломать в играх. У тебя было такое, что неуязвимость появлялась только для определённых вещей и для остального надо искать новые инструкции? Или же одно изменение даёт неуязвимость ко всему?
AnyZero:
С ромхакингом я знаком, то есть быстренько сделать неуязвимость персонажу умею, тут же другой случай.
Эта программа как тумблер уже имеющихся возможностей игры, иногда скрытых (в мирах Уэйна читов нет на неуязвимость, но возможно для разработчиков был режим для теста) и даже не пробуя например скажу, что в Shining Force 2 включится возможность управления ботами с вероятностью 90 процентов, потому что там есть уже такое с помощью ввода читов.
Что не удалось найти..Сложно сказать, я же искал то что уже по-моему мнению есть и оно было :D
Сейчас вот потестил игру Batman Forever, сразу увидеть концовку - 87 шаг, 137 - чит меню.
Откатом пользовался, на автомате ошибиться можно, когда долго результат не видишь.
Чего не хватает, это кнопки 4, сделать шаг назад, без перезапуска.
Sharpnull:
--- Цитата: AnyZero от 13 Июль 2024, 14:12:15 ---С ромхакингом я знаком, то есть быстренько сделать неуязвимость персонажу умею
--- Конец цитаты ---
Значит вы опытный. Сделать нормально неуязвимость/непобедимость не всегда просто, иногда это равно бесконечному здоровью и здоровье отнимается в нескольких местах, тогда такое не получится сделать через программу как здесь. Например, я долго делал бесконечное здоровье в [3DO] Alone in the Dark, вычитание здоровья в общем коде, в итоге добавил код на месте мусора, который ставит макс. здоровье каждый раз из этого общего кода.
Вообще для меня термины неуязвимость/непобедимость/бессмертие к играм расплывчатое, можно убрать отскок от удара или чтобы провал в пропасть возвращал персонажа рядом. Ещё путаю invulnerability (неуязвимость) и invincibility (непобедимость). Занятно, что мультсериал Invincible у нас перевели неверно - Неуязвимый, но по сюжету его как раз часто побеждают и он скорее неуязвимый, возможно переводом испортили юмор или смысл.
Беларус учит русский:
AnyZero, спасибо, пункт 4 ("Отменить последний выбор") может быть сделаю в обновлении. Долго думал что выбрать (4 или перезапуск) и логика была такая, что 4-ый пункт был бы всё время на экране, хотя используется крайне редко, а перезапустить программу - дело нескольких секунд.
--- Цитата: AnyZero от 13 Июль 2024, 14:12:15 ---иногда скрытых
--- Конец цитаты ---
Вполне может и быть, но похоже, что неуязвимость к атакам можно сделать для любой игры и это легко спутать с официальным читом. А вот сейчас я завершаю ещё один инструмент, который помогает находить ресурсы игры (спрайты, анимации, поведение, приёмы, таблицы параметров, музыку...), и его первая версия уже вдруг нашла ресурсы, которые не используются в игре и могли быть скрыты самими разрабами:
--- Цитата: Je$TeR от 16 Март 2024, 00:10:09 ---Ну и слом формации поведения в одном моменте позабавил
А в другом наткнулся на неиспользованную часть графики.
--- Конец цитаты ---
Навигация
Перейти к полной версии