Pull to refresh

Comments 41

Всё это безумно здорово, но было бы ещё круче, будь описание того, как были вычислены данные вещи.
В тех играх, где есть свободный сейв — меня про одному и собирая пороли чаще всего.
меня про одному и собирая пороли

Интересная история, но не для этого сайта.
меняЯ по одному, и собирая (генерируемые игрой) пАроли.
Я мог бы и описать, как всё это получено, но тогда бы статья была бы слишком большой. Но если вкратце, я собирал пароли и методом анализа находил насколько и как изменяются позиции при определенных значениях.
Так может тогда отдельную статью-туториал написать по методам анализа и вычислений?
Я так понимаю, даже в случае разного способа кодирования, изначальный подход к вычислениям одинаковый?
Можно и написать, но я не уверен, что будут люди которым это нужно. Я когда эту публикацию писал всё задумывался данным вопросом: «Кому оно надо?»
Нет если статьи нет — это точно никому не надо, а вот если есть статья — найдётся и тот, кому она нужна. Например, я.
Есть много разных подходов к анализу, но основных не так много:

1. Анализ различий, самый простой метод, работает даже на приставке с бумагой и ручкой. Просто собираются пароли с минимальными различиями по состоянию. Например, в RRR можно выбирать одинаковую сложность, машину, цвет, но разных персонажей и записывать стартовые пароли (благо пароль доступен без прохождения чего-либо). Потом аналогично, только меняем другой параметр, например цвет машины. Тем самым можно понять в каких символах что хранится и заодно сделать предположения где же расположена контрольная сумма. В ряде игр на Sega типовой подход — алфавит не перемешан и обычно 5ти (или 4х битовое кодирование, в зависимости от длины алфавита), потому можно составить табличку в этом предположении что начальный символ алфавита это 00000, а конечный 11111 и выборку паролей сразу разобрать по битам.

2. Дизассемблирование ROM'а игры и нахождение кода генерации/проверки пароля. После чего с алгоритмом можно разобраться на уровне кода и сделать альтернативную реализацию (генератор паролей).

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

На деле достаточно много игр с типовой реализацией парольной системы и разбирать подобные однотипные системы не очень интересно. Гораздо интереснее разбирать игры с нестандартной системой, например когда длина пароля переменна как в Power Monger или Syndicate. Там уже подход из п.1 не применим и остаётся только п.2. Кроме того, часто бывает полезно потрогать «неиспользуемые» биты в паролях, иногда это приводит к забавным находкам (например Olaf в RRR или бессмертие в Stargate)
К играм с нестандартной и одной из самых сложных парольных систем, думаю можно еще отнести например X-Perts (Sega Genesis).
Если правильно помню глядя на код генератора паролей, там используется подход «нумерация всех возможных комбинаций», а не явное задание конкретных битов, когда определённые биты сырого пароля хранят какой-либо атрибут. Подобный же подход встречал и описывал в Pocahontas.
Заранее извиняюсь, камера у меня весьма посредственная.
Вот Вы спрашивали, как было это всё вычислено.
Для примера возьму Super Castlevania IV.
Для начала я записал пароли на первый уровень с разными именами:
Нажми на меня
image

Потом я нашёл в Интернете пароли на второй квест и в итоге понял как номер квеста записывается в пароле.
Потом я разобрался с контрольными суммами и неиспользуемыми битами, и записал готовый «генератор»:
Нажми на меня
image

Не поймите неправильно, но это очень похоже на уроки «Как нарисовать сову».
Нет, я примерно представляю как это делается и сам в детстве увлекался брутфорсом паролей к играм и даже в тетрадку записывал всё.
Особенно помню игрушку Goal 5 (наверняка пиратская, так что оригинальное название не знаю).
Цель игры — выиграть в чемпионате мира по футболу, изначально на выбор даётся 16 команд (или 32?), и каждый соперник выбирается рандомно. При этом пароля на каждый раунд два: когда противник ещё неизвестен, и когда противник уже выбран.
Разумеется, никаких предустановленных паролей не было и я тупым перебором подбирал пароли, выписывал их, смотрел, какой это матч и кто противник, пытался найти различия между паролями, но на тот момент и не думал о том, что всё кодируется в двоичном виде и переводится в символьный. Думал, что кодирование только символьное. А уж о контрольной сумме и не думал вовсе.
Вроде эта игра.
очень похоже на уроки «Как нарисовать сову»

Эта ещё одна причина из-за которой я не хотел писать статью-туториал.
Не, я про эту.
А от создателей Nekketsu я в хоккей рубился.
А игру получилось «взломать»?
Я не помню, сколько паролей я подобрал — но у меня в несколько столбцов было исписано несколько страниц тетрадки :) И определённая закономерность там прослеживалась, но я не додумался в двоичную систему это переводить, чтобы искать было проще. Где сейчас эта тетрадь — неизвестно.
Не все из них брутом получены. Достаточно получить один пароль, где противник ещё не выбран, дождаться конца матча (проиграть) и получить пароль на игру с этим соперником. Потом ввести предыдущий и уже в том же раунде с другим противником сражаться, если рандом того же не подберёт.
Помню только, что в качестве стартового пароля выбрал тот, что даётся при проигрыше первого матча, а дальше перебором с последнего символа. Потому что брутить пароль вида AAAAAAAAAA перебором с инкрементом даже тогда выглядело для меня глупым.
В общем, в какой-то момент я бросил эту затею. Не хватило мне знаний для решения такой задачки. Да и было это лет 15 назад или больше.
Tarquim scores the first place knock-out
Jake finishes second
Глюк takes a weak third
Olaf is in another timezone
А в Metal Gear на NES, помнится, было посложнее. Жаль в далёкие 90-е не было интернетов, тем не менее, понять, что последний символ является контрольной суммой, удалось даже не зная самого понятия «контрольная сумма» :)
Интернета не было, но зато были книги кодов в которых были описаны алгоритмы генерации для игр: Road Rash 2, Metal gear, Prince of Persia, Bucky O'Hare, Ferrari Grand Prix Challenge.
Когда-то в детстве полностью отреверсил сохранения MetalGear, тетрадка была на вес золота, первая игра, которую разобрал. А потом и кучу других игр так разобрал, самое сложно было начать и понять как была построена защита, но в основном чёт только CRC и попадались.
Как раз в ней копаюсь. Японские пароли — это сила!
Есть локализованная английская версия, почему бы в ней не покопаться?
Я японский изучаю, так что выбор очевиден.
В любом случае, там есть над чем ломать голову. Я сам пытался выявить закономерности, но быстро бросил, когда при каждом заходе в комнату с паролем мне генерировался новый (просто зашёл, вышел и снова зашёл — ничего не изменилось в характеристиках, очках). После Ваших статей я понимаю — там наверняка усложнённая защита в виде примешивания случайных чисел, похлеще, чем в Принце Персии.
Похоже на рандом. Я с такой штукенцией сталкивался в Castlevania II Simon's Quest и в серии игр от Nekketsu. Очень сильно усложняет выявление закономерности.
Время нахождения в игре
Из Интернета узнал, что в игре используются 8 бит для операции XOR. Из-за этого, один и тот же пароль можно записать по разному. 2 в 8 степени = 256. Не хило. Большой рандом, ничего тут не скажешь.

Тоже в свое время пытался разобраться, как генерить пароли к RRR. Но не осилил по малолетству.


Очень интересная схема паролей в ecco the dolphin на сеге. Если взять сначала нечетные буквы, а потом четные, то часто получается рабочий пароль от другого уровня. Но рабочего генератора паролей, насколько я знаю, нет.

Есть рабочий генератор. Выше roman_pro скинул ссылку на страницу с генераторами.
Очень интересная публикация. Никогда не понимала, как могут «картинки» сохранять информацию. А вы случайно не пробовали генерировать пароли на Castlevania III Dracula's Curse и на Castlevania: Bloodlines? Там тоже схожая система паролей.
Увы и ах. Пытался, но всё безуспешно.
P.S. Я очень рад, что Вам понравилась моя статья.
Небольшая неточность в описании формата пароля для Super Castlevania IV — «эти биты сохраняют данные игровые параметры… имя игрока из 8 символов» — в 16 битах (N и C т.е. совмещенных с контрольной суммой) нельзя сохранить значения 8 символов по 36 вариантов каждого. Тут нужно как минимум 42 бита, если без сжатия. Таким образом получается, что имя вводится в игре отдельно и используется для проверки пароля, но не хранится в нём. Верно?
Имя хранится как сумма символов. К примеру, имя из буквы «M» и букв «AB» будут иметь одинаковый пароль, так как суммы символов равны. Если бы игра запоминала каждую букву, тогда бы понадобилась много битов, но в пароль записывается лишь сумма значение. Получается, если я создам имя «Nikname» и потом хоть как буду менять порядок букв в имени, пароль не изменится, так как сумма значений не меняется.
Игра хранит 36*8=288 значений.
P.S. Надеюсь я смог донести до Вас свою мысль.
Итого: имя НЕ хранится в пароле, а лишь используется для частичной валидации пароля. О чём и был мой вопрос, на который вы напрямую так и не ответили. Но всё равно спасибо.
Спасибо огромное статья отличная.
Благодарю. Рад, что не зря делал.
Sign up to leave a comment.

Articles