Список форумов shedevr.org.ru shedevr.org.ru
Группа перевода приставочных игр "ШЕДЕВР"
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Как в Nuts & milk-е взломать кнопку select?
На страницу 1, 2, 3  След.
 
Начать новую тему   Ответить на тему    Список форумов 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, правда после огромного числа повторений кода, приведённого выше. Такие вещи встречаются во многих играх. Вроде, команды-то не было... Question
Вернуться к началу
Otter



Зарегистрирован: 12.12.2006
Сообщения: 120
Откуда: Москва

СообщениеДобавлено: Пт Дек 15, 2006 3:36 pm    Заголовок сообщения: Ответить с цитатой

Уже прогресс, но нужно не это....
По адресам $C569 он крутится, ожидая, не будет ли нажато и start, чтобы пойти на $C576 -> $DB52 и там либо включить паузу, либо совершить самоубийство (sel+st). Я так понимаю, он где-то перед этим устанавливает таймерное прерывание, которое (если не будет нажато start) и перебрасывает его на $C0C0. Но там он ещё зачем-то крутится и продолжает опрашивать $4016. А я хочу понять, где он окончательно решает инкрементировать уровень. То-есть такое место, которое выполняется только при нажатии и отпускании select, но не при обычном прохождении уровня. NOP-ить INX нельзя, так как эта инструкция выполняется и при обычном прохождении!
_________________
вот как-то рано поутру в пруду нашёлся полутруп
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
АнС
RRC2008
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, правда после огромного числа повторений кода, приведённого выше. Такие вещи встречаются во многих играх. Вроде, команды-то не было... Question


Неужели не знаешь про NMI??? Shocked
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
-=#Griever#=-
Гость





СообщениеДобавлено: Пт Дек 15, 2006 11:55 pm    Заголовок сообщения: Ответить с цитатой

Цитата:
Неужели не знаешь про NMI???

D'oh! Действительно прерывание (16 битный вектор в FFFA не просто так дан Wink) Спасибо.

Цитата:
C2ED - проверка на 32, если не равно (может быть только меньше), то прыгает на увеличение.

А? Как это поможет нам не увеличивать уровень только при нажатии на select? Думаю и без проверки ясно, что это банальный тест на максимальный уровень.

А вот то что нужно Otter'у, так это по адресу 0x584 в РОМе вписать два байта: $01 $С3. Должно работать как надо.
Вернуться к началу
Griever
RRC2008
RRC2008


Зарегистрирован: 15.07.2005
Сообщения: 112
Откуда: Н.Новгород

СообщениеДобавлено: Сб Дек 16, 2006 12:19 am    Заголовок сообщения: Ответить с цитатой

Цитата:
пользуюсь только FCEU 0.98.15, так как frame advance заменяет десяток инструментов FCEUXD


Действительно интересно. Я думал, frame advance нужен только для прохождений на скорость! Не расскажешь как его используют в целях ромхакинга?
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
АнС
RRC2008
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 - трейсер исполненного кода, больше не припомню там ничего незаменимого.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
-=#Griever#=-
Гость





СообщениеДобавлено: Сб Дек 16, 2006 3:27 pm    Заголовок сообщения: Ответить с цитатой

Здорово. Думаю, это и есть твой секретный метод поиска ячеек, о котором ты говорил в теме про TMNT tournament fighters (бесконечное сражение со Шредером). Wink
Вернуться к началу
Otter



Зарегистрирован: 12.12.2006
Сообщения: 120
Откуда: Москва

СообщениеДобавлено: Вс Дек 17, 2006 1:25 am    Заголовок сообщения: Ответить с цитатой

-=#Griever#=- писал(а):

А вот то что нужно Otter'у, так это по адресу 0x584 в РОМе вписать два байта: $01 $С3. Должно работать как надо.


Такой вариант лучше чем ничего, но всё-таки не совсем то. Так при нажатии уровень гаснет и начинается с начала, а нужно чтоб вообще ничего не происходило. Надо зафиксировать ещё более раннее место, до выполнения $C563, где программа определяется, что нажато select. Токо я не могу понять где....
_________________
вот как-то рано поутру в пруду нашёлся полутруп
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
АнС
RRC2008
RRC2008


Зарегистрирован: 08.11.2003
Сообщения: 2818

СообщениеДобавлено: Вс Дек 17, 2006 2:38 am    Заголовок сообщения: Ответить с цитатой

Тогда по адресу 583 пропиши три NOP (EA) - SELECT будет убивать даже без START (честно говоря, не знал о такой фиче, а ведь иногда в этой паззловой игре бывают тупиковые ситуации). Если вписать шесть NOP подряд, то затрёшь и второй JMP, так что SELECT будет включать паузу (но не выключать). Очень странная там система опроса управления и работы с памятью вообще.


-=#Griever#=- писал(а):
Здорово. Думаю, это и есть твой секретный метод поиска ячеек, о котором ты говорил в теме про TMNT tournament fighters (бесконечное сражение со Шредером). Wink


Это один из вариантов применения инструмента. Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Гость






СообщениеДобавлено: Вс Дек 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
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 байт??

А кстати, для чего тебе всё это? Собираешься сделать вторую часть с гиперсложными/хитрозакрученными паззлами? Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Otter



Зарегистрирован: 12.12.2006
Сообщения: 120
Откуда: Москва

СообщениеДобавлено: Пн Дек 18, 2006 4:54 am    Заголовок сообщения: Ответить с цитатой

АнС писал(а):

Такого нет, и не может быть. Даже если установить бряк на чтение части кода и так пройти всю игру, ты не можешь быть уверен, что эта часть нигде не используется. Лучше разыщи свободное место (забитое нулями или FF). Хотя откуда столько кода - 71 байт??

А кстати, для чего тебе всё это? Собираешься сделать вторую часть с гиперсложными/хитрозакрученными паззлами? Wink


Ну воще-то если пройти всё и скрупулёзно пропробовать все действия, можно быть на 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
RRC2008


Зарегистрирован: 08.02.2006
Сообщения: 188

СообщениеДобавлено: Пн Дек 18, 2006 5:35 am    Заголовок сообщения: Ответить с цитатой

А почему бы ром не расширить?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
АнС
RRC2008
RRC2008


Зарегистрирован: 08.11.2003
Сообщения: 2818

СообщениеДобавлено: Пн Дек 18, 2006 10:58 am    Заголовок сообщения: Ответить с цитатой

Shiru писал(а):
Запускаем игру, по всякому гоняем, выходим, смотрим, где остались нули.


Ключевая проблема в том, что "по-всякому" не означает, что мы охватили все возможные варианты развития событий.


Otter писал(а):
Хе-хе, не *собираюсь*. У меня уже готов набор навороченных уровней и программа подшивки их в игру. Осталось только асм доделать (и позвонить одному бывшему однокласснику, которому принадлежат права на несколько уровней) и можно будет выкладывать.


О, круто! Если уровни не только сверхсложные, нно и интересные, это будет стоящий хак. Ждёмс. Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Shiru



Зарегистрирован: 25.10.2006
Сообщения: 295
Откуда: Russia, Moscow

СообщениеДобавлено: Пн Дек 18, 2006 11:20 am    Заголовок сообщения: Ответить с цитатой

АнС писал(а):
Ключевая проблема в том, что "по-всякому" не означает, что мы охватили все возможные варианты развития событий.

Безусловно, но по крайней мере, это способ быстро локализовать участки памяти для анализа, не вникая в работу/компоновку всей программы в целом.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Otter



Зарегистрирован: 12.12.2006
Сообщения: 120
Откуда: Москва

СообщениеДобавлено: Пн Дек 18, 2006 7:49 pm    Заголовок сообщения: Ответить с цитатой

Ух-ты ткнулся (ища пустое место) и попал на МУЗЫКУ! В моей версии кое-какая музыка использоваться не будет, поэтому можно записать фильтр поверх неё. Но это токо 64 байта Sad! Надо ещё минимум 7.
(Это ж надо тупызм вурдалаки!! - записали музыку bonus-а и титульного экрана в одно место Mad Twisted Evil - команды типа через одну играются....)

Насчёт метода, предложенного Shiru-ом, попытаюсь...., конечно для меня редактировать исходник имитатора приставки - зверские дебри, но может что и выйдет. К слову, а вот отладчик FCEU-а даже если говорит, что обращения к памяти не было (контрольная точка не срабатывает), на самом деле оно могло и быть - при инициации наверно. В частности палитра в самом начале файла.
_________________
вот как-то рано поутру в пруду нашёлся полутруп


Последний раз редактировалось: Otter (Пн Апр 23, 2007 10:10 pm), всего редактировалось 2 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
АнС
RRC2008
RRC2008


Зарегистрирован: 08.11.2003
Сообщения: 2818

СообщениеДобавлено: Пн Дек 18, 2006 9:04 pm    Заголовок сообщения: Ответить с цитатой

Otter писал(а):
К слову, а вот отладчик FCEU даже если говорит, что обращения к памяти не было (останов не срабатывает), на самом деле оно могло и быть - при инициации наверно. В частности палитра в самом начале файла.


Это глюки бряков на ProgrammCounter. Ты просто ставь для нужного диапазона две галочки - на R и на P, тогда не будет пропускать.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
evgeny
RRC2008
RRC2008


Зарегистрирован: 08.02.2006
Сообщения: 188

СообщениеДобавлено: Вт Дек 19, 2006 7:16 am    Заголовок сообщения: Ответить с цитатой

Так я и не понял, почему не расширить ром? Игра 24 кб весит, радиуса действия поинтеров должно до 64 кб хватить. Что мешает загнать код в конец рома?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Otter



Зарегистрирован: 12.12.2006
Сообщения: 120
Откуда: Москва

СообщениеДобавлено: Чт Дек 21, 2006 12:43 pm    Заголовок сообщения: Ответить с цитатой

Слушай, а я как-то не допирал до этого. Surprised Что, всё будет корректно отображаться при загрузке в память, даже если размер файла будет неровный? А почему тогда все официальные игры делались чётко размером 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 КБ памяти.

Так всё-таки, посмотрите кто-нито вторую часть предыдущего вопроса Wink.
_________________
вот как-то рано поутру в пруду нашёлся полутруп
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
-=#Griever#=-
Гость





СообщениеДобавлено: Чт Дек 21, 2006 7:24 pm    Заголовок сообщения: Ответить с цитатой

otter
Exclamation Личку проверь... Exclamation
Вернуться к началу
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов shedevr.org.ru -> Экстремальный ромхакинг Часовой пояс: GMT + 3
На страницу 1, 2, 3  След.
Страница 1 из 3

 
Перейти:  
Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group