Генерування паролів на Super Castlevania IV і Rock n' Roll Racing

Добрий день, шановні користувачі.

Нещодавно я написав пост про генерацію паролів на перший і другий Road Rash. коментарях стаття мене попросили роз'яснити, а як влаштована система паролів у грі Rock n' Roll Racing. Про це я й хотів би з вами поговорити. Але почати хотілося б з гри Super Castlevania IV. Ну що ж, приступимо.

image

Super Castlevania IV

Ігри для SNES я ще не разу не «зламував». Ну, до одного моменту. Якось я побачив свого брата, що грає в цю гру. Та він як-би ненароком сказав, що було б дуже добре, якби можна було генерувати паролі на Super Castlevania IV. Недовго думаючи, я взявся за справу. Після трьох безсонних ночей, я зрозумів що і яким чином зберігає пароль.

Теорія

Пароль складається з 16 елементів (позицій), кожна комірка складається з 2 бітів, разом 16*2= 32 біта. Ці біти зберігають дані ігрові параметри:
  • номер рівня (0-14)
  • ім'я гравця з 8 символів
  • квест (1-4)
Тепер подивимося, з чого складається сирої пароль:

* в дужках вказано номер біта.
4(1),C4(0) D(1), D(0) ?(1), ?(0) 2(1), C2(0)
C6(1), C6(0) N(15), N(14) U1(1), U1(0) C5(1), C5(0)
U2(1), U2(0) C1(1), C1(0) ?(1), ?(0) L(1), L(0)
N(13), N(12) C3(1), C3(0) L(3), L(2) U3(1), U3(0)

Позначення
? — завжди дорівнює нулю.
U — невикористані біти.
D — (квест -1) (1-4) у двійковій системі числення. ( 00 — нормальна складність, 01 — підвищена складність. В Інтернеті я не знаходив паролів на 3 і 4 квест. Гра навіщо записує ці дані. Складність зростати не буде, але раптом, якщо пройти четвертий квест, відкриється секретна кінцівка? Хоча… швидше за все нічого не змінитися.)
N — значення імені в двійковій системі числення. З початкового значення віднімається сума значень імені.

* у дужках записані значення символів.
* [ ] — пробіл.
A (11) B (12) C (13) D (14) E (15) F (16) G (17) H (18) I (19)
J (20) K (21) L (22) M (23) N (24) O (25) P (26) Q (27) R (28)
S (29) T (30) U (31) V (32) W (33) X (34) Y (35) Z (36) [ ] (0)
1 (2) 2 (3) 3 (4) 4 (5) 5 (6) 6 (7) 7 (8) 8 (9) 9 (10)


L — номер рівня (0-14) div3) у двійковій системі числення.

* рівень B-3 складається з трьох частин.
Номер Рівень Початкове значення імені
0 1-1 2040
1 2-1 10240
2 3-1 14340
3 4-1 34826
4 5-1 10256
5 6-1 43026
6 7-1 51226
7 8-1 43042
8 9-1 47142
9 A-1 55343
10 B-1 14388
11 B-3 (1) 63543
12 B-3 (2) 2104
13 B-3 (3) 18489
14 B-4 34874


Контрольні суми
C1 = N(1), N(0) + D(1), D(0)
C2 = N(3), N(2) + C1(3), C1(2) + U2(1), U2(0)
C3 = N(5), N(4) + C2(3), C2(2) + U1(1), U1(0)
C4 = N(7), N(6) + C3(3), C3(2) + U3(1), U3(0)
C5 = N(9), N(8) + C4(3), C4(2)
C6 = N(11), N(10) + C5(3), C5(2)

Хочу звернути Вашу увагу на те, що два старших біти з однієї контрольної суми переходять у наступну контрольну суму.

Кодування
image

0 (00) — порожньо.
1 (01) — сокира.
2 (10) — свята вода.
3 (11) — серце.

Приклад генерації пароляСтворимо пароль, який зберігає дані параметри:
  • ім'я: «AWL[ ]VITA»
  • квест (4)

  • всі невикористовувані біти дорівнюють одиниці
  • рівень B-3 (2)


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

номер рівня (12div3=4) = 0100
квест (4) = 4-1=3 = 11

Обчислюємо значення імені:

AWL[ ]VITA = 11+33+22+0+32+19+30+11 = 158
2104-158= 1946 = 11110011010
N(15), N(14) = 00
N(13), N(12) = 00
N(11), N(10) = 01
N(9), N(8) = 11
N(7), N(6) = 10
N(5), N(4) = 01
N(3), N(2) = 10
N(1), N(0) = 10

Обчислюємо контрольні суми:
C1 = 10+11 = 0101
C2 = 10+01+11 = 0110
C3 = 01+01+11 = 0101
C4 = 10+01+11 = 0110
C5 = 11+01 = 0100
C6 = 01+01 =10

Записуємо отримані дані в таблицю:
10 11 00 10
10 00 11 00
11 01 00 00
00 01 01 11

Залишилося перекласти цифри в графічне зображення.


Rock n' Roll Racing

Цю гру я «зламував» давно і тоді не користувався методом бітового розбору. Тому підхід до цієї гри буде трохи іншою.

image

Теорія
Пароль складається з 12 позицій в яких зберігаються дані ігрові параметри:
  • складність (новобранець, ветеран, воїн)
  • дивізія (A, B)
  • машини (5 нормальних + 3 глюкнутых)
  • колір машини (5 нормальних + 1 глюкнутый)
  • планети (6 нормальних + 2 глюкнутых)
  • персонажі (6 нормальних + 1 секретний + 1 глюкнутый)
  • броня автомобіля (1-4)
  • двигун автомобіля (1-4)
  • підвіска автомобіля (1-4)
  • шини автомобіля (1-4)
  • шипи/міни (залежить від обраної машини) (0-7)
  • нітро/стрибок (залежить від обраної машини) (0-7)
  • ракети/патрони (залежить від обраної машини) (0-7)
  • кількість грошей (0-1599000$) з кроком = 1000.


Тепер подивимося, як змінюються значення у позиціях в залежності від вибраних ігрових параметрів:

Складність 1 позиція 4 позиція
Новобранець +0 XOR5
Ветеран XOR8 XOR1
Воїн XOR16 XOR13
Дивізія 1 позиція 7 позиція
A XOR8 +0
B +0 +2

Машина 2 позиція 3 позиція 9 позиція
Глюк +0 +0 +0
Глюк +0 XOR16 +4
Глюк (самоуничтожающаяся машина) XOR1 +0 +8
Air Blade XOR1 XOR16 +12
Marauder XOR2 +0 +16
Dirt Devil XOR2 XOR16 +20
Havac XOR3 +0 +24
Battle Trak XOR3 XOR16 +28
Колір машини 2 позиція 8 позиція
Червоний XOR20 +0
Зелений XOR16 +1
Чорний XOR28 +2
Синій XOR4 +4
Глюк (рожево-кислотно-зелений колір) +0 +5
Жовтий XOR12 +6
Двигун 1 позиція 10 позиція 11 позиція
1 +0 +0 +16
2 XOR4 +0 +0
3 XOR8 +1 +16
4 XOR12 +1 +0
Шини 1 позиція 4 позиція 10 позиція
1 +0 +0 +6
2 XOR16 +0 +4
3 +0 XOR16 +2
4 XOR16 XOR16 +0
Броня 3 позиція 9 позиція
1 XOR4 +1
2 +0 +0
3 XOR12 +3
4 XOR8 +2
Підвіска 3 позиція 10 позиція
1 +0 +8
2 XOR1 +0
3 XOR2 +24
4 XOR3 +16
Нітро/стрибок 1 позиція 2 позиція 11 позиція
0 +0 +0 +8
1 +0 XOR16 +10
2 XOR1 +0 +12
3 XOR1 XOR16 +14
4 XOR2 +0 +0
5 XOR2 XOR16 +2
6 XOR3 +0 +4
7 XOR3 XOR16 +6
Шипи/міни 2 позиція 11 позиція 12 позиція
0 +0 +1 +0
1 XOR2 +1 +8
2 XOR4 +1 +16
3 XOR6 +1 +24
4 XOR8 +0 +0
5 XOR10 +0 +8
6 XOR12 +0 +16
7 XOR14 +0 +24
Ракети/патрони 2 позиція 3 позиція 12 позиція
0 +0 +0 +0
1 +0 XOR8 +1
2 +0 XOR16 +2
3 +0 XOR24 +3
4 XOR1 +0 +4
5 XOR1 XOR8 +5
6 XOR1 XOR16 +6
7 XOR1 XOR24 +7
Планети 1 позиція 7 позиція 8 позиція
Bogmire +0 +1 +0
New Mojave XOR1 +1 +8
Chem VI XOR2 +1 +16
Drakonis XOR3 +1 +24
Глюк XOR4 +0 +0
Глюк XOR5 +0 +8
NHO XOR6 +0 +16
Inferno XOR7 +0 +24
Персонажі 1 позиція 3 позиція 4 позиція 7 позиція
Tarquim +0 XOR1 XOR16 +0
Jake Badlance XOR16 XOR1 XOR16 +4
Глюк +0 XOR1 +0 +8
Olaf (секретний персонаж) XOR16 XOR1 +0 +12
Cyberhawk +0 +0 XOR16 +16
Snake Sanders XOR16 +0 XOR16 +20
Katarina Lions +0 +0 +0 +24
Ivanzypher XOR16 +0 +0 +28


Тепер подивимося як змінюються позиції від кількості грошей:

X1з.X2з.X3з.X4з.000$

Кількість грошей потрібно розділити на 1000 та за залишком визначити зміни позицій.

1 позиція = XOR (x$ div 200)
2 позиція = XOR (3з.+ 0, якщо x$ div 100 парне число, або +16, якщо непарне число)
3 позиція = XOR (4з.* 2)
4 позиція = XOR (x$ div 400)
5 позиція =((x$ div 100)mod4) XOR ((x$ div 20) mod5)
( ↓ )
( Отримане число перетворюється)
відповідно до
0 → 13
1 → 5
2 → 29
3 → 21

6 позиція = ((x$ div 10)mod2) XOR 4з.
( ↓ )
( Отримане число перетворюється)
відповідно до
0 → 12
1 → 28

Кодування
Символи в позиціях приймають значення «BCDFGHJKLMNPQRSTVWXYZ0123456789!», де B=0, C=1… 9=30, !=31.

Приклад генерації пароляСтворимо пароль, який зберігає дані параметри:
  • складність (ветеран)
  • дивізія (A)

  • машина (Dirt Devil)
  • колір машини (червоний)
  • планета (New Mojave)
  • персонаж (Cyberhawk)
  • броня (1)
  • двигун (3)
  • підвіска (2)
  • шини (4)
  • шипи/міни (5)
  • нітро/стрибок (3)
  • ракети/патрони (7)
  • гроші (1257000$)
Обчислюємо гроші:
1257000/1000 = 1257
1 позиція = 1257 div 200 = 6 = XOR6
2 позиція = 5+(1257 div 100) = 5+12(так як число парне, то +0) = 5+0 = XOR5
3 позиція = 7*2 = 14 = XOR14
4 позиція = 1257 div 400 = 3 = XOR3
5 позиція = ((1257 div 100)mod4 = 0 → 13. 13 XOR (1257 div 20)mod5 = 13 XOR 2 = 15
6 позиція = ((1257 div 10)mod2 = 1 → 28. 28 XOR 7 = 27

Тепер записуємо значення позицій в таблицю:
* п. — позиція.
1 п. 2 п. 3 п. 4 п. 5 п. 6 п. 7 п. 8 п. 9 п. 10 п. 11 п. 12 п.
XOR6 XOR5 XOR14 XOR3 15 27 +1 +8 +20 +1 +16 +8
XOR8 XOR2 XOR16 XOR1 +0 +0 +16 +0 +1 +0 +14 +7
XOR8 XOR20 XOR4 XOR16 +0 +0 +0 +0 +0 +0 +0 +0
XOR8 XOR10 XOR1 XOR16 +0 +0 +0 +0 +0 +0 +0 +0
XOR16 XOR16 XOR24 +0 +0 +0 +0 +0 +0 +0 +0 +0
XOR1 XOR1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
XOR1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0


Виконуємо необхідні обчислення і отримуємо:
30,8,3,2 15,27,17,8 21,1,30,15

Тепер кодуємо дану рядок:

9LFD T6WL 0C9T


Висновок
Ну що ж, сподіваюся, я не дуже заплутав Вас з Rock n' Roll Racing. Удачі, спасибі за прочитання.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.