Разработка и ромхакинг > Ромхакинг

[Дэнди/NES/SMD] ROM glitcher - сделай себе хак не зная ромхакинг

(1/7) > >>

Беларус учит русский:
Ром (игра) изменяетса особым образом и пользователь проверяет в эмулятре, есть ли нужное ему изменение. Если нет, то ром восстанавливаетса и изменяетса в другом месте. Если есть, то начинаетса удаление лишних изменений.
Результат не гарантирован, но зато проверка не требует знаний и особых усилий.

Два инструмента для разных задач:
ИНВЕРТР логики Мой вариант ищет только логику типа "есть/нет", "включилось/выключилось", "случилось/не случилось", "равно/не равно" (инструкцыы BEQ и BNE) и инвертирует её. Т.е. не ищет скорость, цвет, параметры, координаты и т.д.
Примеры тово, што можно сделать таким способом (в скобках примерное количество требуемых шагов/нажатий):
Contra
Не надо набирать код Конами на 30 жызней (22)

Teenage Mutant Ninja Turtles - Tournament Fighters (NES)
Хотхэд против Хотхэда (13)

Ultimate Mortal Kombat 3 (USA)
Секретные меню изначально, без ввода комбинацыы. Оказалось, што инструкцый понадобитса две - одна отображает эти пункты меню (56), другая даёт по ним ходить (34). Обнаружылась ещё одна альтернативная, активирующая эти меню при нажатии "вниз" (127), будто набрана полная комбинацыя AC↑B↑BA↓

Streets of Rage (W) (REV00) [!]
Секретное меню выбора уровня (19)
Возможность выбрать одинаковых персонажей (48)

Streets of Rage 2 (USA)
Секретное меню выбора уровня, три инструкцыы: отображение пункта меню (83), доступ к нему сверху (156) и доступ снизу (45). Можно было ограничитса только одной стороной или вообще без отображения, но хотелось сделать красиво

Streets of Rage 3 (USA)
На этот раз аж 5 инструкцый: доступ сверху (60), доступ снизу (43), а отображение - уже комбинацыя инструкцый: нет номера уровня и пункта Exit (18) + есть номер и Exit (46) + ещё одна инструкцыя. Последнюю нашёл только предварительно изменив первые 2 инструкцыы в роме, т.к. она сама по себе, без сочетания с остальными, не находима - визуально ничево не меняет в игре

Contra - Hard Corps (USA, Korea) (En)
Выбор одинаковых персонажей - 2 инструкцыы: для нажатия "вверх"/"влево" (114) и "вниз"/"вправо" (217)
Што не удалось:
Contra - Hard Corps (USA, Korea) (En)
Бесконечные прыжки у Брауни. Ожыдал инвертировать логику типа "если персонаж прыгнул в первый раз, то прыгнуть снова" в "если персонаж прыгнул не в первый раз, то прыгнуть снова", но там што-то другое.
Зато неожыданно нашёл неуязвимость для первово игрока, хотя всегда думал, што там только логика "если получен урон, то игрок умирает", которая инвертируетса в "если не получен урон, то игрок умирает", што обычно и происходило - игрок быстро умирал

RoboCop Versus The Terminator (USA)
Не показывать количество очков во время игры. Удалось только отключить весь интрфэйс и сломать счётчик, штобы всегда оставались нули

Battletoads (World) [SMD]
Тоже не показывать количество очков во время игры. Однажды эти цыфры выровнялись по левой стороне

В случае с последними двумя играми позже дошло, што в них отображение очков никогда не включаетса/отключаетса отдельно от остальново интрфэйса, поэтому шансы были близки к нулю. Тут нужен другой подход и Инвертр для этово не подходит.
Как видно, поиск простых вещей типа хака меню требует не так много времени - около 300 шагов, каждая занимает секунд 5 или меньше. С большым шансом можно получать неуязвимость, разблокировывать што-то в меню, включать встроенные читы. Большая выгода по времени, если искать по пути сразу несколько вещей.

pav13 сделал свои версии для Сеги и NES, избавляющих от лишних действий (надо лиш нажымать одну из двух кнопок/клавиш) и это сильно ускоряет поиск. Также у ево вариантов есть выбор из нескольких групп инструкцый, если хочетса поэкспериментировать.
Мой вариант потребует ручного переключения между эмулятром и програмой и дополнительных действий в самой игре, но есть и преимущества: автообновление, свобода выбора эмулятра и сохранение изменений в роме (SMD).

У версии для игр NES от AnyZero тоже есть выбор из нескольких групп инструкцый.



ПЕРЕСТАВЛЯТЕЛЬ ресурсов [только SMD] Ищет массивы указателей, которые могут указывать на што угодно: изображения, звуки, состояния анимацый, уровни, порядок обйектов, код поведения и т.д.
В отличии от предыдущево инструмента, при поиске надо искать не конечный желаемый результат, а изменение нужново элемента.
Например, в Cannon Fodder надо, штобы при выстреле вылетали не пули, а ракеты. При поиске можно увидеть, как вместо пуль начали вылетать вертолёты, значит нужный элемент (пули) затронут и найдены указатели на пулю и вертолёты. Скорее всево, рядом с ними в массиве есть и указатели на другие обйекты, среди которых могут быть ракеты. Далее Переставлятель начинает подставлять все эти соседние указатели вместо указателя пули, штобы вы могли видеть што происходит в игре при вылете пули и дать этому название. В таком массиве именованных указателей будет легко ориентироватса и переставлять обйекты местами.

Примеры тово, што я нашёл не выискивая што-то конкретное, просто по пути:
Ultimate Mortal Kombat 3 (USA)
спрайты имён бойцов внутри полоски здоровья:

(позицыя в массиве, указатель, количество ево копий, название)

  1 270000 42  A
  2   10002 25  B
  3   30004 18  C
  4   50006 8    E
  5   70008 50  G
  6   9000a 9    H
  7   b000c 8    I
  8   d000e 9    M
  9    f0010 8    L
 10 110012 9   часть буквы
 11 130014 8   пробел
 12 150016 4   пробел, вариант 2
 13 170018 8   O
 14 19001a 6   R
 15 1b001c 9   T
 16 1d001e 7   часть буквы или кавычки
 17  1f0020 8   середина M?
 18 210022 7   часть буквы
 19 230024 5   Y


фоны и арены:

  1  4f1c2     витраж
  2  4f80c     портал
  3  4f312     мост
  4  4f49c     космос
  5  4f58c     картинка - башня Шао Кана
  6  4f614     картинка - крышы
  7  4f66e     серый одноцветный фон
  8  4f758     логотип
  9  4f866     пустыня
 10  4f974     трон Шао Кана
 11  4f9f2      ад
 12  4fa70     арена у реки (MK3?)
 13  4f6c8     экран выбора столбца
 14  4f722     экран выбора столбца 2
 15  4f7b2     логотип копия


некоторые персонажы:

  1  346c2     Кано
  2  3594e     Соня
  3  36b9a     Джакс
  4  37e30     Ночной Волк
  5  39268     Саб зиро старшый
  6  3a488     Страйкер
  7  3b6c4 2   Синдел
  8  3cabc 3    Сектор
  9  3cabc 3    Сектор
 10  3e310     Кун Лао
 11  3f4c8      Кабал


приёмы, заканчивающиеся на:

  1  1a840 2   ?
  2  1caf4      X
  3  1cb64     A
  4  1cbd4     B
  5  1cc44     Z
  6  1ccb4     C
  7  1ca84     Y
  8  1cd24     вверх
  9  1cd94     ?
 10 1ce04     ?
(неизвестные надо бы проверить на превращениях Шан Цуна)


?:

  1   e0482      Кано - подножка
  2  10c0aa      Соня - удары
  3  13d6f2      Джакс - удары
  4  16e700     Ночной Волк
  5  19a864     Саб Зиро старшый
  6  1be08a     Страйкер - бег
  7  1ec624     Синдел - прыжок
  8  226da4     Сектор - падение на спину
  9  252ba2     Кун Лао - пинок с разворота
 10 286dc2      Кабал - пинок с разворота


Соня:

  1  367fa      бег
  2  36a86     падение на спину
  3  36a7e     испуг
  4  367a6     захват ногами
  5  369fe      велосипед
  6  36a9e     Фаталити с огненным шаром
  7  36b52     полёт вперёд
  8  36af6      плазменный шар от Фаталити
  9  36b4a     остатки противника после Фаталити?
Contra - Hard Corps (USA, Korea) (En)
массив 81: диалоги и уровни
массив 48: элементы экрана выбора персонажа: кадры анимацыы морфинга портретов и символы дисплэя

состояние спрайтов персонажей, только часть: нет ходьбы, направлений оружыя, подката, висения:

  1  146ba     Рэй кручение в прыжке
  2  14ace 2   Шына (стр.2)
  3  15426     Фэнг
  4  14e86 2   Брауни джетпак (стр.4)
  5  147de 3   Рэй ожыдание (стр.5)
  6  14bf2 3   Шына (стр.6)
  7  15540 3   Фэнг (стр.7)
  8  14f7a       Брауни ожыдает, пушка вперёд
  9  147de 3   Рэй ожыдание (стр.5)
 10  14bf2 3   Шына (стр.6)
 11  15540 3   Фэнг (стр.7)
 12  14f94 2   Брауни ожыдает, пушка вверх
 13  146b6     Рэй кручение в прыжке (копия?)
 14  14aca     Шына
 15  15422     Фэнг
 16  14e7e     Брауни
 17  146d0     Рэй получает урон в спину перед падением вперёд
 18  14ae4     Шына
 19  1543c     Фэнг
 20  14e94 3  Брауни взрываетса (стр.20)
 21  148e6     Рэй получает урон спереди перед падением на спину
 22  14cfa      Шына
 23  15648     Фэнг
 24  14e94 3   Брауни взрываетса (стр.20)
 25  147a8      Рэй карабкаетса вверх
 26  14bbc 2   Шына
 27  1550a 2   Фэнг
 28  14f44 2    Брауни
 29  146dc      Рэй смерть
 30  14af0      Шына
 31  15444     Фэнг
 32  14e9c 3   Брауни электро (стр.32)
 33  146f4      Рэй откинулся волчком
 34  14b08     Шына
 35  1545c      Фэнг
 36  14e94 3   Брауни взрываетса (стр.20)
 37  14712      Рэй лежыт
 38  14b26      Шына
 39  15474      Фэнг
 40  14e9c 3    Брауни электро (стр.32)


другие массивы:
25 - состояние игры: демонстрацыя, экран выбора, брифинг, экран после смерти...
16 - спрайты боссов
Вообще не удалось найти музыку и звуки :(
Streets of Rage 2 (USA)
116 - тайлы надписи Stage _ Start, появляющаяся перед каждым уровнем


82 - некоторые персонажы:

  1  fa4b4     Макс
  2  fad02     Аксель
  3  fb6ce     Блэйз
  4  fbf92     Скейт
  5 1eb2c0 3
  6 1eb306
  7 1eb86a   Джек
  8 1ebdce   Барбон
  9 1ec11e
 10 1ec340
 11 1ee456
 12 1ee138 2
 13 1ec5c6
 14 1ece7e
 15 1f0db4 5
 16 1ed4f8
 17 1ed782
 18 1ecbf6    Росомаха
 19 1ed2a2   Боксёр
 20 1edce2   Рестлер
 21 1f0db4 5
 22 1f0db4 5
 23 1ee778
 24 1f0db4 5
 25 1eede2   Мистер Икс
 26 1ef454    Шыва
...
Можно менять их местами, играть за врагов, но есть глюки

другие массивы:
55 - звуки, порядок совпадает со звуковым тэстом в опцыях
45 - поведение активных и разрушаемых обйектов (+мусорки и столы застывают на последнем кадре: не происходит удаление предмета, предметы вертятса, света в баре нет)
45 - поведение активных предметов: люк взрываетса как граната, одежда босса не исчезает. Количество совпадает с предыдущим пунктом
32 - силы/траектории перекидываний


персонаж Сигнал, поведение:

  1  165b2      действие обычное
  2   e908 13  после получения удара
  3   e7e0 17  умирает
  4   e692 15  мерцает
  5   e964 14  встаёт с земли
  6   ebb0 14  если схвачен спереди
  7   ec54 12  если схвачен сзади
  8   ec9e 17  падает налево
  9   ed46 17  падает направо
 10  1639c     вбегает справа
 11  16958     выпрыгивает
 12   f03a 37  удар локтем серия
 13  169f2 2   анимацыя перекидывания
 14  169f2 2   анимацыя перекидывания
 15  16a9c     удар локтем сильный
 16  16a4c     после перекидывания
 17  169b0     ?
 18   e63e 14  ?
 19  16b20 2   ?

(массив 15-ый слева)


направление ножа в руке персонажа игрока:

  2 1401f8       вверх
  4 140204      неподвижно - вперёд вверх
  6 140210      неподвижно - назад
  8 14021c      назад вниз
 10 140228     вниз
 12 140234     назад
 14 140240     вперёд
 16 14024c     вперёд верх

(массив 15-ый слева)


массив 9: персонаж Скейт - кадры стояния


палитры уровня 1:
 
  1 10a100 2   "осень"
  2 10fc10 2
  3 11ad68 2   "темно"
  4 1218a0 2
  5 125630
  6 128f78
  7 12fb78
  8 131e68 2   "монохром"
  9 12001e     изначальная палитра ур1
X-Men 2 - Clone Wars (UE) [!]
первый массив:

  1   5466 2  создание уровня
  7   6242     создание игрока 1
  8   62e4     создание игрока 2  (при нажатии start. Если записать игрока 1, то он будет пересоздаватса)
 10   6584    после смерти переход на экран выбора персонажа? Если вставить элемент 11, то будет переход на следующий уровень
 11   6636     

   Зверь
2118 182932     обычное состояние
2119 182954     атака рукой
2120 18299c     напрыг сверху
2121 1829a6     отпрыг от поверхности
2122 1829b2     вертушка
2123 1829be     удар вися на стене
2124 1829d0     руки верх перед ударом об землю
2125 1829da     промежуточная анимацыя
2126 1829e6     удар руками об землю
2127 1829f0      после удара об землю

1393 11339a     Зверь
1394 113496     Ночной Змей
1395 11359a     Псайлок
1396 11369a     Росомаха
1397 11379a     Магнето
1398 113894     Гамбит
1399 11398e     Цыклоп


другие массивы:
16 - тайлы логотипа Сега
12 - местоположение ДНК, танков, бомб, место уровня...
11 - спрайты героев, часть логотипа игры
10 - другая часть логотипа игры
 7 -  состояние танков и других вещей (раздолбанный вид...)

А ещё при просмотре рома в хекс-редакторе обнаружылись строки: CAMERA, ACTOR, memcpy, memset. Похоже, в игре остался отладочный код.
RoboCop Versus The Terminator (USA)
Удалось таки убрать счётчик очков с экрана, кроме левово нуля. Оказалось, што он как-то связан со слоем, на котором рисуютса другие обйекты.
Battletoads (World)
Не удалось избавитса от счётчика.


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

   Как пользоватса моим Гличером
—в настройках эмулятра [SMD] включите исправление контрольной суммы на всякий случай
—закиньте ром в програму и в эмулятр
—сохранитесь в нужном месте игры. В моём случае с меню UMK3 и опцыями SoR я сохранился на предыдущем экране, штобы далее игра рисовала нужный мне экран с будущими секретными пунктами. Если сохранитса прямо на нужном экране, то каждый раз будет загружатса экран в таком же виде, без нужных дополнительных пунктов. Ведь код игры, рисующий их, не был задействован
Если же нужное вам может появлятса в игре в любой момент при определённом условии, тогда можно и сохранятса в любой момент
—смотрите результат и выбирайте подходящий пункт в програме
При закрытии програмы поиск сохраняетса. Отличие у Переставлятеля - ром не восстанавливаетса при закрытии програмы во время поиска, для этово надо или остановить поиск перед закрытием, или перезапустить програму. Связано это с тем, што Винда даёт 5 секунд для действий после закрытия, чего не хватает для восстановления при многочисленных изменениях рома (самые нижние массивы) даже на SSD
-в конце поиска програма предложыт исправить контрольную сумму [SMD]. Это надо, штобы игра не зависала на приставке или эмулятрах без опцыы исправления

   Как можно ускорить поиск
—эмулятры реагируют по-разному на сломанный ром: какие-то што-то да покажут или зависнут, другие же вылетят сразу или ещё и вылезет окно ошыбки (BlastEm). Последние замедляют поиск, т.к. требуют дополнительных лишних действий
Лучше использовать неточные эмулятры типа Gens, т.к. они меньше ломаютса и покажут меньше гличей. Есть хаки ромов, которые идут только на таких эмулятрах, отчево Инвертр может пропустить в них некоторые инструкцыы
—важно настроить всё так, штобы свести все лишние действия к минимуму. Найдите эмулятр, который переоткрывает ром одним нажатием. Например, в Fusion такой функцыы не нашёл, а BlastEm по умолчанию делает это на F5. В Gens RR нет переоткрытия, но есть Open Most Recent ROM. В FCEUX это Reload ROM. Не перепутайте жёсткий/мягкий перезапуск игры с перезагрузкой рома в память. Попробуйте запустить ром, переместить/удалить ево и попробовать перезапустить игру в эмулятре. Если он ругнётса, што ром не найден, то это оно
—если эмулятр часто вылетает не выдержав издевательств над ромом, то не перетаскивайте ром на нево, а лучше асоцыыруйте ромы с эмулятром
—переключайте эмулятр на Гличер кнопкой мышки - пусть курсор будет всегда над окном програмы
—эмулятры имеют возможность ускорить эмуляцыю - пользуйтесь этим

--- Цитата: Один великий человек ---Я не боюсь тово, кто выучился сотне приёмов хакинга. Я боюсь тово, кто выучился сотне нажатий в Гличере
--- Конец цитаты ---


В Win10/Win11 некоторые исполнительные файлы, скачанные из интрнэта, удаляютса антивирусом, поэтому перед скачиванием придётса ево выключить - он включитса сам и пакостить передумает

Инвертр (исходник) или Инвертр (исходник)

SeregaZ:
поэтому то я и говорю что нужен эмулятор в виде дллки, чтобы подключать его к своим проектам и чтобы он работал с образом памяти, дабы не гадить на жестком диске. гадить - это не вежливо (хотя кто-бы говорил - сам так гажу в редакторе Дюны при создании экспорта в тайловую карту и сет экранов :) надо бы когданить переделать чтоб в памяти это все делалось, без временных файлов на hdd).

DrMefistO:
Сорсы будут?)

Yoti:
Делал похожие проекты, в итоге все наработки отправились в Корзину. Если программа не анализирует инструкции (то есть работает поверх дизасма), то адекватный выхлоп очень низкий.

Беларус учит русский:
DrMefistO, зачем? Могу дать в личку, но пока нахожу мелкие баги, т.е. код постоянно дорабатывается.
Алгоритм прост: проходит по рому по чётным байтам (Сега же) и собирает адреса байтов 0x67 и 0x66 в надежде, что это BEQ и BNE. Далее по этому массиву адресов проходит двоичным поиском - делит пополам, первый сектор инвертирует BEQ <---> BNE, опрашивает пользователя, инвертирует обратно, потом повторяет это со вторым, потом делит первый пополам, и так до конца.
Пункты:
1 - просто пропускает текущий сектор. Раз баги в секторе мешают понять есть ли в этом секторе нужная инструкция, то лучше оставить на будущее, чтобы раздробить этот сектор.
2 - в этом секторе нет нужной инструкции, удаляем его из массива.
3 - в этом секторе есть нужная инструкция, удаляем все остальные секторы.


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


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

DrMefistO:

--- Цитата: perfect_genius от 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 проходов, как если бы просто пройтись подряд по всем найденным инструкциям.
Сейчас решил попробовать перемешать инструкции в массиве перед поиском. Может чего даст.

--- Конец цитаты ---
Можешь создать приватный (либо публичный) реп, попробую помогать в разработке:)

Беларус учит русский:
Я пока ещё не дошёл до гитхабов.
Если ты про Глитчер, то кинул исходник в личку.
Если про дизасэмблер, то он пока на паузе, т.к. на паузе - создание языка программирования, на котором и делаю дизасэмблер. А язык на паузе, потому что вот отвлёкся на Глитчер. Всё сложно :lol:
Если у тебя есть идеи, как Ида находит блоки кода, недоступные через статический анализ, то можем и поработать.

Yoti:

--- Цитата: perfect_genius от 20 Февраль 2024, 19:08:42 ---У тебя вообще не остались хоть какие-то записи или мысли по своим исследованиям? Было бы интересно и полезно.
--- Конец цитаты ---
Нет, это был примитивный хекс-корраптер. Там были какие-то шаблоны, но я их даже не проверил толком на работу. На их написание было потрачено менее 3 часов, так что повторяемость достаточно высокая. Ну и писалось для ФамиНЕС.

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



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

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

Cyneprepou4uk:

--- Цитата ---собирает адреса байтов 0x67 и 0x66 в надежде, что это BEQ и BNE
--- Конец цитаты ---

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

Беларус учит русский:
Да тут много чего можно улучшить, добавить всякие эвристики и т.д. Но это пока лишь проверка идеи, поэтому максимально простая реализация.
Но ведь даже если прыгнуть по адресу, то любые данные там можно принять за код, т.к. у 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:
Я в сеге не очень разбираюсь, но судя по этому гайду, там лишь пару сотен опкодов (первые 2 байта), а не весь диапазон из 65536 возможных опкодов.

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

Беларус учит русский:
Там во втором байте всякие адреса и константы же, а по ссылке только случайные числа стоят, для примера. Такое как-то можно надёжно определять как инструкцию?

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

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

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

Lance_Kalzas:

--- Цитата: perfect_genius от 22 Февраль 2024, 02:35:00 ---Похоже, вот и нашлась принципиальная проблема для корраптеров, раз любое повреждение рома ничего не показывает
--- Конец цитаты ---
В Кеге есть Autofix Checksum же :)

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


--- Код: ---                  ; если был фикс чек суммы
                  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:

--- Цитата: perfect_genius от 20 Февраль 2024, 03:08:38 ---Вариант для тех, кому нужен хак, но не хочет учить программирование или не может найти хакера. Взамен такой способ потребует много терпения и концентрации.
Программа редактирует код в роме и пользователь проверяет изменения в эмуляторе. Так повторяется сотни раз, пока не выявится нужная инструкция. Или не выявится, если логика кода оказалась другой :debile:
--- Конец цитаты ---
Это самописный? Помню, как баловался с VineSause ROM Corruptor

Беларус учит русский:

--- Цитата: Lance_Kalzas от 22 Февраль 2024, 04:51:41 ---В Кеге есть Autofix Checksum же
--- Конец цитаты ---
Действительно помогло, но в нём нет перезапуска рома, только сброс консоли. Приходилось перетаскивать ром в окно эмулятора. Поищу другой.
Также похоже, что исправление контрольной суммы - не универсальное решение:

--- Цитата: Sharpnull от 16 Апрель 2019, 13:28:52 ---Вы проверяли ромы с красным экраном? Возможно исправление автоматически происходит. (нашёл кривой ром, автоматически не работает)
--- Конец цитаты ---


--- Цитата: Lance_Kalzas от 22 Февраль 2024, 05:47:11 ---Это самописный?
--- Конец цитаты ---
Да, проверка идеи. Но что-то затянуло и выпал из жизни уже на вторую неделю ^_^ Идеи пока не кончаются, так что может что-то из этого и выйдет.



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

SeregaZ:
чужая память - всегда потемки. лучше когда своя.

Yoti:

--- Цитата: perfect_genius от 22 Февраль 2024, 12:11:48 ---А в чём у тебя проблема создания рома на накопителе?
--- Конец цитаты ---
Износ целевого накопителя и потери времени на операциях ввода-вывода. Да и в целом плохая практика.

Беларус учит русский:
Yoti, тоже были мысли про износ моего SSD, но почитал, что это всё мизер в отличие от постоянных записей ОС и браузера (которая сама теперь по сложности как ОС). Иначе бы среды программирования сокращали его срок и разработчики мира заметили бы и что-то предприняли.
Если уж так страшно за износ и за скорость создания рома, то можно ведь создать рамдиск. Но SeregaZ уклоняется говорить причину, спросил его уже несколько раз. Видимо, и сам не знает зачем делает :neznayu:
Так что лучше не оффтопте тут, пожалуйста.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии