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

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

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1147
    • ВКонтакте
    • Steam
    • Просмотр профиля
Программа редактирует ром особым образом и пользователь проверяет, появилось ли нужное ему изменение. Если не появилось, то ром восстанавливается и изменяется в другом месте. Если нужное находится, то начинается удаление лишних изменений.
Сейчас программа ищет только логику типа "включилось/выключилось", "есть/нет", "случилось/не случилось", "равно/не равно" (инструкции BEQ и BNE) и переключает их в друг друга. Т.е. вряд ли найдёт скорость, цвет, параметры, координаты и т.д. Не ищет и логику "больше/меньше".
Примеры того, что удалось сделать таким способом (в скобках - количество попыток):

Что не удалось:

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

   Как пользоваться
—сохраняетесь перед условием, которое хотите изменить. В моём случае с секретными меню UMK3 и пунктами в опциях SoR я сохранился на предыдущем экране, чтобы код рисовал-обновлял нужный экран. Если сохраниться прямо на нужном экране, то каждый раз будет загружаться только этот сохранённый экран, без нужных дополнительных пунктов.
Если же нужное вам может появляться на экране в любой момент при определённом условии, тогда можно и сохраняться в любой момент - как только Глитчер переключит это условие, нужное появится сразу после загрузки сохранения.
—закидываете ром на иконку программы и открываете его в эмуляторе, загружаете сохранение, смотрите результат и выбираете подходящий пункт меню в Глитчере. Перезагружаете ром, перезагружаете сохранение, смотрите, выбираете пункт меню и так повторяете.
—при закрытии Глитчера ром восстанавливается до первоначального состояния, а поиск сохраняется, чтобы можно было продолжить потом. При этом отменяется последний выбранный пункт - это аналог Ctrl+Z для случая, если ошибочно нажали не ту клавишу. Т.е. достаточно перезапустить программу.
—если при поиске нашли что-то интересное, не связанное с основной целью, то есть два варианта:
1) сделать бэкап файла [поиск на паузе], чтобы искать потом;
2) выбрать пункт 3 и искать нужную инструкцию сейчас - этот пункт создаёт [поиск на паузе] сразу и даст вернуться к основному поиску, если в конце ничего не нажмёте и выйдете из программы.

   Подробнее про пункты интерфейса
1   баги мешают увидеть есть ли нужное изменение
2   баги не мешают увидеть, что нужного изменения нет
3   баги не мешают увидеть, что нужное изменение есть. Далее начинается удаление багов

   Как можно ускорить поиск

Програмка создана в Win11, VS2022 и запакована в zip без сторонних программ самой же ОС. Но, при попытке скачивания архива из интернета, Винда ругается на вирусы и удаляет файл - приходится выключать антивирус :debile: :crazy:
Как назвать такое позорище Мелкомягких приличными словами - у меня не хватает фантазии  :facepalm: :neznayu:
Если кто-то боится, то исходный код могу дать в личку
« Последнее редактирование: 06 Ноябрь 2024, 01:13:15 от perfect_genius »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2521
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #1 : 20 Февраль 2024, 05:12:49 »
поэтому то я и говорю что нужен эмулятор в виде дллки, чтобы подключать его к своим проектам и чтобы он работал с образом памяти, дабы не гадить на жестком диске. гадить - это не вежливо (хотя кто-бы говорил - сам так гажу в редакторе Дюны при создании экспорта в тайловую карту и сет экранов :) надо бы когданить переделать чтоб в памяти это все делалось, без временных файлов на hdd).

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #2 : 20 Февраль 2024, 12:08:23 »
Сорсы будут?)

Оффлайн Yoti

  • Пользователь
  • Сообщений: 4430
  • Пол: Мужской
  • Не тро-гай ме-ня
    • Steam
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #3 : 20 Февраль 2024, 12:44:49 »
Делал похожие проекты, в итоге все наработки отправились в Корзину. Если программа не анализирует инструкции (то есть работает поверх дизасма), то адекватный выхлоп очень низкий.

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1147
    • ВКонтакте
    • Steam
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #4 : 20 Февраль 2024, 19:08:42 »
DrMefistO, зачем? Могу дать в личку, но пока нахожу мелкие баги, т.е. код постоянно дорабатывается.
Алгоритм прост: проходит по рому по чётным байтам (Сега же) и собирает адреса байтов 0x67 и 0x66 в надежде, что это BEQ и BNE. Далее по этому массиву адресов проходит двоичным поиском - делит пополам, первый сектор инвертирует BEQ <---> BNE, опрашивает пользователя, инвертирует обратно, потом повторяет это со вторым, потом делит первый пополам, и так до конца.
Пункты:
1 - просто пропускает текущий сектор. Раз баги в секторе мешают понять есть ли в этом секторе нужная инструкция, то лучше оставить на будущее, чтобы раздробить этот сектор.
2 - в этом секторе нет нужной инструкции, удаляем его из массива.
3 - в этом секторе есть нужная инструкция, удаляем все остальные секторы.


Yoti, да, я делаю дизасэмблер для этого. Но так как до его работоспособности далековато, не выдержал вот и сделал примитивный вариант, исследовательский проект  :)
Дизасэмблер будет отличаться тем, что можно вручную инвертировать блоки кода, их условия, чтобы сразу увидеть эффект на экране, отматывать назад, пробовать поменять другие. Т.е. явно быстрее.
У тебя вообще не остались хоть какие-то записи или мысли по своим исследованиям? Было бы интересно и полезно.


Тем временем, попробовал открыть секретное меню в Streets of Rage. Игра весит ~500 килобайт, инструкций в ней нашлось ~4000.
И оказалось, что она очень хрупкая - игра почти всегда неработоспособная после порчи, постоянно убивает BlastEm.
За час и 20 минут пробежал 800 проходов и надоело, очень демотивирует  :lol:
Т.е. найти-то мог далее, но не хотелось делать 4000 проходов, как если бы просто пройтись подряд по всем найденным инструкциям.
Сейчас решил попробовать перемешать инструкции в массиве перед поиском. Может чего даст.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #5 : 20 Февраль 2024, 20:32:03 »
DrMefistO, зачем? Могу дать в личку, но пока нахожу мелкие баги, т.е. код постоянно дорабатывается.
Алгоритм прост: проходит по рому по чётным байтам (Сега же) и собирает адреса байтов 0x67 и 0x66 в надежде, что это BEQ и BNE. Далее по этому массиву адресов проходит двоичным поиском - делит пополам, первый сектор инвертирует BEQ <---> BNE, опрашивает пользователя, инвертирует обратно, потом повторяет это со вторым, потом делит первый пополам, и так до конца.
Пункты:
1 - просто пропускает текущий сектор. Раз баги в секторе мешают понять есть ли в этом секторе нужная инструкция, то лучше оставить на будущее, чтобы раздробить этот сектор.
2 - в этом секторе нет нужной инструкции, удаляем его из массива.
3 - в этом секторе есть нужная инструкция, удаляем все остальные секторы.


Yoti, да, я делаю дизасэмблер для этого. Но так как до его работоспособности далековато, не выдержал вот и сделал примитивный вариант, исследовательский проект  :)
Дизасэмблер будет отличаться тем, что можно вручную инвертировать блоки кода, их условия, чтобы сразу увидеть эффект на экране, отматывать назад, пробовать поменять другие. Т.е. явно быстрее.
У тебя вообще не остались хоть какие-то записи или мысли по своим исследованиям? Было бы интересно и полезно.


Тем временем, попробовал открыть секретное меню в Streets of Rage. Игра весит ~500 килобайт, инструкций в ней нашлось ~4000.
И оказалось, что она очень хрупкая - игра почти всегда неработоспособная после порчи, постоянно убивает BlastEm.
За час и 20 минут пробежал 800 проходов и надоело, очень демотивирует  :lol:
Т.е. найти-то мог далее, но не хотелось делать 4000 проходов, как если бы просто пройтись подряд по всем найденным инструкциям.
Сейчас решил попробовать перемешать инструкции в массиве перед поиском. Может чего даст.
Можешь создать приватный (либо публичный) реп, попробую помогать в разработке:)

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1147
    • ВКонтакте
    • Steam
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #6 : 21 Февраль 2024, 01:18:55 »
Я пока ещё не дошёл до гитхабов.
Если ты про Глитчер, то кинул исходник в личку.
Если про дизасэмблер, то он пока на паузе, т.к. на паузе - создание языка программирования, на котором и делаю дизасэмблер. А язык на паузе, потому что вот отвлёкся на Глитчер. Всё сложно :lol:
Если у тебя есть идеи, как Ида находит блоки кода, недоступные через статический анализ, то можем и поработать.

Оффлайн Yoti

  • Пользователь
  • Сообщений: 4430
  • Пол: Мужской
  • Не тро-гай ме-ня
    • Steam
    • Просмотр профиля
У тебя вообще не остались хоть какие-то записи или мысли по своим исследованиям? Было бы интересно и полезно.
Нет, это был примитивный хекс-корраптер. Там были какие-то шаблоны, но я их даже не проверил толком на работу. На их написание было потрачено менее 3 часов, так что повторяемость достаточно высокая. Ну и писалось для ФамиНЕС.

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1147
    • ВКонтакте
    • Steam
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #8 : 21 Февраль 2024, 02:53:34 »
Рандомизация списка адресов оказалась действенной, игра "ожила" и радует такими смешными глюками, что чуть смехом не разбудил спящих в такое время :rofl:
Персонажей колбасит, музыка заиграла по другому, курсор в меню взбесился и надо успеть нажать нужный тебе пункт...



А ещё надпись "Yuzo Koshiro" на заставке один раз приехала из-за экрана на своё место! Проверил японку - там тоже такого нет. Или есть?

Продолжу мучить, а потом снова попробую мучить UMK3, чтобы узнать как будут дела там с такой обновой.
Смысл перемешивания адресов есть ведь, по идее. Ведь ряд сломанных if'ов подряд в начале рома точно будут постоянно мешать запуску. А нетронутая вторая половина рома не породит разнообразие глюков.


Оффлайн Cyneprepou4uk

  • Пользователь
  • Сообщений: 205
  • Пол: Мужской
  • Самый лысый ромхакер
    • ВКонтакте
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #9 : 21 Февраль 2024, 14:21:05 »
Цитата
собирает адреса байтов 0x67 и 0x66 в надежде, что это BEQ и BNE

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

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1147
    • ВКонтакте
    • Steam
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #10 : 21 Февраль 2024, 23:21:11 »
Да тут много чего можно улучшить, добавить всякие эвристики и т.д. Но это пока лишь проверка идеи, поэтому максимально простая реализация.
Но ведь даже если прыгнуть по адресу, то любые данные там можно принять за код, т.к. у m68k занят почти весь диапазон байта?
Поэтому вижу вариант понадёжнее - посмотреть чётность адреса. Пересилил лень и проверил... и охренел 0_0

Ultimate Mortal Kombat 3 (U)
26066 -> 14919 (отсеялось 43%)

Streets of Rage (W) (REV00)
4763 -> 3838 (отсеялось 20%)

Streets of Rage 2 (U)
21432 -> 13680 (отсеялось 37%)

X-Men 2 - Clone Wars (UE)
9860 -> 8528 (отсеялось 14%)

Вообще не ожидал, что будет затронуто столько данных :ohmy:
Спасибо, что надоумил :drinks:

Оффлайн Cyneprepou4uk

  • Пользователь
  • Сообщений: 205
  • Пол: Мужской
  • Самый лысый ромхакер
    • ВКонтакте
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #11 : 22 Февраль 2024, 01:33:36 »
Я в сеге не очень разбираюсь, но судя по этому гайду, там лишь пару сотен опкодов (первые 2 байта), а не весь диапазон из 65536 возможных опкодов.

http://info.sonicretro.org/SCHG:68000_ASM-to-Hex_Code_Reference

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1147
    • ВКонтакте
    • Steam
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #12 : 22 Февраль 2024, 02:35:00 »
Там во втором байте всякие адреса и константы же, а по ссылке только случайные числа стоят, для примера. Такое как-то можно надёжно определять как инструкцию?

Тем временем, уменьшение порчи данных из-за проверки возможного адреса возможной инструкции уменьшили веселье со всякими глюками. Теперь более суровое "работает/не работает".
Сейчас побаловался со Streets of Rage 2 и он постоянно выводит красный экран. Это встроенная проверка контрольной суммы рома?
Похоже, вот и нашлась принципиальная проблема для корраптеров, раз любое повреждение рома ничего не показывает. Но нет, через сотню попыток красный экран неожиданно был побеждён и я спасся от эпилепсии. Продолжил локализовать инструкцию, пропадали всякие баги, и в итоге в конце остались примерно 6 повреждённых байтов рома, дальнейший ремонт которых снова вызывает кровавый экран. Видимо, нет одной инструкции, тут комбинация. Надо будет придумать что-то на такой случай.

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

Если уж и это не поможет открыть секретное меню в SoR1 за сотню попыток, то есть идея сделать генетический алгоритм. Такая идея возникла, когда решил перемешать список перед поиском - что, если перемешивать не только перед ним, но и во время неё? Также вспомнилась статья на Хабре, если кто не видел: Методы модификации машинного кода: «селекция» vs. «генная инженерия»

Оффлайн Lance_Kalzas

  • Пользователь
  • Сообщений: 931
  • Пол: Мужской
  • Властелин Глупости
    • ВКонтакте
    • Steam
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #13 : 22 Февраль 2024, 04:51:41 »
Похоже, вот и нашлась принципиальная проблема для корраптеров, раз любое повреждение рома ничего не показывает
В Кеге есть Autofix Checksum же :)

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2521
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #14 : 22 Февраль 2024, 05:32:36 »
после внесения изменения в ром файл - можно запускать пересчет чек суммы. но все это фигня. я ж говорю - нужен эмулятор в виде длл, чтобы не пересоздавать ром файл на жестком диске. считал один раз образ в память, издеваешься в памяти, и шлешь этот издёванный образ памяти в эмулятор, без промежуточного создания рома на жестком диске.

                  ; если был фикс чек суммы
                  If fixchecksumflag ;{
                    ; получаем новый размер файла
                    newromfilesize = Lof(#File)
                    ; прыгаем в адрес указания размера
                    FileSeek(#File, $1A4)
                    ; пишем новое значение
                    WriteBE32(#File, newromfilesize)
                    ; прыгаем в $200
                    FileSeek(#File, $200)
                    ; считаем контрольную сумму
                    CheckSumNumber.w
                    CheckSumValue.w                   
                    CheckSumValue = 0
                    While Eof(#File) = 0
                      CheckSumNumber = ReadBE16W(#File);
                      CheckSumValue + CheckSumNumber
                    Wend 
                    ; прыгаем в адрес записи контрольной суммы
                    FileSeek(#File, $18E)
                    ; пишем новое значение
                    WriteBE16(#File, CheckSumValue)
                    ;}
                  EndIf
                 
                  CloseFile(#File)
                 
                  Delay(100)
                 
                  ; запуск в эмуляторе

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

Оффлайн Lance_Kalzas

  • Пользователь
  • Сообщений: 931
  • Пол: Мужской
  • Властелин Глупости
    • ВКонтакте
    • Steam
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #15 : 22 Февраль 2024, 05:47:11 »
Вариант для тех, кому нужен хак, но не хочет учить программирование или не может найти хакера. Взамен такой способ потребует много терпения и концентрации.
Программа редактирует код в роме и пользователь проверяет изменения в эмуляторе. Так повторяется сотни раз, пока не выявится нужная инструкция. Или не выявится, если логика кода оказалась другой :debile:
Это самописный? Помню, как баловался с VineSause ROM Corruptor

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1147
    • ВКонтакте
    • Steam
    • Просмотр профиля
Re: [SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #16 : 22 Февраль 2024, 12:11:48 »
В Кеге есть Autofix Checksum же
Действительно помогло, но в нём нет перезапуска рома, только сброс консоли. Приходилось перетаскивать ром в окно эмулятора. Поищу другой.
Также похоже, что исправление контрольной суммы - не универсальное решение:
Вы проверяли ромы с красным экраном? Возможно исправление автоматически происходит. (нашёл кривой ром, автоматически не работает)

Это самописный?
Да, проверка идеи. Но что-то затянуло и выпал из жизни уже на вторую неделю ^_^ Идеи пока не кончаются, так что может что-то из этого и выйдет.



SeregaZ, спасибо, но для решения проблемы не придётся добавлять автоисправление в Глитчер, раз много эмуляторов поддерживает эту возможность.
А в чём у тебя проблема создания рома на накопителе? Всё не получается понять. Почему ты не исправляешь ром прямо в памяти эмулятора или не заливаешь его туда?

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2521
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #17 : 22 Февраль 2024, 12:51:52 »
чужая память - всегда потемки. лучше когда своя.

Оффлайн Yoti

  • Пользователь
  • Сообщений: 4430
  • Пол: Мужской
  • Не тро-гай ме-ня
    • Steam
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #18 : 22 Февраль 2024, 13:11:32 »
А в чём у тебя проблема создания рома на накопителе?
Износ целевого накопителя и потери времени на операциях ввода-вывода. Да и в целом плохая практика.

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1147
    • ВКонтакте
    • Steam
    • Просмотр профиля
Re: [SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #19 : 22 Февраль 2024, 20:25:05 »
Yoti, тоже были мысли про износ моего SSD, но почитал, что это всё мизер в отличие от постоянных записей ОС и браузера (которая сама теперь по сложности как ОС). Иначе бы среды программирования сокращали его срок и разработчики мира заметили бы и что-то предприняли.
Если уж так страшно за износ и за скорость создания рома, то можно ведь создать рамдиск. Но SeregaZ уклоняется говорить причину, спросил его уже несколько раз. Видимо, и сам не знает зачем делает :neznayu:
Так что лучше не оффтопте тут, пожалуйста.

Оффлайн Lance_Kalzas

  • Пользователь
  • Сообщений: 931
  • Пол: Мужской
  • Властелин Глупости
    • ВКонтакте
    • Steam
    • Просмотр профиля
[SMD] ROM glitcher - сделай себе хак не зная ромхакинг
« Ответ #20 : 23 Февраль 2024, 17:44:21 »
Да, проверка идеи. Но что-то затянуло и выпал из жизни уже на вторую неделю ^_^ Идеи пока не кончаются, так что может что-то из этого и выйдет.
Наверняка будет хорошая утилита, капитан Айдзен :)

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1147
    • ВКонтакте
    • Steam
    • Просмотр профиля
Оказывается, такой способ хакать игру действительно работает (не во всех случаях, смотрите примеры в обновлөнной шапке) и теперь даже не требует часы поиска :wow:
Сделал новую версию, которая ищет в 2-3 раза быстрее первой версии и имеет всякие дополнительные удобства.

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

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1147
    • ВКонтакте
    • Steam
    • Просмотр профиля
там лишь пару сотен опкодов (первые 2 байта), а не весь диапазон из 65536 возможных опкодов.
Я неправильно смотрел, во втором байте всө же всякие параметры инструкции типа регистров, направлений и режимов. Так что действительно по двум байтам можно определять, что это инструкция, хоть и придөтся проверять все возможные комбинации. Но пока острой необходимости в этом нет.

Оффлайн Razuka

  • Пользователь
  • Сообщений: 90
    • Просмотр профиля
Программа создана в Win11, VS2022 и запакована в zip без сторонних програм самой же ОС. Но при попытке скачивания архива из интэрнэта, ОС ругается на вирусы и удаляет файл. Как назвать такое позорище приличными словами - у меня не хватает фантазии
Если кто не доверяет, то исходный код могу дать в личку.

Подтверждаю, что perfect_genius - добросовестный ром-хакер  :)
Да, Антивирус может ругаться, но, вероятно, это из той же серии, что и алармы при распознавании кряков к играм.
Я уже 3 версии Глитчера скачивал с момента релиза, так что могу подтвердить безопасность архива :cool:

Оффлайн Cyneprepou4uk

  • Пользователь
  • Сообщений: 205
  • Пол: Мужской
  • Самый лысый ромхакер
    • ВКонтакте
    • Просмотр профиля
perfect_genius, почему бы не включить в поиск остальные команды условного перехода, а не только BEQ/BNE?

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2521
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
jmp еще надо :) чтоб все как у меня в декомпилере получилось.

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1147
    • ВКонтакте
    • Steam
    • Просмотр профиля
Cyneprepou4uk, может и добавлю со временем, но пока не нашёл причины.
Идея была как можно меньше ломать работоспособность игры. Sharpnull предлагал трогать ещё BRA и NOP'ы, но старый алгоритм ломал инструкции блоками, подряд, поэтому это не подходило. Новый же перемешивает, поэтому можно попробовать добавить и их.
Пока буду ждать игру, к которому нельзя сделать хак трогая только BEQ/BNE.
Сейчас есть RoboCop Versus The Terminator и Battletoads, в которых не удалось отключить счөтчик очков отдельно от остального интэрфэйса, поэтому буду пробовать искать их координаты, чтобы установить его за экран.
Для инструкций "больше/меньше" не получается придумать хак.

SeregaZ, jmp сейчас тоже ковыряю. Вернее, только его адрес.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2521
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
а jsr? а bgt? а dbf?

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1147
    • ВКонтакте
    • Steam
    • Просмотр профиля
Все абсолютные адреса в роме, независимо от инструкции.
В итоге очередной провал, нужного не добился. Хотел сделать, чтобы в UMK3 при старте игры начинался не выбор режима боя, а Галага. Когда-то ковырял ром в отладчике и запомнилось, что легко перенаправлял экраны в друг друга меняя адреса прыжков.
Алгоритм поиска кандидатов в адреса был такой - проходим по чётным байтам рома и если этот байт - ноль, то смотрим следующие 3 байта.
Если это трёхбайтное число больше размера рома или меньше 512 (первые байты рома - векторы прерываний, прыжки на них не интересуют) - то пропускаем.
Сначала хотел собирать и перекрывающиеся кандидаты, но в итоге решил, что в любом случае повредим оба варианта и увидим результат на экране, поэтому оставил алгоритм простым.
Сначала искал момент прыжка в экран выбора режима боя. Заменял все кандидаты адресом самой первой инструкции игры. Ожидалось, что однажды нажму Start и игра покажет не экран выбора режима, а логотип Сеги. Это случилось уже примерно через 50 попыток, адрес прыжка найден? Но оказалось, что в логотип уходит и при выходе из настроек, и ещё где-то. Как так то? Я ж менял адрес только в одном месте... Выходит, что все эти экраны прыгают не на начало игры, а на код до места, где я изменил адрес.
Ок, всё равно проверим-ка изначальную идею. Теперь решил искать адрес прыжка на Галагу, нашёл быстро. Вставил этот адрес вместо прыжка на логотип Сеги и в итоге при старте происходит синий экран смерти :D
Тут пришла идея, что кандидатов лучше портить сразу адресом прыжка на Галагу, а не на логотип. Начал новый поиск и... ничего.
Видимо, перед прыжком на Галагу происходят всякие инициализации, которые пропускаются в случае старта из меню основной игры.
Впервые с начала разработки Глитчера заглянул в отладчик - а возможно ли вообще легко сделать то, что я хочу? Увидел спагетти кода UMK3 в этом месте, приуныл и решил оставить эту идею.

Далее решил искать числа в роме. Например, в Streets of Rage в начале даются 3 жизни - найти это число. Альтернатива поиску в памяти, т.е.
Не нашёл, зато нашёл континиусы, их тоже оказалось 3.
Решил снова глянуть в отладчик. Оказалось, что игра зачем-то формирует это число на ходу - вносит 1 в регистр, потом прибавляет это число на себя, добавляет ещё один 1 и раздаёт эту тройку обоим игрокам. Кто знает - что это? Защита от Game Genie? :neznayu:
В настройках можно выбрать уровень сложности, но это не влияет на количество жизней.
В итоге на эту идею тоже пока забил.

Добавлено позже:
Пока писал это, вдруг дошло, что я забыл проверять кандидаты на адреса - на чётность :facepalm:
100308 -> 65787 (отсеялось 35% кандидатов)
Вряд ли это изменит ситуацию, конечно.

Оффлайн perfect_genius

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

   UMK3
1 - поменялось управление - подножка теперь апперкот, например. Файребол Сони тормозит, ракета Сектора тянет противника будто сетка Сайракса...
4 - У Сони не работает захват ногами. У Страйкера пистолет наносит урон только вблизи

   Streets of Rage 2
1 - спрайты героев
2 - звуки в меню и падения
3 - координаты активных предметов
4 - ? (выпрыгивающие из люка сбивают других)
5 - ? (у минибосса неуязвимость на летящие ножи?)
7 - сила перекидывания?

   Contra Hard Corps
7 - указатели уровней
11 - кадры анимации смены портретов
14 - спрайты состояний персонажей

Ром надо переименовать в rom.gen, он будет повреждаться и восстанавливаться при каждом нажатии. При этом серьёзных багов такой способ хака не вызывает :ohmy:
Это только проба идеи, так что текущий неудобный интэрфэйс - временный.