|
shedevr.org.ru Группа перевода приставочных игр "ШЕДЕВР"
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Otter
Зарегистрирован: 12.12.2006 Сообщения: 120 Откуда: Москва
|
Добавлено: Ср Дек 13, 2006 12:55 am Заголовок сообщения: Как в Nuts & milk-е взломать кнопку select? |
|
|
Вопрос такой. Мне нужно в Milk-nuts-е отследить нажатие select-а (в уровне), чтобы при нём не шла инкрементация уровня (своими усилиями я смог только найти только эту подпрограмму, но не откуда она вызывается. Причём анализ кода с опроса $4016 тоже ничего не дал - он вызывается кучу раз в секунду, и невозможно зафиксировать именно нажатие select-а), а процесс переходил сначала на фильтр, позволяющий инкрементировать только на конкретных уровнях. Кто имеет опыт взлома Famicom-ных игр, помогите. _________________ вот как-то рано поутру в пруду нашёлся полутруп
Последний раз редактировалось: Otter (Пн Апр 23, 2007 10:02 pm), всего редактировалось 2 раз(а) |
|
Вернуться к началу |
|
|
-=#Griever#=- Гость
|
Добавлено: Ср Дек 13, 2006 5:12 pm Заголовок сообщения: |
|
|
Действительно процесс сравнения значений здесь организован не так очевидно, однако, в любом случае, сначала байт результата опроса джойстиков сравнивается с select:
$C569:A5 1A LDA $001A = #$20
$C56B:29 20 AND #$20
$C56D:D0 F4 BNE $C563
$C563:A5 1A LDA $001A = #$20
$C0C0:85 1C STA $001C = #$01
...........
А потом с отпущенной кнопкой, и только после этого производится увеличение номера уровня на один
$C2FC:E8 INX
$C2FD:86 C4 STX $00C4 = #$05
$C2FF:86 20 STX $0020 = #$05
В любом случае, стоит заNOP'ить INX. Ну или XVNKGXEV в виде Game genie кода.
PS: Очень давно хотел спросить: почему это после $C563 игра сразу перескакивает на $C0C0, правда после огромного числа повторений кода, приведённого выше. Такие вещи встречаются во многих играх. Вроде, команды-то не было... |
|
Вернуться к началу |
|
|
Otter
Зарегистрирован: 12.12.2006 Сообщения: 120 Откуда: Москва
|
Добавлено: Пт Дек 15, 2006 3:36 pm Заголовок сообщения: |
|
|
Уже прогресс, но нужно не это....
По адресам $C569 он крутится, ожидая, не будет ли нажато и start, чтобы пойти на $C576 -> $DB52 и там либо включить паузу, либо совершить самоубийство (sel+st). Я так понимаю, он где-то перед этим устанавливает таймерное прерывание, которое (если не будет нажато start) и перебрасывает его на $C0C0. Но там он ещё зачем-то крутится и продолжает опрашивать $4016. А я хочу понять, где он окончательно решает инкрементировать уровень. То-есть такое место, которое выполняется только при нажатии и отпускании select, но не при обычном прохождении уровня. NOP-ить INX нельзя, так как эта инструкция выполняется и при обычном прохождении! _________________ вот как-то рано поутру в пруду нашёлся полутруп |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Пт Дек 15, 2006 9:16 pm Заголовок сообщения: |
|
|
C2ED - проверка на 32, если не равно (может быть только меньше), то прыгает на увеличение. Нашёл за полминуты так: сначала увидел, что номер уровня хранится в ячейке 00C4, поставил бряк (пользуюсь только FCEU 0.98.15, так как frame advance заменяет десяток инструментов FCEUXD) и пролистнул код чуть выше инструкции STX C4.
-=#Griever#=- писал(а): | PS: Очень давно хотел спросить: почему это после $C563 игра сразу перескакивает на $C0C0, правда после огромного числа повторений кода, приведённого выше. Такие вещи встречаются во многих играх. Вроде, команды-то не было... |
Неужели не знаешь про NMI??? |
|
Вернуться к началу |
|
|
-=#Griever#=- Гость
|
Добавлено: Пт Дек 15, 2006 11:55 pm Заголовок сообщения: |
|
|
Цитата: | Неужели не знаешь про NMI??? |
D'oh! Действительно прерывание (16 битный вектор в FFFA не просто так дан ) Спасибо.
Цитата: | C2ED - проверка на 32, если не равно (может быть только меньше), то прыгает на увеличение. |
А? Как это поможет нам не увеличивать уровень только при нажатии на select? Думаю и без проверки ясно, что это банальный тест на максимальный уровень.
А вот то что нужно Otter'у, так это по адресу 0x584 в РОМе вписать два байта: $01 $С3. Должно работать как надо. |
|
Вернуться к началу |
|
|
Griever RRC2008
Зарегистрирован: 15.07.2005 Сообщения: 112 Откуда: Н.Новгород
|
Добавлено: Сб Дек 16, 2006 12:19 am Заголовок сообщения: |
|
|
Цитата: | пользуюсь только FCEU 0.98.15, так как frame advance заменяет десяток инструментов FCEUXD |
Действительно интересно. Я думал, frame advance нужен только для прохождений на скорость! Не расскажешь как его используют в целях ромхакинга? _________________
|
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Сб Дек 16, 2006 12:43 am Заголовок сообщения: |
|
|
-=#Griever#=- писал(а): | А? Как это поможет нам не увеличивать уровень только при нажатии на select? Думаю и без проверки ясно, что это банальный тест на максимальный уровень. |
Ну так вместо условного перехода вставить безусловный - игра при нажатии SELECT всегда будет думать, что это 50-й уровень, и не станет переключать его.
Griever писал(а): | Цитата: | пользуюсь только FCEU 0.98.15, так как frame advance заменяет десяток инструментов FCEUXD |
Действительно интересно. Я думал, frame advance нужен только для прохождений на скорость! Не расскажешь как его используют в целях ромхакинга? |
Покадровое исполнение - очень мощная штука. Это словами не объяснить, понимание приходит с опытом.
При покадровой игре происходит как бы переход на микроуровень - появляются совершенно новые возможности, например, т.к. большинство игр синхронизирует (по крайней мере пытается) главный цикл с VBLANK, можно дискретизировать игровой процесс на ряд чётко определённых состояний. Если попроще, то непрерывная видеоигра превращается в дискретный ряд скриншотов - у каждого скриншота своя RAM, и можно рассматривать игру не как нечто живое/неизведанное, а как чистый набор состояний памяти.
Соответственно, сильно расширяются возможности анализа игрового кода, а ведь суть реверс-инжиниринга в анализе.
Пример: чтобы найти то, не знаю что, нужно всего лишь сравнить два дампа памяти на один и тот же момент игры (для чего существует Frame Counter) - первый дамп предопределяет, скажем, нежелательное будущее, а второй - желательное. Можно кусками записывать "хорошую" память в "плохую" и в результате точно найти ряд нужных ячеек, потом уже бряки на них и т.д. Памяти у NES мало, так что процесс не затягивается более 10-15 минут. Главное - понимать суть работы игровой программы, и при наличии фантазии Frame Advance откроет ещё кучу возможностей.
Конечно, без бряков всё равно не обойтись, но они есть в любом FCEU.
Единственная полезная фича FCEUXD - трейсер исполненного кода, больше не припомню там ничего незаменимого. |
|
Вернуться к началу |
|
|
-=#Griever#=- Гость
|
Добавлено: Сб Дек 16, 2006 3:27 pm Заголовок сообщения: |
|
|
Здорово. Думаю, это и есть твой секретный метод поиска ячеек, о котором ты говорил в теме про TMNT tournament fighters (бесконечное сражение со Шредером). |
|
Вернуться к началу |
|
|
Otter
Зарегистрирован: 12.12.2006 Сообщения: 120 Откуда: Москва
|
Добавлено: Вс Дек 17, 2006 1:25 am Заголовок сообщения: |
|
|
-=#Griever#=- писал(а): |
А вот то что нужно Otter'у, так это по адресу 0x584 в РОМе вписать два байта: $01 $С3. Должно работать как надо. |
Такой вариант лучше чем ничего, но всё-таки не совсем то. Так при нажатии уровень гаснет и начинается с начала, а нужно чтоб вообще ничего не происходило. Надо зафиксировать ещё более раннее место, до выполнения $C563, где программа определяется, что нажато select. Токо я не могу понять где.... _________________ вот как-то рано поутру в пруду нашёлся полутруп |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Вс Дек 17, 2006 2:38 am Заголовок сообщения: |
|
|
Тогда по адресу 583 пропиши три NOP (EA) - SELECT будет убивать даже без START (честно говоря, не знал о такой фиче, а ведь иногда в этой паззловой игре бывают тупиковые ситуации). Если вписать шесть NOP подряд, то затрёшь и второй JMP, так что SELECT будет включать паузу (но не выключать). Очень странная там система опроса управления и работы с памятью вообще.
-=#Griever#=- писал(а): | Здорово. Думаю, это и есть твой секретный метод поиска ячеек, о котором ты говорил в теме про TMNT tournament fighters (бесконечное сражение со Шредером). |
Это один из вариантов применения инструмента. |
|
Вернуться к началу |
|
|
Гость
|
Добавлено: Вс Дек 17, 2006 9:23 am Заголовок сообщения: |
|
|
АнС, ты мне советуешь мне на самом деле то же, что Griever - убрать переход с $C573 на процедуру увеличения уровня. Только Griever говорил прыгать оттуда на конец процедуры увеличения, а ты - фактически, перейти на процедуру убийства. Но мне-то надо, чтобы sel+st убивало, а sel не приводило даже к гашению экрана.
Нашёл, как сделать, чтобы при select ничо не происходило - в $C55D "BNE $C560" заменить на "BNE C55F", но тогда select вообще перестаёт действовать, и нельзя самоубиться, так что это не подходит....
Вроде НАШЁЛ!!!!!! Тыц-тыц.... С $C565 буду прыгать на мой фильтр, а с него: если можно инкрементировать - на $C2CB, как обычно, если нельзя - НА $C55F!!!! - это покидание процедуры опроса sel-st! Единственное, надо будет собственноручно обратно включить музычку, но тут я думаю по аналогии - $C560: $F31B - выключение, наверно над ней $F2E4 располагается включение, в общем посмотрю.
ДРУГОЙ ВОПРОС!
Где мне разместить мой фильтр? Надо примерно 71 байт. Конечно можно в уровнях, но так мне придётся урезать их количество. Кто-нито может сказать, есть ли такой отладчик, позволяющий
визуально наблюдать, какой код никогда не трогается? Тогда бы я в него запихнул. |
|
Вернуться к началу |
|
|
Otter
Зарегистрирован: 12.12.2006 Сообщения: 120 Откуда: Москва
|
Добавлено: Вс Дек 17, 2006 9:26 am Заголовок сообщения: |
|
|
Это я был! Чёрт, автовход отрубился. _________________ вот как-то рано поутру в пруду нашёлся полутруп |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Вс Дек 17, 2006 4:46 pm Заголовок сообщения: |
|
|
Anonymous писал(а): | АнС, ты мне советуешь мне на самом деле то же, что Griever - убрать переход с $C573 на процедуру увеличения уровня. Только Griever говорил прыгать оттуда на конец процедуры увеличения, а ты - фактически, перейти на процедуру убийства. Но мне-то надо, чтобы sel+st убивало, а sel не приводило даже к гашению экрана. |
Я тебе предлагал вариант, когда SELECT убивает, и всё. Во многих играх, где есть такая функция, именно кнопка SELECT за неё отвечает. Пример - Hi no Tori, там тоже возможны тупиковые ситуации.
Anonymous писал(а): | Где мне разместить мой фильтр? Надо примерно 71 байт. Конечно можно в уровнях, но так мне придётся урезать их количество. Кто-нито может сказать, есть ли такой отладчик, позволяющий визуально наблюдать, какой код никогда не трогается? Тогда бы я в него запихнул. |
Такого нет, и не может быть. Даже если установить бряк на чтение части кода и так пройти всю игру, ты не можешь быть уверен, что эта часть нигде не используется. Лучше разыщи свободное место (забитое нулями или FF). Хотя откуда столько кода - 71 байт??
А кстати, для чего тебе всё это? Собираешься сделать вторую часть с гиперсложными/хитрозакрученными паззлами? |
|
Вернуться к началу |
|
|
Otter
Зарегистрирован: 12.12.2006 Сообщения: 120 Откуда: Москва
|
Добавлено: Пн Дек 18, 2006 4:54 am Заголовок сообщения: |
|
|
АнС писал(а): |
Такого нет, и не может быть. Даже если установить бряк на чтение части кода и так пройти всю игру, ты не можешь быть уверен, что эта часть нигде не используется. Лучше разыщи свободное место (забитое нулями или FF). Хотя откуда столько кода - 71 байт??
А кстати, для чего тебе всё это? Собираешься сделать вторую часть с гиперсложными/хитрозакрученными паззлами? |
Ну воще-то если пройти всё и скрупулёзно пропробовать все действия, можно быть на 97% уверенным, что остальной код не трогается. В том-то и дело, что код игры (не считая графики) занимает ровно 16 КБ, а фрагментов, заполненных одними 0-ями и т. п. воще нету! Как у автора могли все идеи идеально лечь в 16384 байта? Уж 80-то неиспользованных байт должно было остаться. А надо примерно столько: LDA, (CMP + BNE) * 15, JMP * 2 (и может ещё кое-какой код по включению музыки).
Хе-хе, не *собираюсь*. У меня уже готов набор навороченных уровней и программа подшивки их в игру. Осталось только асм доделать (и позвонить одному бывшему однокласснику, которому принадлежат права на несколько уровней) и можно будет выкладывать. _________________ вот как-то рано поутру в пруду нашёлся полутруп |
|
Вернуться к началу |
|
|
Shiru
Зарегистрирован: 25.10.2006 Сообщения: 295 Откуда: Russia, Moscow
|
Добавлено: Пн Дек 18, 2006 5:30 am Заголовок сообщения: |
|
|
Otter писал(а): | Ну воще-то если пройти всё и скрупулёзно пропробовать все действия, можно быть на 97% уверенным, что остальной код не трогается. |
Готовых решений не встречал, но можно модифицировать какой-нибудь эмулятор с открытыми исходниками, чтобы он составлял таблицу обращений к адресам памяти. Заводим массив размером в адресное пространство ROM'а, на старте зануляем. Модифицируем операции обращения к памяти, чтобы по любому обращению к адресам ROM'а в соответствующую ячейку массива записывалась единица. По закрытию эмулятора сохраняем массив в файл. Запускаем игру, по всякому гоняем, выходим, смотрим, где остались нули. |
|
Вернуться к началу |
|
|
evgeny RRC2008
Зарегистрирован: 08.02.2006 Сообщения: 188
|
Добавлено: Пн Дек 18, 2006 5:35 am Заголовок сообщения: |
|
|
А почему бы ром не расширить? |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Пн Дек 18, 2006 10:58 am Заголовок сообщения: |
|
|
Shiru писал(а): | Запускаем игру, по всякому гоняем, выходим, смотрим, где остались нули. |
Ключевая проблема в том, что "по-всякому" не означает, что мы охватили все возможные варианты развития событий.
Otter писал(а): | Хе-хе, не *собираюсь*. У меня уже готов набор навороченных уровней и программа подшивки их в игру. Осталось только асм доделать (и позвонить одному бывшему однокласснику, которому принадлежат права на несколько уровней) и можно будет выкладывать. |
О, круто! Если уровни не только сверхсложные, нно и интересные, это будет стоящий хак. Ждёмс. |
|
Вернуться к началу |
|
|
Shiru
Зарегистрирован: 25.10.2006 Сообщения: 295 Откуда: Russia, Moscow
|
Добавлено: Пн Дек 18, 2006 11:20 am Заголовок сообщения: |
|
|
АнС писал(а): | Ключевая проблема в том, что "по-всякому" не означает, что мы охватили все возможные варианты развития событий. |
Безусловно, но по крайней мере, это способ быстро локализовать участки памяти для анализа, не вникая в работу/компоновку всей программы в целом. |
|
Вернуться к началу |
|
|
Otter
Зарегистрирован: 12.12.2006 Сообщения: 120 Откуда: Москва
|
Добавлено: Пн Дек 18, 2006 7:49 pm Заголовок сообщения: |
|
|
Ух-ты ткнулся (ища пустое место) и попал на МУЗЫКУ! В моей версии кое-какая музыка использоваться не будет, поэтому можно записать фильтр поверх неё. Но это токо 64 байта ! Надо ещё минимум 7.
(Это ж надо тупызм вурдалаки!! - записали музыку bonus-а и титульного экрана в одно место - команды типа через одну играются....)
Насчёт метода, предложенного Shiru-ом, попытаюсь...., конечно для меня редактировать исходник имитатора приставки - зверские дебри, но может что и выйдет. К слову, а вот отладчик FCEU-а даже если говорит, что обращения к памяти не было (контрольная точка не срабатывает), на самом деле оно могло и быть - при инициации наверно. В частности палитра в самом начале файла. _________________ вот как-то рано поутру в пруду нашёлся полутруп
Последний раз редактировалось: Otter (Пн Апр 23, 2007 10:10 pm), всего редактировалось 2 раз(а) |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Пн Дек 18, 2006 9:04 pm Заголовок сообщения: |
|
|
Otter писал(а): | К слову, а вот отладчик FCEU даже если говорит, что обращения к памяти не было (останов не срабатывает), на самом деле оно могло и быть - при инициации наверно. В частности палитра в самом начале файла. |
Это глюки бряков на ProgrammCounter. Ты просто ставь для нужного диапазона две галочки - на R и на P, тогда не будет пропускать. |
|
Вернуться к началу |
|
|
evgeny RRC2008
Зарегистрирован: 08.02.2006 Сообщения: 188
|
Добавлено: Вт Дек 19, 2006 7:16 am Заголовок сообщения: |
|
|
Так я и не понял, почему не расширить ром? Игра 24 кб весит, радиуса действия поинтеров должно до 64 кб хватить. Что мешает загнать код в конец рома? |
|
Вернуться к началу |
|
|
Otter
Зарегистрирован: 12.12.2006 Сообщения: 120 Откуда: Москва
|
Добавлено: Чт Дек 21, 2006 12:43 pm Заголовок сообщения: |
|
|
Слушай, а я как-то не допирал до этого. Что, всё будет корректно отображаться при загрузке в память, даже если размер файла будет неровный? А почему тогда все официальные игры делались чётко размером 16, 32, 64, 128 и т. п. КБ?
-------------
Так или иначе, кое-какое свободное место я нашёл и разместил фильтр, и музыка вроде правильно включается. Только вот ещё малый вопрос, у кого глаз набит, позырьте: $C5C6 - последние строки перед выходом из паузы. JSR $F08D - некая инициация включения музыки (если не сделать, музыка после включения будет играть обрывки); $C5D9: LDA #$01; STA $3C - это и есть включение.
Но вот между ними какие-то 2-е проверки. Максимум, что я понял, что $E5 принимает 1 иногда в демонстрационном режиме. Зачем они нужны? Можно ли включать музыку без них? _________________ вот как-то рано поутру в пруду нашёлся полутруп
Последний раз редактировалось: Otter (Чт Дек 21, 2006 1:24 pm), всего редактировалось 2 раз(а) |
|
Вернуться к началу |
|
|
Shiru
Зарегистрирован: 25.10.2006 Сообщения: 295 Откуда: Russia, Moscow
|
Добавлено: Чт Дек 21, 2006 1:06 pm Заголовок сообщения: |
|
|
Otter писал(а): | Слушай, а я как-то не допирал до этого. :o Что, всё будет корректно отображаться при загрузке в память, даже если размер файла будет неровный? А почему тогда все официальные игры делались чётко размером 16, 32, 64, 128 и т. п. КБ? |
Потому-что такой объём (кратный степени двойки) имеют микросхемы ПЗУ, и вообще микросхемы памяти - это следует из их устройства. 24 КБ - это, видимо, несколько корпусов: 16+8, или 8+8+8. Тебе придётся расширять до 32 КБ. |
|
Вернуться к началу |
|
|
Otter
Зарегистрирован: 12.12.2006 Сообщения: 120 Откуда: Москва
|
Добавлено: Чт Дек 21, 2006 1:21 pm Заголовок сообщения: |
|
|
Не ну понятно, что схемы имеют такой размер, но если сделать ПАТЧ (память токо для чтения - лучше не называть их ромами) некратного размера, остаток будет 0-евыми байтами инициирован, или всё зависнет?
------
Да и кстати говоря, в этой игре всё равно отображение кода из файла ($0010 - $400F) в память идёт $8000 - $BFFF и $C000 - $FFFF (копия) и исполняется второй экземпляр. Поэтому чтобы расширить ПАТЧ, мало того что пришлось бы все абсолютные указатели в нём менять, так ещё и где-то менять инструкции, чтобы исполнялась первая копия, т. к. только её хвост уместился бы в 64 КБ памяти.
Так всё-таки, посмотрите кто-нито вторую часть предыдущего вопроса . _________________ вот как-то рано поутру в пруду нашёлся полутруп |
|
Вернуться к началу |
|
|
-=#Griever#=- Гость
|
Добавлено: Чт Дек 21, 2006 7:24 pm Заголовок сообщения: |
|
|
otter
Личку проверь... |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group
|