Недавно я увидел на Хабрахабре пост про Road Rash и мне стало интересно: «А как устроена система паролей в двух других частях?». Своими наблюдениями и результатом я хотел бы поделиться с вами в этой статье.

image

Первый Road Rash


Теория

Пароль состоит из 20 позиций, каждая позиция состоит из 5 битов, итого 20*5= 100 битов. Эти биты сохраняют данные игровые параметры:
  • номер занятого места (0-15) на пяти разных трассах (0 означает, что на этой трассе ты ещё не ездил).
  • количество очков (0-10485750)
  • количество денег ((-83886070)-83886070)
  • текущий уровень (1-5)
  • мотоцикл (1-8)

Теперь посмотрим из чего состоит сырой пароль:

(U,SN,SN,SN,SN) (U,PC,PC,PC,PC) (U,RF,RF,RF,RF) (U,PD,PD,PD,PD) (U,GV,GV,GV,GV) (H,H,H,H,H) (H,H,H,H,H) (H,H,H,H,H) (H,H,H,H,H) (N,M,M,M,C1) (M,M,M,M,C1) (M,M,M,M,C1) (M,M,M,M,C1) (M,M,M,M,C1) (M,M,M,M,C1) (U,U,L,L,L) (U,U,B,B,B) (C2,C2,C2,C2,C2) (C3,C3,C3,C3,C3) (C4,C4,C4,C4,C4)

Обозначения

U — неиспользуемые биты.
SN — номер занятого места в Sierra Nevada (0-15) в двоичной системе счисления.
PC — номер занятого места в Pacific Coast (0-15) в двоичной системе счисления.
RF — номер занятого места в Redwood Forest(0-15) в двоичной системе счисления.
PD — номер занятого места в Palm Desert (0-15) в двоичной системе счисления.
GV — номер занятого места в Grass Valey (0-15) в двоичной системе счисления.
H — количество очков (0-10485750) с шагом = 10. Количество очков делится на 10 и полученное число переводится в двоичную систему счисления.
N — бит отрицательных значений.
M — количество денег ((-83886070)-83886070) с шагом = 10.
Для того, чтобы создать положительное количество денег, нужно количество денег разделить на 10 и полученное число перевести в двоичную систему счисления.
Для того, чтобы создать отрицательное количество денег, нужно:
  1. Активировать бит отрицательных значений.
  2. Из числа 83886080 вычесть количество денег (по модулю), полученный остаток разделить на 10 и перевести число в двоичную систему счисления.

L — номер уровня (1-5) в двоичной системе счисления.
B — номер мотоцикла (0-7) в двоичной системе счисления.
Мотоциклы Номер
SHURIKEN 400 0
PANDA 600 1
BANZAI 750 2
KAMIKAZE 750 3
SHURIKEN 1000 4
FERRUCI 850 5
PANDA 750 6
DIABLO 1000 7

С1 = (сумма позиций с 1 по 17) mod64 (Полученное число переводится в двоичную систему счисления и зеркально отражается).
С2 = (сумма позиций с 6 по 10) mod32.
C3 = (сумма позиций с 11 по 15) mod32.
C4 = C2 XOR C3.

Кодирование

Символы в позициях могут принимать значения 0-9 и A-V. Биты в позициях кодируются в соответствии с тем, что 0=00000, 1=00001, 2=00010… U=11110, V=11111. То есть, это простое 5 битное кодирование.

Пример генерации пароля с положительным количеством денег
Создадим пароль, который сохраняет данные параметры:
  • SN=5 место, PC=3 место, RF=7 место, PD=9 место, GV=1 место
  • количество очков (10341950)
  • количество денег (23915840)
  • текущий уровень (5)
  • мотоцикл (6)
  • все неиспользуемые биты равны нулю

Переводим значения в двоичную систему счисления:

5=0101
3=0011
7=0111
9=1001
1=0001
10341950 очков/10=1034195=11111100011111010011
23915840 денег/10=2391584=1001000111111000100000
уровень 5=101
номер мотоцикла 6=110

Записываем сырой пароль и вычисляем 4 контрольные суммы:

(00101) (00011) (00111) (01001) (00001) (11111) (10001) (11110) (10011) (0010*) (0100*) (0111*) (1110*) (0010*) (0000*) (00101) (00110) (*****) (*****) (*****)

Теперь переводим значения в двоичную систему счисления (* =0):
(5) (3) (7) (9) (1) (31) (17) (30) (19) (4) (8) (14) (28) (4) (0) (5) (6) (0) (0) (0).

Теперь вычисляем первую контрольную сумму:
C1= (5+3+7+9+1+31+17+30+19+4+8+14+28+4+0+5+6)mod64=191mod64= 63= 111111 (теперь зеркально отражаем контрольную сумму)=111111 (записываем полученное число вместо *).
(00101) (00011) (00111) (01001) (00001) (11111) (10001) (11110) (10011) (00101) (01001) (01111) (11101) (00101) (00001) (00101) (00110) (*****) (*****) (*****)

Теперь вычисляем вторую, третью и четвёртую контрольные суммы (нужно не забывать, что из-за C1, значения некоторых позиций изменились):
C2= (31+17+30+19+5)mod32= 102mod32= 6= 00110.
C3= (9+15+29+5+1)mod32=59mod32= 27= 11011.
C4=
00110
XOR
11011
=
11101=29

Записываем получившийся пароль в десятичной системе счисления:
(5) (3) (7) (9) (1) (31) (17) (30) (19) (5) (9) (15) (29) (5) (1) (5) (6) (6) (27) (29)

Теперь кодируем получившиеся значения:
5,3,7,9,1 V,H,U,J,5
9,F,T,5,1 5,6,6,R,T


Пример генерации пароля с отрицательным количеством денег
Создадим пароль, который сохраняет данные параметры:
  • SN=2 место, PC=5 место, RF=8 место, PD=11 место, GV=13 место
  • количество очков (5931870)
  • количество денег (-53724780)
  • текущий уровень (2)
  • мотоцикл (3)
  • все неиспользуемые биты равны единице

Переводим значения в двоичную систему счисления:

2=0010
5=0101
8=1000
11=1011
13=1101
5931870 очков/10=593187=10010000110100100011
83886080-[-53724780]=30161300. 30161300/10=3016130=1011100000010111000010
уровень 2=010
номер мотоцикла 3=011

Записываем сырой пароль и вычисляем 4 контрольные суммы:

(10010) (10101) (11000) (11011) (11101) (10010) (00011) (01001) (00011) (1010*) (1110*) (0000*) (0101*) (1100*) (0010*) (11010) (11011) (*****) (*****) (*****)

Теперь переводим значения в двоичную систему счисления (* =0):
(18) (21) (24) (27) (29) (18) (3) (9) (3) (20) (28) (0) (10) (24) (4) (26) (27) (0) (0) (0)

Теперь вычисляем первую контрольную сумму:
C1= (18+21+24+27+29+18+3+9+3+20+28+0+10+24+4+26+7)mod64=291mod64= 35= 100011 (теперь зеркально отражаем контрольную сумму)=110001 (записываем полученное число вместо *).
(10010) (10101) (11000) (11011) (11101) (10010) (00011) (01001) (00011) (10101) (11101) (00000) (01010) (11000) (00101) (11010) (11011) (*****) (*****) (*****)

Теперь вычисляем вторую, третью и четвёртую контрольные суммы (нужно не забывать, что из-за C1, значения некоторых позиций изменились):
C2= (18+3+9+3+21)mod32=54mod32=22=10110
C3= (29+0+10+24+5)mod32=68mod32=4=00100
C4=
10110
XOR
00100
=
10010=18
Записываем получившийся пароль в десятичной системе счисления:
(18) (21) (24) (27) (29) (18) (3) (9) (3) (21) (29) (0) (10) (24) (5) (26) (27) (22) (4) (18)

Теперь кодируем получившиеся значения:
I,L,O,R,T I,3,9,3,L
T,0,A,O,5 Q,R,M,4,I


image

Второй Road Rash


Теория

Пароль состоит из 8 позиций, каждая позиция состоит из 5 битов, итого 8*5=40 битов. Эти биты сохраняют данные игровые параметры:
  • пройденные трассы на данном уровне (0-5)
  • количество денег (0-327670)
  • текущий уровень (1-5)
  • мотоцикл (1-16)

Теперь посмотрим из чего состоит сырой пароль:

(?,M,M,M,C1) (M,M,M,M,C1) (M,M,M,M,C1) (M,M,M,M,C1) (U,U,L,L,L) (B,B,B,B,C1) (T,T,T,T,T) (C2,C2,C2,C2,C2)

Обозначения

? — всегда равен нулю.
U — неиспользуемые биты.
M — количество денег (0-327670) с шагом=10. Количество денег делится на 10 и полученное число переводится в двоичную систему счисления.
L — номер уровня (1-5) в двоичной системе счисления.
B — номер мотоцикла (0-15) в двоичной системе счисления.
Мотоциклы Номер
SHURIKEN 400 0
PANDA 500 1
SHURIKEN TT250 2
PANDA 900 3
BANZAI 7.11 4
BANZAI 600 N 5
BANZAI 750 N 6
SHURIKEN 1000 N 7
BANZAI 7.11 N 8
DIABLO 1000 N 9
PANDA 600 10
BANZAI 600 11
BANZAI 750 12
SHURIKEN 1000 13
DIABLO 1000 14
WILD THING 15

T — пройденные трассы (0-5).
Порядок битов от старшего к младшему:
4 — отвечает за прохождение пятой трассы.
3 — отвечает за прохождение четвёртой трассы.
2 — отвечает за прохождение третьей трассы.
1 — отвечает за прохождение второй трассы.
0 — отвечает за прохождение первой трассы.
C1= (сумма позиций с 1 по 6, не считая 5 позицию)mod32 (Полученное число переводится в двоичную систему счисления и зеркально отражается).
C2= ((сумма позиций с 1 по 6)mod32) XOR 7 позиция.

Кодирование

Кодирование значений такой же, как и в первой части.

Пример генерации пароля
Создадим пароль, который сохраняет данные параметры:
  • пройдены пятая, третья и первая трассы
  • количество денег (193750)
  • текущий уровень (3)
  • мотоцикл (9)
  • все неиспользуемые биты равны нулю

Переводим значения в двоичную систему счисления:

пройденные трассы = 10101
номер уровня 3 = 011
номер мотоцикла 9 = 1001
193750 денег/10= 19375= 100101110101111

Записываем сырой пароль и вычисляем 2 контрольные суммы:

(0100*) (1011*) (1010*) (1111*) (00011) (1001*) (10101) (*****)

Теперь переводим значения в двоичную систему счисления (* =0):
(8) (22) (20) (30) (3) (18) (21) (0)

Теперь вычисляем первую контрольную сумму:
C1= (8+22+20+30+18)mod32= 98mod32= 2= 00010 (теперь зеркально отражаем контрольную сумму)=01000 (записываем полученное число вместо *).
(01000) (10111) (10100) (11110) (00011) (10010) (10101) (*****).

Теперь вычисляем вторую контрольную сумму (нужно не забывать, что из-за C1, значения некоторых позиций изменились):
C2= (8+23+20+30+3+18)mod32= 102mod32= 6mod32= 00110.
00110
XOR
10101
=
10011= 19

Записываем получившийся пароль в десятичной системе счисления:
(8) (23) (20) (30) (3) (18) (21) (19)

Теперь кодируем получившиеся значения:
8,N,K,U 3,I,L,J


Но это ещё не всё!
Я приготовил кое-что ещё…

На десерт — Banana Prince


Немного отвлечёмся от приставки Sega и перейдём на Nes (Денди). Эта игра очень сильно потрепала мои нервы. Кто играл, тот помнит длиннющие вопросы на японском, из-за которых прохождение игры превращается в ад. Пароли в ней простые, да с подковыркой. Чтобы пройти игру на 100% нужно было собрать 4 доспеха. Но есть одна проблема, чтобы их получить, надо было ответить на тонну вопросов. Сколько я ни копался в Интернете и в своей книге кодов, я так и не нашёл пароли, которые сохраняют собранные доспехи. А без них, финальный босс пошлёт вас куда подальше тонной японских иероглифов. Но покопавшись в назначениях битов, я нашёл, что игра сохраняет:
  • номер текущего уровня (0-20) в десятичной системе счисления
  • номер оружия (0-15)
  • доспехи (0-4)

Пароль состоит из 8 позиций, каждая позиция состоит из 2 битов, итого 8*2=16 битов.

Теперь посмотрим из чего состоит сырой пароль:

(C,C) (A,L) (L,L) (L,L) (C,C) (G,G) (A,A) (G,G)

Обозначения

C = (сумма всех позиций, кроме 1 и 5) в двоичной системе счисления. Два старших бита контрольной суммы записываются в 5 позицию, а два младших бита в 1 позицию.
A — количество доспехов (0-4) в двоичной системе счисления.
L — номер уровня (0-20) в двоичной системе счисления.
Уровни Номер
1-1 0
1-2 1
1-3 2
2-1 3
2-2 4
2-3 5
3-1 6
3-2 7
3-3 8
4-1 9
4-2 10
4-3 11
5-1 12
5-2 13
5-3 14
6-1 15
6-2 16
6-3 17
7-1 18
7-2 19
7-3 20

G — номер оружия (0-15) в двоичной системе счисления.

Кодирование

Для кодирования используют 4 степени поедания банана, которые мы обозначим цифрами:
image = 0 image = 1 image = 2 image = 3

Пример генерации пароля
Создадим пароль, который сохраняет данные параметры:
  • персонаж имеет 4 доспеха
  • номер уровня (20)
  • номер оружия (15)

Переводим значения в двоичную систему счисления:

4 = 100
20 = 10100
15 = 1111

Записываем сырой пароль:

(**) (11) (01) (00) (**) (11) (00) (11)

Теперь переводим значения в двоичную систему счисления (* =0):
(0) (3) (1) (0) (0) (3) (0) (3)

Вычисляем контрольную сумму:
C= (3+1+0+3+0+3)= 10= 1010. 10(два старших бита)10(два младших бита).

Записываем получившийся пароль в десятичной системе счисления:
(2) (3) (1) (0) (2) (3) (0) (3)

Осталось перевести цифры в банановый эквивалент.

Заключение


Вот мы и вышли на финишную прямую.
image

Что хотелось бы сказать? Ну что ж, надеюсь, эта статья кому-то да пригодится. Удачи, спасибо за прочтение.
Поделиться с друзьями
-->

Комментарии (14)


  1. Nivalis
    15.06.2016 13:22

    Ещё были необычные пароли в International superstar soccer deluxe. Я сколько бы ни пытался записать пароль, никогда не мог его правильно воспроизвести, поэтому всегда проходил сначала.


  1. Smi1e
    15.06.2016 13:54
    +1

    Привет от автора оригинальной статьи из далекого 2010-го :)
    Отличное продолжение, вы молодец!


    1. awlvita
      15.06.2016 14:14
      +1

      Спасибо. Я очень рад, что не зря старался.


  1. Apatic
    15.06.2016 15:27
    +2

    У меня одного сейчас в голове заиграла эта мелодия?


    1. RUS2AN
      15.06.2016 20:22

      Во второй версии мне больше нравился саундтрек.


      1. johan_krs
        16.06.2016 08:38
        +1

        особенно хорош логотип с переходом из синего в желтый. классика того времени.


        1. Apatic
          16.06.2016 10:12

          Это типа пустыня и небо


  1. Chumaster59
    15.06.2016 15:58

    Я кончено не на таком уровне но тоже любил давным давно покопаться в паролях к Rock'n'Roll Racing
    находил закономерность (деньги, игрок, машина и тп) и подбирал довольно интересные пароли
    Хотел бы увидеть статью именно об этой игре =)


    1. awlvita
      15.06.2016 16:08
      +1

      Будет время — будет статья и об этой игре. Главное, чтобы были люди, которым оно надо.


  1. sovetnik
    15.06.2016 22:33
    +1

    Ещё можете обратить внимание на игру Zero Tolerance, на sega. Там пароли тоже интересные. В детстве помню, что-то с ними делал, но не помню что именно уже.


  1. roman_pro
    16.06.2016 00:03
    +3

    Помнится тоже разбирал пароли к Road Rash, и пришёл к выводу, что не все неиспользуемые биты совсем не используются.Так и осталось неясным назначение 2х старших битов в символе, отвечающем за мотоцикл. 2 бита позволяют кодировать значение от 0 до 3. Это значение живёт в RAM по адресу FF0522 (и копируется по адресу FF0520), считывается на заставках перед гонкой и после. В случае штрафа или аварии уменьшается на 1. Так же есть явное сравнение ячейки FF0520 с тройкой по адресу 12F9A и явная запись значения 3 в эту ячейку по адресу 14908.
    Кстати, помимо разбора алгоритма и его описания в ЖЖ http://roman-pro.livejournal.com/tag/passgens, у меня как хобби ещё реализация генераторов паролей для ленивых, например на javascript к RR и RR2:
    http://passgens.narod.ru/SMD_RoadRash.html
    http://passgens.narod.ru/SMD_RoadRash2.html


    1. awlvita
      16.06.2016 09:12

      Биты вроде используются, а вроде и нет. Запутанно всё в первой части. Хорошо, что во второй и третьей частях сделано всё гораздо легче. И спасибо за генераторы паролей.) Теперь не придётся всё вручную составлять.


  1. oleg_gavrilov
    16.06.2016 12:26

    Огромная просьба к автору, посмотрите пожалуйста пароли к Metal Gear (NES). Помнится, можно было рандомно вбить любые символы и получить какое-то состояние игры.


    1. awlvita
      16.06.2016 12:32

      Здравствуйте, на GameFaqs есть описание генерации паролей к этой игре.