Разработка и ромхакинг > Ромхакинг
[Дэнди/NES/SMD] ROM glitcher - сделай себе хак не зная ромхакинг
Беларус учит русский:
Ром (игра) изменяетса особым образом и пользователь проверяет в эмулятре, есть ли нужное ему изменение. Если нет, то ром восстанавливаетса и изменяетса в другом месте. Если есть, то начинаетса удаление лишних изменений.
Результат не гарантирован, но зато проверка не требует знаний и особых усилий.
Два инструмента для разных задач:
ИНВЕРТР логики Мой вариант ищет только логику типа "есть/нет", "включилось/выключилось", "случилось/не случилось", "равно/не равно" (инструкцыы 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:
Так что лучше не оффтопте тут, пожалуйста.
Навигация
Перейти к полной версии