эмуФорум :: emuForum - оглавление
Search  
Взлом генератора паролей сеговской игры Zero Tolerance.
  
Открыть новую тему   Ответить на тему    эмуФорум :: emuForum - оглавление -> Коды и прохождения
Предыдущая тема :: Следующая тема  
Автор Сообщение
Organic (SMS)
Фанат

Тут с: 25.08.2001
Сообщения: 172
Я из: Чехов
СообщениеДобавлено: 23 Ноя 2006 01:04    Заголовок сообщения: Взлом генератора паролей сеговской игры Zero Tolerance. Ответить с цитатой

Вначале общие положения.

Пароль может состоять из 64 символов:

Код:

A B C D E F G H
J K L M N O P Q
R S T U V W X Y
Z a b c d e f g
h i j k m n o p
q r s t u v w x
y z 2 3 4 5 6 7
8 9 ? ) ! / - *


Соответствие символьного и двоичного представления пока неизвестно, но скорее всего коды представленных символов идут не последовательно от 0 до 63, а как нибудь в перепутанном виде. (Пока не известно точно, но это нужно учитывать).

Длина пароля составляет 9 6-битных символов, то есть всего 54 бита.

Теперь о условиях генерации пароля.

Всего в игре 5 коммандос: Satoe Ishii, Tony Ramos, Justin Wolf, Scott Haile и Tomas Gjoerup. Все коды проверяются Tony Ramos-ом, так как у него нет дополнительной аммуниции, котоорая добавляется к введенному паролю.

При генерации пароля игра учитывает следующие параметры:
1. Аммуниция в 1-5 клетках инвентаря.
2. Кто из отряда убит (Decased).
3. Номер этапа.
4. Показатель жизненной энергии.

Опытным путем было выяснено, что количество аммуниции сохраняется не точно, а с некоторым округленим, для экономии места в пароле. Аммуниция условно делится на два вида - стрелковое оружие и экипировка.
Стрелковое оружие: Пистолет, Шотган, Мина, Лазерная Винтовка, Граната, Ракетница, Лазерный Пистолет. Максимальное количество зарядов у любой пушки - 99.
Экипировка: Бронежилет, Огнетушитель, Огнеупорный Костюм, Фонарь, Био-сканер, Прибор Ночного Видения, Огнемет. Максимальное количество зарядов у любой аммуниции - 100, но заряды тратятся десятками.

Значения энергии и аммуниции в пароле округляются следующим образом:
Округление энергии E (таблица не закончена):
Код:

00-00  10-10  20-??  30-??  40-40  50-??  60-60  70-70  80-??  90-90
01-??  11-??  21-??  31-??  41-??  51-51  61-60  71-71  81-??  91-91
02-??  12-12  22-??  32-??  42-??  52-??  62-62  72-71  82-82  92-??
03-??  13-??  23-23  33-??  43-43  53-??  63-62  73-73  83-82  93-93
04-??  14-??  24-24  34-??  44-??  54-??  64-??  74-73  84-84  94-??
05-??  15-15  25-??  35-35  45-??  55-??  65-??  75-??  85-??  95-95
06-??  16-??  26-26  36-??  46-??  56-??  66-??  76-76  86-??  96-??
07-??  17-??  27-26  37-37  47-??  57-??  67-??  77-??  87-87  97-??
08-??  18-??  28-??  38-38  48-48  58-??  68-68  78-??  88-88  98-98
09-??  19-??  29-??  39-38  49-??  59-??  69-??  79-79  89-88  99-98

(00-00: Есть даже такой вариант, но только боец сразу погибает).

Округление стрелкового оружия (Ammo):
Код:

 1 <=  6 <= 12      50 <= 55 <= 61
13 <= 18 <= 24      62 <= 68 <= 74
25 <= 30 <= 37      75 <= 80 <= 86
38 <= 43 <= 49      87 <= 92 <= 99


Округление экипировки (таблица не закончена):
Код:

100%-> ?    50% -> 40%
90% -> ?    40% -> ?
80% -> ?    30% -> 30%
70% -> ?    20% -> ?
60% -> ?    10% -> 100% (Чит, обновление экипировки!)


Ещё одна особенность - как распологается оружие и экипировка в клетках, после набора пароля. Там просматривается некая упорядоченность - по старшинству.
Самое старшее распологается в 3 клетке,
2 по старшенству в 4 клетке,
3 по старшенству в 5 клетке,
4 по старшенству в 1 клетке,
5 по старшенству во 2 клетке.
Видимо это связано с порядковым номером оружия/экипировки в пароле. Пока что ряд у меня такой: Био-Сканер, Бронежилет, Огнетушитель, Гранаты, Пистолет, Лазерный пистолет, Ракетница, Шотган, Огнемет, Лазерная винтовка. Не ясен порядковый номер для: Мина, Огнеупорный Костюм, Фонарь и Прибор Ночного Видения.

Всего в игре 40 этапов, условно обозначенных #0...#39.

Итак, вот обобщение о значениях входящих в пароль:
Пароль состоит из 54 бит.
- (4 (порядковый номер) + 3 (количество зарядов)) * 5 (клеток) = 35 бит занимает аммуниция.
- 5 бит занимает количество живых бойцов (один боец - один бит)
- 6 бит занимает номер этапа (всего 40 уровней)
- 6 или 7 бит занимает энергия
- Ещё сколько-то бит занимает возможная контрольная сумма

Некоторые предположения о генерации пароля: скорее всего в пароле используется какой-нибудь запутанный алгоритм для защиты от простого пербора уменьшением какого-нибудь параметра на 1. Также возможно используется "контрольная сумма" для проверки правильности пароля.

Коды с пустым инвентарем, E=98 и всеми бойцами (меняется только этап):
Код:

#01: D!Lbv/)uD  #11: P!Lb*/JgF  #21: HjKU*/)mU  #31: P!Lb5/)uF
#02: LjKbv/)uF  #12: HjKb*/JgF  #22: D!LU*/)gD  #32: HjKb5/)uF
#03: P!Lbv/)uF  #13: ?          #23: LjKU*/)gF  #33: D!Lb5/)uz
#04: HjKbv/)uF  #14: D!LU*/JuD  #24: P!LU*/)gF  #34: Lj)bn/JmU
#05: D!Lbv/)uz  #15: LjKU*/JuF  #25: HjKU*/)gF  #35: P!Jbn/JmU
#06: LjKb*/JmU  #16: P!LU*/JuF  #26: D!LU*/)gz  #36: Hj)bn/JmU
#07: P!Lb*/JmU  #17: HjKU*/JuF  #27: LjKU*/)qU  #37: D!Jbn/JgD
#08: HjKb*/JmU  #18: D!LU*/Juz  #28: ?          #38: Lj)bn/JgF
#09: D!Lb*/JgD  #19: LjKU*/)mU  #29: D!Lb5/)uD  #39: P!Jbn/JgF 
#10: LjKb*/JgF  #20: P!LU*/)mU  #30: LjKb5/)uF

(Чтобы получить такой пароль достаточно растратить весь боезапас перед получением пароля).

И напоследок пара хак-паролей, которые невозможно получить, честно играя в игру :)
!QLKrQZ6p - пароль с нулевой жизненной энергией
DFg***Kvx - второй уровень с лазерной винтовкой!

0 error(s), 0 warning(s)


Последний раз редактировалось: Organic (23 Ноя 2006 04:53), всего редактировалось 1 раз
manjak2003 (SMS)
Монстр

Тут с: 14.04.2003
Сообщения: 827
Я из: Riga, Latvia
СообщениеДобавлено: 23 Ноя 2006 01:39    Заголовок сообщения: Ответить с цитатой

Пока читал мозги оплавились. Как говорил мой препод по высшей математике в институте "Ничего сложного тут нет. Надо только правильно рассуждать"
$AND$
Pinball Wizzard (SMS)
Монстр

Тут с: 30.04.2003
Сообщения: 1414
Я из: Moscow, Russia
СообщениеДобавлено: 23 Ноя 2006 01:43    Заголовок сообщения: Ответить с цитатой

А есть возможность, что в игре есть что-то, что никто еще не видел: другое оружие и уровни?
Don`t panic!!!
Status:..До чего же назойливыми бывают Wizzard`ы!!!
Organic (SMS)
Фанат

Тут с: 25.08.2001
Сообщения: 172
Я из: Чехов
СообщениеДобавлено: 23 Ноя 2006 20:31    Заголовок сообщения: Ответить с цитатой

Всё может быть.. Там для уровней зарезервировано 64 номера (6 бит), а в игре только 40 уровней. Может и секретный есть ;)

добавлено спустя 1 час 18 минут:

Путем ром-хакинга удалось установить, что реальная таблица символов, на самом деле выглядит так:

Код:

x B ? D E j G H
) J K L M N O P
R S T U V Q W X
Y Z a b e f c d
h i g F k ! m n
o p q r s t u v
w y A z 2 7 4 5
3 9 6 8 C / - *


(Это довольно распространенный прием в генераторах паролей на приставках - называется замена алфавита).

То есть, к примеру пароль !QLKrQZ6p на самом деле будет nWMtWa?r. Если записать его в 8-ричной системе счисления, то он будет выглядеть так 4525135325317251.

Есть прогресс. Теперь осталось выяснить как изменяются биты при изменении, например, количества живых коммандос, или после изменения номера этапа.

добавлено спустя 17 часов 4 минуты:

Простым подбором получить алгоритм не удалось, значит придется хакать ром с помощью отладчика Gens и его модификации Gens Tracer 2.14.

Начинаем трассировку в Gense, вывалившись в его отладчик.. Там он крутится на каком-то цикле. Все такие циклы мы пропускаем кнопкой N.

Код:

001A38  B06E 8000                   CMP.W   -$8000(A6),D0   D0 = 111F, A6 = FF8000
001A3C  67FA                        BEQ.S   $00001A38
001A3E  4E75                        RTS


0581A2  4EB9 0000 079A              JSR $0000079A


00079A  4EB9 000C 5BB6              JSR $000C5BB6


Код:

0C5BB6  40E7                        MOVE    SR,-(A7)
0C5BB8  007C 0700                   ORI.W   #$0700,SR
0C5BBC  33FC 0100 00A1 1100         MOVE.W  #$0100,$00A11100
0C5BC4  0839 0000 00A1 1100         BTST    #0,$00A11100
0C5BCC  66F6                        BNE.S   $000C5BC4
0C5BCE  13FC 0001 00A0 1B20         MOVE.B  #$01,$00A01B20
0C5BD6  1039 00A0 1B21              MOVE.B  $00A01B21,D0
0C5BDC  33FC 0000 00A1 1100         MOVE.W  #$0000,$00A11100
0C5BE4  4A00                        TST.B   D0
0C5BE6  6708                        BEQ.S   $000C5BF0
0C5BE8  7044                        MOVEQ   #$44,D0
0C5BEA  51C8 FFFE                   DBRA    D0,$000C5BEA
0C5BEE  60CC                        BRA.S   $000C5BBC
0C5BF0  46DF                        MOVE    (A7)+,SR
0C5BF2  4E75                        RTS

Передача данных по шине Z80. Видимо что-то связанное со звуком.


Код:

0007A0  47EE 8544                   LEA -$7ABC(A6),A3
0007A4  33FC 8174 00C0 0004         MOVE.W  #$8174,$00C00004
0007AC  40E7                        MOVE    SR,-(A7)
0007AE  46FC 2700                   MOVE    #$2700,SR
0007B2  0C93 FFFF FFFF              CMPI.L  #$FFFFFFFF,(A3)
0007B8  6700 0032                   BEQ.W   $000007EC
0007BC  23DB 00C0 0004              MOVE.L  (A3)+,$00C00004
0007C2  23DB 00C0 0004              MOVE.L  (A3)+,$00C00004
0007C8  23DB 00C0 0004              MOVE.L  (A3)+,$00C00004
0007CE  33DB 00C0 0004              MOVE.W  (A3)+,$00C00004
0007D4  3039 00C0 0004              MOVE.W  $00C00004,D0
0007DA  0240 0002                   ANDI.W  #$0002,D0
0007DE  66F4                        BNE.S   $000007D4
0007E0  23FC 0000 0020 00C0 0004    MOVE.L  #$00000020,$00C00004
0007EA  60C6                        BRA.S   $000007B2
0007EC  2D7C 00FF 0544 8036         MOVE.L  #$00FF0544,-$7FCA(A6)
0007F4  46DF                        MOVE    (A7)+,SR
0007F6  33FC 8164 00C0 0004         MOVE.W  #$8164,$00C00004
0007FE  4EF9 000C 5BF4              JMP $000C5BF4

Что-то связанное с VDP, видимо отрисовка изображения.

Код:

0C5BF4  40E7                        MOVE    SR,-(A7)
0C5BF6  007C 0700                   ORI.W   #$0700,SR
0C5BFA  4EB9 000C 5C12              JSR $000C5C12
0C5C12  33FC 0100 00A1 1100         MOVE.W  #$0100,$00A11100
0C5C1A  0839 0000 00A1 1100         BTST    #0,$00A11100
0C5C22  66F6                        BNE.S   $000C5C1A
0C5C24  4E75                        RTS
0C5C00  13FC 0000 00A0 1B20         MOVE.B  #$00,$00A01B20
0C5C08  4EB9 000C 5C26              JSR $000C5C26
0C5C26  33FC 0000 00A1 1100         MOVE.W  #$0000,$00A11100
0C5C2E  4E75                        RTS
0C5C0E  46DF                        MOVE    (A7)+,SR
0C5C10  4E75                        RTS

Опять что-то связанное с Z80.

Код:

0581A8  4EB8 0804                   JSR $00000804.W

000804  4A2E 8018                   TST.B   -$7FE8(A6)
000808  6602                        BNE.S   $0000080C

00080C  4EB9 000C 5C12              JSR $000C5C12

000812  43F9 00A1 0003              LEA $00A10003,A1
000818  41EE 802E                   LEA -$7FD2(A6),A0           A0 = FF002E
00081C  3D50 8032                   MOVE.W  (A0),-$7FCE(A6)     (A0) было 0090. Записать старое значение (?)
000820  12BC 0040                   MOVE.B  #$40,(A1)
000824  4E71                        NOP
000826  4E71                        NOP
000828  4E71                        NOP
00082A  1011                        MOVE.B  (A1),D0
00082C  4E71                        NOP
00082E  4E71                        NOP
000830  4E71                        NOP
000832  12BC 0000                   MOVE.B  #$00,(A1)
000836  4E71                        NOP
000838  4E71                        NOP
00083A  4E71                        NOP
00083C  1211                        MOVE.B  (A1),D1
00083E  4E71                        NOP
000840  4E71                        NOP
000842  4E71                        NOP
000844  12BC 0040                   MOVE.B  #$40,(A1)
000848  4E71                        NOP
00084A  4E71                        NOP
00084C  4E71                        NOP
00084E  1411                        MOVE.B  (A1),D2
000850  4E71                        NOP
000852  4E71                        NOP
000854  4E71                        NOP
000856  12BC 0000                   MOVE.B  #$00,(A1)
00085A  4E71                        NOP
00085C  4E71                        NOP
00085E  4E71                        NOP
000860  1411                        MOVE.B  (A1),D2
000862  4E71                        NOP
000864  4E71                        NOP
000866  4E71                        NOP
000868  12BC 0040                   MOVE.B  #$40,(A1)
00086C  4E71                        NOP
00086E  4E71                        NOP
000870  4E71                        NOP
000872  1411                        MOVE.B  (A1),D2
000874  4E71                        NOP
000876  4E71                        NOP
000878  4E71                        NOP
00087A  12BC 0000                   MOVE.B  #$00,(A1)
00087E  4E71                        NOP
000880  4E71                        NOP
000882  4E71                        NOP
000884  1611                        MOVE.B  (A1),D3
000886  4E71                        NOP
000888  4E71                        NOP
00088A  4E71                        NOP
00088C  12BC 0040                   MOVE.B  #$40,(A1)
000890  4E71                        NOP
000892  4E71                        NOP
000894  4E71                        NOP
000896  1811                        MOVE.B  (A1),D4
000898  4E71                        NOP
00089A  4E71                        NOP
00089C  4E71                        NOP
00089E  12BC 0000                   MOVE.B  #$00,(A1)
0008A2  4E71                        NOP
0008A4  4E71                        NOP
0008A6  4E71                        NOP
0008A8  1411                        MOVE.B  (A1),D2
0008AA  4E71                        NOP
0008AC  4E71                        NOP
0008AE  4E71                        NOP
0008B0  12BC 0040                   MOVE.B  #$40,(A1)
{
    D0 = PORTHI     Чтение кнопок джойстика.
    D1 = PORTLO
    D2 = PORTLO
    D3 = PORTLO
    D4 = PORTHI
}
0008B4  0243 000F                   ANDI.W  #$000F,D3
0008B8  0242 000F                   ANDI.W  #$000F,D2
0008BC  B742                        EOR.W   D3,D2
0008BE  0C42 000F                   CMPI.W  #$000F,D2
0008C2  6706                        BEQ.S   $000008CA
0008C4  383C 00FF                   MOVE.W  #$00FF,D4
0008C8  6004                        BRA.S   $000008CE
0008CA  0884 0004                   BCLR    #4,D4
0008CE  E541                        ASL.W   #2,D1
0008D0  3401                        MOVE.W  D1,D2
0008D2  1011                        MOVE.B  (A1),D0
0008D4  0242 0030                   ANDI.W  #$0030,D2
0008D8  6704                        BEQ.S   $000008DE
0008DA  323C 00FF                   MOVE.W  #$00FF,D1
0008DE  0240 003F                   ANDI.W  #$003F,D0
0008E2  0241 00C0                   ANDI.W  #$00C0,D1
0008E6  8041                        OR.W    D1,D0
0008E8  4640                        NOT.W   D0
0008EA  4644                        NOT.W   D4
0008EC  10C0                        MOVE.B  D0,(A0)+
0008EE  1084                        MOVE.B  D4,(A0)
Обработка кнопок джойстика в переменную WORD. [$FF002E].                  <------------ Вот ключевой момент.
0008F0  4EB9 000C 5C26              JSR $000C5C26
0008F6  4E75                        RTS

В этой процедуре происходит обработка кнопок.

Код:

0C5C26  33FC 0000 00A1 1100         MOVE.W  #$0000,$00A11100
0C5C2E  4E75                        RTS


0581AC  3D7C 0001 8042              MOVE.W  #$0001,-$7FBE(A6)
0581B2  45EE 8044                   LEA -$7FBC(A6),A2           A2 = FF0044
0581B6  2D4A 803E                   MOVE.L  A2,-$7FC2(A6)       
0581BA  362E 86E4                   MOVE.W  -$791C(A6),D3
0581BE  E94B                        LSL.W   #4,D3
0581C0  0643 009E                   ADDI.W  #$009E,D3
0581C4  382E 86E2                   MOVE.W  -$791E(A6),D4
0581C8  E94C                        LSL.W   #4,D4
0581CA  0644 00E5                   ADDI.W  #$00E5,D4
0581CE  3A03                        MOVE.W  D3,D5
0581D0  0645 000B                   ADDI.W  #$000B,D5
0581D4  3C04                        MOVE.W  D4,D6
0581D6  5C46                        ADDQ.W  #6,D6
0581D8  0C6E 0008 86E4              CMPI.W  #$0008,-$791C(A6)
0581DE  6610                        BNE.S   $000581F0

0581F0  34C3                        MOVE.W  D3,(A2)+
0581F2  302E 8042                   MOVE.W  -$7FBE(A6),D0
0581F6  526E 8042                   ADDQ.W  #1,-$7FBE(A6)
0581FA  0040 0000                   ORI.W   #$0000,D0
0581FE  34C0                        MOVE.W  D0,(A2)+
058200  34FC C243                   MOVE.W  #$C243,(A2)+
058204  34C4                        MOVE.W  D4,(A2)+
058206  34C3                        MOVE.W  D3,(A2)+
058208  302E 8042                   MOVE.W  -$7FBE(A6),D0
05820C  526E 8042                   ADDQ.W  #1,-$7FBE(A6)
058210  0040 0000                   ORI.W   #$0000,D0
058214  34C0                        MOVE.W  D0,(A2)+
058216  34FC CA43                   MOVE.W  #$CA43,(A2)+
05821A  34C6                        MOVE.W  D6,(A2)+
05821C  34C5                        MOVE.W  D5,(A2)+
05821E  302E 8042                   MOVE.W  -$7FBE(A6),D0
058222  526E 8042                   ADDQ.W  #1,-$7FBE(A6)
058226  0040 0000                   ORI.W   #$0000,D0
05822A  34C0                        MOVE.W  D0,(A2)+
05822C  34FC D243                   MOVE.W  #$D243,(A2)+
058230  34C4                        MOVE.W  D4,(A2)+
058232  34C5                        MOVE.W  D5,(A2)+
058234  302E 8042                   MOVE.W  -$7FBE(A6),D0
058238  526E 8042                   ADDQ.W  #1,-$7FBE(A6)
05823C  0040 0000                   ORI.W   #$0000,D0
058240  34C0                        MOVE.W  D0,(A2)+
058242  34FC DA43                   MOVE.W  #$DA43,(A2)+
058246  34C6                        MOVE.W  D6,(A2)+
058248  2D4A 803E                   MOVE.L  A2,-$7FC2(A6)
05824C  4EB8 1D18                   JSR $00001D18.W

Х. знает что, какая-то игровая логика.

Код:

001D18  206E 803E                   MOVEA.L -$7FC2(A6),A0   A6 = FF8000
001D1C  B1FC 00FF 0044              CMPA.L  #$00FF0044,A0
001D22  6706                        BEQ.S   $00001D2A
001D24  4228 FFFB                   CLR.B   -$0005(A0)      A0 = FF0064
001D28  6004                        BRA.S   $00001D2E

001D2E  2C08                        MOVE.L  A0,D6
001D30  283C 00FF 0044              MOVE.L  #$00FF0044,D4
001D36  9C84                        SUB.L   D4,D6
001D38  E24E                        LSR.W   #1,D6
001D3A  2A3C 0000 B800              MOVE.L  #$0000B800,D5
001D40  4EF9 0000 0744              JMP $00000744


000744  266E 8036                   MOVEA.L -$7FCA(A6),A3   A3 = FF0544
000748  363C 9300                   MOVE.W  #$9300,D3       D3 = 9300
00074C  1606                        MOVE.B  D6,D3
00074E  36C3                        MOVE.W  D3,(A3)+
000750  363C 9400                   MOVE.W  #$9400,D3
000754  E04E                        LSR.W   #8,D6
000756  1606                        MOVE.B  D6,D3
000758  36C3                        MOVE.W  D3,(A3)+
00075A  E28C                        LSR.L   #1,D4
00075C  363C 9500                   MOVE.W  #$9500,D3
000760  1604                        MOVE.B  D4,D3
000762  36C3                        MOVE.W  D3,(A3)+
000764  363C 9600                   MOVE.W  #$9600,D3
000768  E084                        ASR.L   #8,D4
00076A  1604                        MOVE.B  D4,D3
00076C  36C3                        MOVE.W  D3,(A3)+
00076E  363C 9700                   MOVE.W  #$9700,D3
000772  E084                        ASR.L   #8,D4
000774  0204 007F                   ANDI.B  #$7F,D4
000778  1604                        MOVE.B  D4,D3
00077A  36C3                        MOVE.W  D3,(A3)+
00077C  3805                        MOVE.W  D5,D4
00077E  0244 3FFF                   ANDI.W  #$3FFF,D4
000782  0644 4000                   ADDI.W  #$4000,D4
000786  36C4                        MOVE.W  D4,(A3)+
000788  3805                        MOVE.W  D5,D4
00078A  E04C                        LSR.W   #8,D4
00078C  EC4C                        LSR.W   #6,D4
00078E  0044 0080                   ORI.W   #$0080,D4
000792  36C4                        MOVE.W  D4,(A3)+
000794  2D4B 8036                   MOVE.L  A3,-$7FCA(A6)
000798  4E75                        RTS

Какая-то работа с памятью, пропускаем.


----------------------------------

Вот эти проверки кажутся очень подозрительными, и похожи на проверку нажатия кнопок. -$7FD2(A6) это на самом деле та самая [$FF002E]!!
Так и есть.

Код:

058250  206E 8036                   MOVEA.L -$7FCA(A6),A0
058254  20BC FFFF FFFF              MOVE.L  #$FFFFFFFF,(A0)

05825A  082E 0002 802E              BTST    #2,-$7FD2(A6)       A6 = FF8000
058260  674E                        BEQ.S   $000582B0

0582B0  422E 902D                   CLR.B   -$6FD3(A6)
0582B4  082E 0003 802E              BTST    #3,-$7FD2(A6)
0582BA  674E                        BEQ.S   $0005830A

05830A  422E 902C                   CLR.B   -$6FD4(A6)
05830E  082E 0000 802E              BTST    #0,-$7FD2(A6)
058314  673A                        BEQ.S   $00058350

058350  422E 902E                   CLR.B   -$6FD2(A6)
058354  082E 0001 802E              BTST    #1,-$7FD2(A6)
05835A  673E                        BEQ.S   $0005839A

05839A  422E 902F                   CLR.B   -$6FD1(A6)
05839E  102E 802E                   MOVE.B  -$7FD2(A6),D0
0583A2  0240 00F0                   ANDI.W  #$00F0,D0
0583A6  6700 0094                   BEQ.W   $0005843C

05843C  6000 FD60                   BRA.W   $0005819E


-------

Код:

05819E  4EB8 1A34                   JSR $00001A34.W

001A34  302E 8000                   MOVE.W  -$8000(A6),D0
001A38  B06E 8000                   CMP.W   -$8000(A6),D0   D0 = 111F, A6 = FF8000
001A3C  67FA                        BEQ.S   $00001A38
001A3E  4E75                        RTS

Тут кажется мы ждем окончания VBlank (программный триггер).

И опять заново !!!!!


Следующий шаг - получение битовой карты кнопок и разбор действий по нажатию. Битовую карту можно получить в трассёре поставив бряк на запись в [$FF002E].

Ставим бряк hook_wr1 1 ff002e ff0030, в hook_log.txt, потом запускаем эмулятор, заходим в меню набора пароля, нажимаем на клаве , (тем самым включив лог) и начинаем ловить нажатия кнопок в hook.txt.

Битовая карта:
Код:

Значение WORD ($FF002E).
U   0x0190      A   0x4090
D   0x0290      B   0x1090
L   0x0490      C   0x2090
R   0x0890      S   0x8090

0 error(s), 0 warning(s)
АнС (SMS)
Маньяк

Тут с: 11.08.2003
Сообщения: 258
СообщениеДобавлено: 23 Ноя 2006 21:09    Заголовок сообщения: Ответить с цитатой

О! сейчас придёт Ghost и скажет, что это дело запросто ломается и без бряков на запись в память. :)
...и молча переводим этот мир.
Organic (SMS)
Фанат

Тут с: 25.08.2001
Сообщения: 172
Я из: Чехов
СообщениеДобавлено: 23 Ноя 2006 22:23    Заголовок сообщения: Ответить с цитатой

Возвращаемся к проверке кнопок:
Код:

05825A  082E 0002 802E              BTST    #2,-$7FD2(A6)   Нажата Left?
058260  674E                        BEQ.S   $000582B0

0582B0  422E 902D                   CLR.B   -$6FD3(A6)      Нажата Right?
0582B4  082E 0003 802E              BTST    #3,-$7FD2(A6)
0582BA  674E                        BEQ.S   $0005830A

05830A  422E 902C                   CLR.B   -$6FD4(A6)      Нажата Up?
05830E  082E 0000 802E              BTST    #0,-$7FD2(A6)
058314  673A                        BEQ.S   $00058350

058350  422E 902E                   CLR.B   -$6FD2(A6)      Нажата Down?
058354  082E 0001 802E              BTST    #1,-$7FD2(A6)
05835A  673E                        BEQ.S   $0005839A

05839A  422E 902F                   CLR.B   -$6FD1(A6)      Нажата кнопка A, B, C или Start?
05839E  102E 802E                   MOVE.B  -$7FD2(A6),D0
0583A2  0240 00F0                   ANDI.W  #$00F0,D0
0583A6  6700 0094                   BEQ.W   $0005843C

... Далее идет обработка нажатия на кнопку.

Нажатия стрелок нас не интресуют, нам нужно узнать куда записывается пароль и что происходит при нажатии на "DONE".

Беглый просмотр....
Код:

0583AA  122E 8032                   MOVE.B  -$7FCE(A6),D1
0583AE  C200                        AND.B   D0,D1
0583B0  B200                        CMP.B   D0,D1
0583B2  6700 0088                   BEQ.W   $0005843C           <- пропускаем нах.

0583B6  302E 86E4                   MOVE.W  -$791C(A6),D0
0583BA  E748                        LSL.W   #3,D0
0583BC  D06E 86E2                   ADD.W   -$791E(A6),D0
0583C0  41FA 01E0                   LEA $000585A2(PC),A0        A0 - Исходный алфавит.
0583C4  1030 0000                   MOVE.B  $00(A0,D0.W),D0     D0 = алфавит[x * 8 + y], выборка символа
0583C8  6700 0076                   BEQ.W   $00058440           CANCEL?
0583CC  0C00 000D                   CMPI.B  #$0D,D0
0583D0  6700 0070                   BEQ.W   $00058442
0583D4  0C00 007F                   CMPI.B  #$7F,D0
0583D8  6732                        BEQ.S   $0005840C
0583DA  0C6E 0009 86E6              CMPI.W  #$0009,-$791A(A6)
0583E0  675A                        BEQ.S   $0005843C
0583E2  41EE 86E8                   LEA -$7918(A6),A0
0583E6  322E 86E6                   MOVE.W  -$791A(A6),D1
0583EA  1180 1000                   MOVE.B  D0,$00(A0,D1.W)
0583EE  5241                        ADDQ.W  #1,D1
0583F0  3D41 86E6                   MOVE.W  D1,-$791A(A6)
0583F4  303C 0069                   MOVE.W  #$0069,D0
0583F8  4EB9 0000 D760              JSR $0000D760
0583FE  41EE 86E8                   LEA -$7918(A6),A0
058402  303C EB80                   MOVE.W  #$EB80,D0
058406  4EBA F926                   JSR $00057D2E(PC)
05840A  6030                        BRA.S   $0005843C

05840C  4A6E 86E6                   TST.W   -$791A(A6)              DEL.
058410  672A                        BEQ.S   $0005843C
058412  41EE 86E8                   LEA -$7918(A6),A0
058416  322E 86E6                   MOVE.W  -$791A(A6),D1
05841A  5341                        SUBQ.W  #1,D1
05841C  11BC 005F 1000              MOVE.B  #$5F,$00(A0,D1.W)
058422  3D41 86E6                   MOVE.W  D1,-$791A(A6)
058426  303C 0069                   MOVE.W  #$0069,D0
05842A  4EB9 0000 D760              JSR $0000D760
058430  41EE 86E8                   LEA -$7918(A6),A0
058434  303C EB80                   MOVE.W  #$EB80,D0
058438  4EBA F8F4                   JSR $00057D2E(PC)


058442  4A6E 86E6                   TST.W   -$791A(A6)              DONE.
058446  6736                        BEQ.S   $0005847E
058448  0C6E 0009 86E6              CMPI.W  #$0009,-$791A(A6)
05844E  6600 0046                   BNE.W   $00058496
058452  41EE 86E8                   LEA -$7918(A6),A0
058456  4EB9 0005 8A74              JSR $00058A74
05845C  0C47 FFFF                   CMPI.W  #$FFFF,D7
058460  6734                        BEQ.S   $00058496
058462  41EE 86E8                   LEA -$7918(A6),A0
058466  43EE 800A                   LEA -$7FF6(A6),A1
05846A  12D8                        MOVE.B  (A0)+,(A1)+
05846C  12D8                        MOVE.B  (A0)+,(A1)+
05846E  12D8                        MOVE.B  (A0)+,(A1)+
058470  12D8                        MOVE.B  (A0)+,(A1)+
058472  12D8                        MOVE.B  (A0)+,(A1)+
058474  12D8                        MOVE.B  (A0)+,(A1)+
058476  12D8                        MOVE.B  (A0)+,(A1)+
058478  12D8                        MOVE.B  (A0)+,(A1)+
05847A  12D8                        MOVE.B  (A0)+,(A1)+
05847C  4E75                        RTS


Код:

05847E  43EE 800A                   LEA -$7FF6(A6),A1
058482  22FC 5F5F 5F5F              MOVE.L  #$5F5F5F5F,(A1)+
058488  22FC 5F5F 5F5F              MOVE.L  #$5F5F5F5F,(A1)+
05848E  12FC 005F                   MOVE.B  #$5F,(A1)+
058492  4219                        CLR.B   (A1)+
058494  4E75                        RTS

Значение пароля которое рисуется на экране хранится в массиве по адресу $FF000A. Данная процедура устанавливает его значение по умолчанию: "_________\0".

Переменная -$791A(A6): Количество введенных букв (max. 9)
Массив -$7FF6(A6): Пароль в ASCII-Z.

-$791C(A6) - координата курсора X. (?)
-$791E(A6) - координата курсора Y. (?)
Адрес текущего символа вычисляется как (X * 8 + Y), так как таблица символов организована как матрица 8x8.

По адресу 585A2 находится исходный алфавит.

Беглым просмотром видно что нажатие на DEL CANCEL и DONE реализовано прикольно. Для определения нажатия на DEL, CANCEL или DONE используются дополнительные символы в конце алфавита:

Так выглядит таблица символов:
Код:

A B C D E F G H
J K L M N O P Q
R S T U V W X Y
Z a b c d e f g
h i j k m n o p
q r s t u v w x
y z 2 3 4 5 6 7
8 9 ? ) ! / - *
DEL CANCEL DONE


А так она хранится в памяти:
Код:

 0x41  0x42  0x43  0x44  0x45  0x46  0x47  0x48
 0x4A  0x4B  0x4C  0x4D  0x4E  0x4F  0x50  0x51
 0x52  0x53  0x54  0x55  0x56  0x57  0x58  0x59
 0x5A  0x61  0x62  0x63  0x64  0x65  0x66  0x67
 0x68  0x69  0x6A  0x6B  0x6D  0x6E  0x6F  0x70
 0x71  0x72  0x73  0x74  0x75  0x76  0x77  0x78
 0x79  0x7A  0x32  0x33  0x34  0x35  0x36  0x37
 0x38  0x39  0x3F  0x29  0x21  0x2F  0x2D  0x2A
 0x7F  0x7F  0x00  0x00  0x00  0x0D  0x0D  0x0D

 ^^          ^^                ^^
 DEL         CANCEL            DONE


Как видно DEL, CANCEL и DONE при движении курсора тоже имеют координаты. Соответсвенно, когда алгоритм проверяет нажатие на кнопку, он вычисляет адрес символа в алфвите как X * 8 + Y, и когда происходит нажатие на DONE, то вместо символа из алфавита берется псевдо-код "0x0D".

Код:

0583CC  0C00 000D                   CMPI.B  #$0D,D0
0583D0  6700 0070                   BEQ.W   $00058442   <---- Если Псевдокод DONE ?
.
.
058442  4A6E 86E6                   TST.W   -$791A(A6)              DONE.
058446  6736                        BEQ.S   $0005847E
058448  0C6E 0009 86E6              CMPI.W  #$0009,-$791A(A6)
05844E  6600 0046                   BNE.W   $00058496
Количество букв должно быть равно 9.
058452  41EE 86E8                   LEA -$7918(A6),A0           A0 = FF06E8
058456  4EB9 0005 8A74              JSR $00058A74
05845C  0C47 FFFF                   CMPI.W  #$FFFF,D7           -1 означает что код неправильный.
058460  6734                        BEQ.S   $00058496
058462  41EE 86E8                   LEA -$7918(A6),A0
058466  43EE 800A                   LEA -$7FF6(A6),A1
05846A  12D8                        MOVE.B  (A0)+,(A1)+
05846C  12D8                        MOVE.B  (A0)+,(A1)+
05846E  12D8                        MOVE.B  (A0)+,(A1)+
058470  12D8                        MOVE.B  (A0)+,(A1)+
058472  12D8                        MOVE.B  (A0)+,(A1)+
058474  12D8                        MOVE.B  (A0)+,(A1)+
058476  12D8                        MOVE.B  (A0)+,(A1)+
058478  12D8                        MOVE.B  (A0)+,(A1)+
05847A  12D8                        MOVE.B  (A0)+,(A1)+
05847C  4E75                        RTS


Ну допустим мы ввели код "AAABBBCCC", теперь проследим поведение программы при нажатии на DONE. Gens не поддерживает нажатие кнопок джойпада в отладчике, поэтому просто обманем переходы, пропустив их кнопкой N.

Код:

058A74  0C10 0048                   CMPI.B  #$48,(A0)
058A78  664E                        BNE.S   $00058AC8
058A7A  0C28 0069 0001              CMPI.B  #$69,$0001(A0)
058A80  6646                        BNE.S   $00058AC8
058A82  0C28 0067 0002              CMPI.B  #$67,$0002(A0)
058A88  663E                        BNE.S   $00058AC8
058A8A  0C28 0068 0003              CMPI.B  #$68,$0003(A0)
058A90  6636                        BNE.S   $00058AC8
058A92  0C28 0072 0004              CMPI.B  #$72,$0004(A0)
058A98  662E                        BNE.S   $00058AC8
058A9A  0C28 0069 0005              CMPI.B  #$69,$0005(A0)
058AA0  6626                        BNE.S   $00058AC8
058AA2  0C28 0073 0006              CMPI.B  #$73,$0006(A0)
058AA8  661E                        BNE.S   $00058AC8
058AAA  0C28 0065 0007              CMPI.B  #$65,$0007(A0)
058AB0  6616                        BNE.S   $00058AC8
058AB2  0C28 0021 0008              CMPI.B  #$21,$0008(A0)
058AB8  660E                        BNE.S   $00058AC8
058ABA  6100 FEBE                   BSR.W   $0005897A
058ABE  1D7C 0010 A8FC              MOVE.B  #$10,-$5704(A6)
058AC4  4247                        CLR.W   D7
058AC6  4E75                        RTS
058AC8  0C10 0042                   CMPI.B  #$42,(A0)
058ACC  664E                        BNE.S   $00058B1C
058ACE  0C28 0061 0001              CMPI.B  #$61,$0001(A0)
058AD4  6646                        BNE.S   $00058B1C
058AD6  0C28 0073 0002              CMPI.B  #$73,$0002(A0)
058ADC  663E                        BNE.S   $00058B1C
058ADE  0C28 0065 0003              CMPI.B  #$65,$0003(A0)
058AE4  6636                        BNE.S   $00058B1C
058AE6  0C28 006D 0004              CMPI.B  #$6D,$0004(A0)
058AEC  662E                        BNE.S   $00058B1C
058AEE  0C28 0065 0005              CMPI.B  #$65,$0005(A0)
058AF4  6626                        BNE.S   $00058B1C
058AF6  0C28 006E 0006              CMPI.B  #$6E,$0006(A0)
058AFC  661E                        BNE.S   $00058B1C
058AFE  0C28 0074 0007              CMPI.B  #$74,$0007(A0)
058B04  6616                        BNE.S   $00058B1C
058B06  0C28 0021 0008              CMPI.B  #$21,$0008(A0)
058B0C  660E                        BNE.S   $00058B1C
058B0E  6100 FE6A                   BSR.W   $0005897A
058B12  1D7C 0020 A8FC              MOVE.B  #$20,-$5704(A6)
058B18  4247                        CLR.W   D7
058B1A  4E75                        RTS
058B1C  0C10 0042                   CMPI.B  #$42,(A0)
058B20  6600 0088                   BNE.W   $00058BAA
058B24  0C28 006F 0001              CMPI.B  #$6F,$0001(A0)
058B2A  6600 007E                   BNE.W   $00058BAA
058B2E  0C28 0078 0002              CMPI.B  #$78,$0002(A0)
058B34  6600 0074                   BNE.W   $00058BAA
058B38  0C28 0069 0003              CMPI.B  #$69,$0003(A0)
058B3E  666A                        BNE.S   $00058BAA
058B40  0C28 006E 0004              CMPI.B  #$6E,$0004(A0)
058B46  6662                        BNE.S   $00058BAA
058B48  0C28 0067 0005              CMPI.B  #$67,$0005(A0)
058B4E  665A                        BNE.S   $00058BAA
058B50  0C28 0021 0006              CMPI.B  #$21,$0006(A0)
058B56  6652                        BNE.S   $00058BAA
058B58  0C28 0021 0007              CMPI.B  #$21,$0007(A0)
058B5E  664A                        BNE.S   $00058BAA
058B60  0C28 0021 0008              CMPI.B  #$21,$0008(A0)
058B66  6642                        BNE.S   $00058BAA
058B68  422E A8F1                   CLR.B   -$570F(A6)
058B6C  422E A8F2                   CLR.B   -$570E(A6)
058B70  422E A8F3                   CLR.B   -$570D(A6)
058B74  422E A8F4                   CLR.B   -$570C(A6)
058B78  422E A8F5                   CLR.B   -$570B(A6)
058B7C  1D7C 0001 A8EC              MOVE.B  #$01,-$5714(A6)
058B82  1D7C 0001 A8ED              MOVE.B  #$01,-$5713(A6)
058B88  1D7C 0001 A8EE              MOVE.B  #$01,-$5712(A6)
058B8E  1D7C 0001 A8EF              MOVE.B  #$01,-$5711(A6)
058B94  1D7C 0001 A8F0              MOVE.B  #$01,-$5710(A6)
058B9A  1D7C 0063 A8FB              MOVE.B  #$63,-$5705(A6)
058BA0  1D7C 001F A8FC              MOVE.B  #$1F,-$5704(A6)
058BA6  4247                        CLR.W   D7
058BA8  4E75                        RTS


Тааак. Это секретные пароли, прописанные жесткой проверкой!
Highrise!
Basement!
Boxing!!! (У разработчиков всё в порядке с чувством юмора :))

0 error(s), 0 warning(s)
rumata (SMS)
Нереал

Тут с: 12.08.2004
Сообщения: 424
Я из: С-Петербург
СообщениеДобавлено: 23 Ноя 2006 23:43    Заголовок сообщения: Ответить с цитатой

Здорово.
Что интересно, не только полный комплект оружия, но и сканер и бронежилет имеют 990% (в нормальном режиме 100%)
А почему на первую часть такого пароля нет?
Интересно, а как оно будет на дух игроков, особенно Boxing! ?. Придется завтра срочно паять линк кабель
PS
Огромный респект не только за работу, но и за изложение

Дао, выраженное словами, не есть истинное Дао
Valet2 (SMS)
Монстр

Тут с: 06.01.2002
Сообщения: 1290
Я из: I'm from Peter, from cool wild Peter!!!
СообщениеДобавлено: 24 Ноя 2006 00:51    Заголовок сообщения: Ответить с цитатой

Кстати, эти три пароля в свое время GManiac, что ли, открыл.
--- Old Habits Never Die ---
Organic (SMS)
Фанат

Тут с: 25.08.2001
Сообщения: 172
Я из: Чехов
СообщениеДобавлено: 24 Ноя 2006 03:18    Заголовок сообщения: Ответить с цитатой

Из предыдущего эксперимента мы узнали о секретных паролях. В программном коде для таких паролей специально для хакеров жестко записали ключевые переменные (смещение условное):

+04: Номер уровня.
+05: Энергия (E).
+06: Патроны 1
+07: Патроны 2
+08: Патроны 3
+09: Патроны 4
+0A: Патроны 5
+0B: Аммуниция 1
+0C: Аммуниция 2
+0D: Аммуниция 3
+0E: Аммуниция 4
+0F: Аммуниция 5
+10: 1: Ishii жива-здорова, 0: Decased
+11: 1: Haile жив-здоров, 0: Decased
+12: 1: Wolf жив-здоров, 0: Decased
+13: 1: Ramos жив-здоров, 0: Decased
+14: 1: Gjoerup жив-здоров, 0: Decased

Назовем эту структуру PassDecode. Изменяя значения PassDecode в роме можно узнать все типы аммуниции и номера уровней.

Типы аммуниции.
Код:

0 Нет аммуниции в слоте    8  Пистолет
1 Био-сканер               9  Прибор ночного видения
2 Мины                     10 Лазерный пистолет
3 Бронежилет               11 Ракетница
4 Огнетушитель             12 Шотган
5 Огнеупорный костюм       13 Огнемет
6 Фонарик                  14 Лазерная винтовка
7 Гранаты

(Мои догадки о нумерации оружия подтвердились)

Как оказалось экипировка не ограничивается 100%, и может принимать максимальное значение 990%

Уровни:
Код:

0  Docking Bay Level 1   16 High Rise Roof Top    32 Sub Basement Level 1
1  Docking Bay Level 2   17 High Rise Floor 164   33 Sub Basement Level 2
2  Bridge Level 1        18 High Rise Floor 163   34 Sub Basement Level 3
3  Engineering Level 1   19 High Rise Floor 162   35 Sub Basement Level 4
4  Engineering Level 2   20 High Rise Floor 161   36 Sub Basement Level 5
5  Engineering Level 3   21 High Rise Floor 160   37 Sub Basement Level 6
6  Engineering Level 4   22 High Rise Floor 159   38 Sub Basement Level 7
7  Greenhouse Level 1    23 High Rise Floor 158   39 Sub Basement Level 8
8  Greenhouse Level 2    24 High Rise Floor 157   40 Sub Basement Level 9
9  Greenhouse Level 3    25 High Rise Floor 156   41 Sub Basement Level 10
10 Bridge Level 2        26 High Rise Floor 155   42 Sub Basement Level 11
11 Reactor Level 1       27 High Rise Floor 154   43 Sub Basement Level 12
12 Reactor Level 2       28 High Rise Floor 153   44 ... Пустые уровни
13 Лабиринт              29 High Rise Floor 152
14 Dockbridge Room 2     30 High Rise Floor 151
15 Одиночная камера      31 Бокс!


Ну вот и подошли к самому главному - к проверке и декодированию пароля. Этим занимается функция по адресу $00058A74. На входе у неё адрес ASCII-Z строки с паролем для проверки. Функция возвращает 0, если код верный и -1, если код неправильный (INCORRECT).

0 error(s), 0 warning(s)
Pinball Wizzard (SMS)
Монстр

Тут с: 30.04.2003
Сообщения: 1414
Я из: Moscow, Russia
СообщениеДобавлено: 24 Ноя 2006 06:02    Заголовок сообщения: Ответить с цитатой

13 Лабиринт
14 Dockbridge Room 2
15 Одиночная камера

- А это что за уровни? Они встречаются при обычном прохождении?

Don`t panic!!!
Status:..До чего же назойливыми бывают Wizzard`ы!!!
Chemist (SMS)
Фанат

Тут с: 02.10.2002
Сообщения: 122
Я из: Москва
СообщениеДобавлено: 25 Ноя 2006 13:08    Заголовок сообщения: Ответить с цитатой

Мощная работа, Organic! Отдельное спасибо за подробное изложение.

Organic писал:
Начинаем трассировку в Gense, вывалившись в его отладчик.. Там он крутится на каком-то цикле. Все такие циклы мы пропускаем кнопкой N.

001A38 B06E 8000 CMP.W -$8000(A6),D0 D0 = 111F, A6 = FF8000
001A3C 67FA BEQ $FA


Эти циклы обычно делают для выдержки таймингов при выполнении второстепенных, с точки зрения игровой логики, процедур (прорисовка спрайтов и т.п.). При взломе их, как и было сказано, следует пропускать. Лучше даже делать вспомогательные Game Genie-коды (в данном случае - 001A3C:4E71), чтобы снова не нажимать N, если игре вдруг "вздумается" опять войти в такой цикл.

Valet2 писал:
Кстати, эти три пароля в свое время GManiac, что ли, открыл.


Nick'O'Dimm, насколько я помню. Однако GManiac нашел кучу других секретов для разных игр, и мне трудно поверить, что это был не он. :)

С уважением, Chemist.
Organic (SMS)
Фанат

Тут с: 25.08.2001
Сообщения: 172
Я из: Чехов
СообщениеДобавлено: 27 Ноя 2006 04:13    Заголовок сообщения: Ответить с цитатой

Я больше не буду нагружать тут дизасмом, а лучше разберу процесс декодирования на примере. В качестве примера я выбрал пароль AAABBBCCC (он заведомо неправильный).

Шаг 1.

Вначале "AAABBBCCC" переводится в двоичный символьный формат, так как изначально пароль записан символами ASCII. Для перевода используется следующая таблица:

Код:

    0 1 2 3 4 5 6 7
   ________________
0 | x B ? D E j G H
1 | ) J K L M N O P
2 | R S T U V Q W X
3 | Y Z a b e f c d
4 | h i g F k ! m n
5 | o p q r s t u v
6 | w y A z 2 7 4 5
7 | 3 9 6 8 C / - *


Следовательно "AAABBBCCC" запишется в виде 062 062 062 001 001 001 074 074 074. Битовая последовательность соответственно выглядит так:

Код:

00110010|00110010|00110010|00000001|00000001|00000001|00111100|00111100|00111100
   "A"      "A"      "A"      "B"      "B"      "B"      "C"      "C"      "C"


Шаг 2.

Далее эта битовая последовательность пакуется странным методом (такого я ещё не видел). Вместо того, чтобы "вырезать" лишние 2 нуля из каждого байта и потом всё вместе склеить, алгоритм поступает следующим образом:

Код:

10.110010|0010.1100|000001.11|01.000001|1100.0000|111100.11|--111100|
<-------- <-------- <-------- <-------- <-------- <-------- <--------
AA AAAAAA AAAA AAAA BBBBBB AA BB BBBBBB CCCC BBBB CCCCCC CC   CCCCCC


Сверху я написал во что превращается последовательность, а снизу дописал откуда взялись и как получились эти биты. Вообщем запаковка происходит шиворот-навыворот и задом-наперед. Где здесь прячется номер уровня или энергия пока абсолютно непонятно.

Шаг 3.

XOR-им полученную битовую последовательность ключем 0x69AD286B95D98B (причем ключ генерируется программно). Операция исключающее-или является элементарным способом шифрования. Не зная ключ, узнать оригинальную последовательность хрен получится.

Код:

  10110010|00101100|00000111|01000001|11000000|11110011|--111100|
^
  01001001|10101101|00101000|01101011|10010100|11011001|--001001|
-------------------------------------------------------------------
  11011011|10000001|00101111|00101010|01000100|00101010|--110111|


Шаг 4.

Перегруппировка (reordering) битовой последовальности, чтобы запутать код. Производится по заранее определенной таблице:

Код:

46 40 22  5 18 14
47 38 19 29  6 15
48 41 39 30  7 16
49 42 37 23  8 17
34 20 24 31  9  0
50 43 25 32 10  1
51 35 26 33 11  2
52 44 21 27 12  3
53 45 36 28 13  4


Причем нумерация бит выглядит следующим образом:

Код:

  11011011|10000001|00101111|00101010|01000100|00101010|--110111|
  7......0|15.....8|23....16|31....16|39....32|49....40|  53..48|


После перегруппировки последовательность принимает такой вид:

Код:

  10010000|00111111|11000111|11100001|00001011|10110100|--100111|
  7......0|15.....8|23....16|31....16|39....32|49....40|  53..48|


Шаг 5.

Подсчет контрольной суммы. Я обозначил значащие биты последовательности как A-F, а контрольную сумму как Z.

Код:

  10010000|00111111|11000111|11100001|00001011|10110100|--100111|
  AAAAAAAA|BBBBBBBB|CCCCCCCC|DDDDDDDD|EEEEEEEE|ZZFFFFFF|  ZZZZZZ|


A = 144
B = 63
C = 199
D = 225
E = 11
F = 52

Z = 158

Так вот если контрольная сумма Z = (A + B + C + D + E + F) & 0xFF не совпадает, то пароль считается неверным. Естественно для нашего примера: 0x9E не равно 0x2B6. Придется тогда взять правильный пароль. :)

добавлено спустя 2 часа 54 минуты:

Проверка на рабочем пароле.

MdU*58?mQ

40 уровень, 93 энергии, 90% огнемет, 55 лазерная винтовка, 80 гранат, 6 лазерный пистолет, 68 шотган. Все спецназовцы в строю.

Шаг 1. MdU*58?mQ -> 014 037 023 077 067 073 002 046 025
Шаг 2. 0xCC37FDF72E9815
Шаг 3. 0xCC37FDF72E9815 ^ 0x69AD286B95D98B = 0xA59AD59CBB419E
Шаг 4. Reorder -> 0x1F48377AF2670C
Шаг 5. A + B + C + D + E + F = 0x231, Z = 0x31. 0x231 & 0xFF = 0x31. OK

Получилась последовательность:

Код:

|00011111|01001000|00110111|01111010|11110010|01100111|00001100|
|7......0|15.....8|23....16|31....16|39....32|49....40|  53..48|


Далее анализируя код я выяснил, что:

Бит 0: 1: Ishii жива-здорова, 0: Decased
Бит 1: 1: Haile жив-здоров, 0: Decased
Бит 2: 1: Wolf жив-здоров, 0: Decased
Бит 3: 1: Ramos жив-здоров, 0: Decased
Бит 4: 1: Gjoerup жив-здоров, 0: Decased

Биты 5-18 (W1-W14): Содержат маску, каждый бит которой указывает пристутсвует-ли данное оружие в инвентаре или нет. Например установленный бит W1 означает что в инвентаре есть Био-сканер. В данном случае эти биты равны: 111.01001000.000, т.е. в инвентаре есть следующая экипировка:
W7: Гранаты
W10: Лазерный пистолет
W12: Шотган
W13: Огнемет
W14: Лазерная винтовка
Примечание: должно быть установлено не более 5 битов (типов оружия), иначе пароль будет считаться неправильным. Кстати такой способ задания автоматически сортирует инвентарь по номеру оружия :)

Биты 19-21: Ammo0
Биты 22-24: Ammo1
Биты 25-27: Ammo2
Биты 28-30: Ammo3
Биты 31-33: Ammo4
Итоговое количество патрон считается по следующим формулам:
Для стрелкового оружия: ((Ammo * 2 + 1) * 99) >> 4.
Для экипировки: ((Ammo * 2 + 1) * 10) >> 4.
В нашем случае:
Ammo0 = 110, ((6 * 2 + 1) * 99) >> 4 = 80 гранат
Ammo1 = 000, ((0 * 2 + 1) * 99) >> 4 = 6 лазерный пистолет
Ammo2 = 101, ((5 * 2 + 1) * 99) >> 4 = 68 шотган
Ammo3 = 111, ((7 * 2 + 1) * 10) >> 4 = 90% огнемет
Ammo4 = 100, ((4 * 2 + 1) * 99) >> 4 = 55 лазерная винтовка
Как видно честным путем получить для экипировки больше чем 100% боезапаса нельзя :( Это позволяют сделать только секретные пароли..

Биты 34-39: Energy0
Итоговое значение энергии считается по следующей формуле:
E = ((Energy0 * 2 + 1) * 100) >> 7.
В данном случае: E = ((60 * 2 + 1) * 100) >> 7 = 94.

Биты 40-45: Номер уровня - 1, в данном случае Level = 39 + 1 = 40.
Попасть на 0-й уровень (Docking Bay Level 1) через пароль тоже нельзя :(
Кроме того пароль не пускает на следующие уровни: 13, 13, 15, 31 (бокс) и на 44-63.

Ну вот и всё, осталось написать программку, которая создает и декодирует пароли!

0 error(s), 0 warning(s)
Organic (SMS)
Фанат

Тут с: 25.08.2001
Сообщения: 172
Я из: Чехов
СообщениеДобавлено: 27 Ноя 2006 08:57    Заголовок сообщения: Ответить с цитатой

Предварительная версия.

Разбор пароля происходит нормально, но вот генератор паролей пока хромает на 1 стадии (неправильно сортируется аммуниция).


zeropass.rar
 Описание:

Скачать
 Имя файла:  zeropass.rar
 Размер файла:  5.45 KB
 Скачано:  6 раз(а)


0 error(s), 0 warning(s)
Organic (SMS)
Фанат

Тут с: 25.08.2001
Сообщения: 172
Я из: Чехов
СообщениеДобавлено: 28 Ноя 2006 03:20    Заголовок сообщения: Ответить с цитатой

Финальная GUI-версия. Можно создавать и проверять пароли.

Mission Completed :)


Zeropass001.zip
 Описание:

Скачать
 Имя файла:  Zeropass001.zip
 Размер файла:  29.28 KB
 Скачано:  24 раз(а)


0 error(s), 0 warning(s)
Pinball Wizzard (SMS)
Монстр

Тут с: 30.04.2003
Сообщения: 1414
Я из: Moscow, Russia
СообщениеДобавлено: 28 Ноя 2006 03:52    Заголовок сообщения: Ответить с цитатой

Работает, спасибо за программу!

Ачто, все-таки, с этими уровнями - на них программа выдает INCORRECT:

13 Лабиринт
14 Dockbridge Room 2
15 Одиночная камера
31 Бокс!

Бокс - понятно, для него есть отдельный пароль, а остальные три?

Don`t panic!!!
Status:..До чего же назойливыми бывают Wizzard`ы!!!
rumata (SMS)
Нереал

Тут с: 12.08.2004
Сообщения: 424
Я из: С-Петербург
СообщениеДобавлено: 28 Ноя 2006 21:22    Заголовок сообщения: Ответить с цитатой

Программа выдает INCORRECT, который потом заменяется неким паролем. Но игра его не принимает
Дао, выраженное словами, не есть истинное Дао
Valet2 (SMS)
Монстр

Тут с: 06.01.2002
Сообщения: 1290
Я из: I'm from Peter, from cool wild Peter!!!
СообщениеДобавлено: 29 Ноя 2006 02:28    Заголовок сообщения: Ответить с цитатой

Так какой там пароль на пустой уровень?
--- Old Habits Never Die ---
Organic (SMS)
Фанат

Тут с: 25.08.2001
Сообщения: 172
Я из: Чехов
СообщениеДобавлено: 29 Ноя 2006 14:58    Заголовок сообщения: Ответить с цитатой

На остальные три уровня по идее попасть нельзя, т.е. игра тоже выдает INCORRECT.
На эти уровни можно попасть только хакнув ром.

0 error(s), 0 warning(s)
rumata (SMS)
Нереал

Тут с: 12.08.2004
Сообщения: 424
Я из: С-Петербург
СообщениеДобавлено: 29 Ноя 2006 15:44    Заголовок сообщения: Ответить с цитатой

Organic, ты заинтриговал общественность до невозомжности :)
13 Лабиринт
14 Dockbridge Room 2
15 Одиночная камера
То есть ты их видел, раз есть названия?

Дао, выраженное словами, не есть истинное Дао
Valet2 (SMS)
Монстр

Тут с: 06.01.2002
Сообщения: 1290
Я из: I'm from Peter, from cool wild Peter!!!
СообщениеДобавлено: 29 Ноя 2006 21:01    Заголовок сообщения: Ответить с цитатой

Карты уровней хранятся в роме в несжатом виде. Их можно даже увидеть и перерисовать в графическом режиме. Можно переделать игру, создать подобие своего мода.

Спрайты объектов тоже несжаты.

--- Old Habits Never Die ---
HardWareMan (SMS)
Монстр

Тут с: 12.06.2004
Сообщения: 1619
Я из: г. Павлодар
СообщениеДобавлено: 29 Ноя 2006 21:22    Заголовок сообщения: Ответить с цитатой

Organic писал:
Битовую карту можно получить в трассёре поставив бряк на запись в [$FF002E].

Таакс, как ты это делаешь?

...I tried so hard and got so far, but in the end it doesn't even matter...
GManiac (SMS)
Cheater

Тут с: 06.08.2003
Сообщения: 694
Я из: ниоткуда
СообщениеДобавлено: 30 Ноя 2006 01:48    Заголовок сообщения: Ответить с цитатой

В файле hook_log.txt описано, как делается лог в файл hook.txt по факту чего-либо, но никак не бряк. Вообще, довольно неудобно всё это.

Насчёт уровней: по адресу 58F18 есть таблица существования уровней, если байт 00, уровня нет, и игра выдаёт INCORRECT PASSWORD, иначе пароль верный. Исправив эту таблицу, можно попасть на левые уровни, однако они имеют карты каких-то других (например, 14-й имеет карту 2-го или 3-го, не помню, 15-й - тоже какого-то из начальных, но из-за кривых координат наш герой оказывается на стенке, из-за чего мы находимся в "камере-одиночке"). Для уровней 13-15 снизу от большой карты на паузе написано "REACTOR 2" (поищите эту строку в роме - первое вхождение приводит к таблице надписей под картой, там эта строка повторяется ещё 3 раза), а наверху ничего нет (найдите с этой строкой вторую таблицу (без слов ENTERING), там после неё 3 пустых строки)
Отмечу, что всего пароль проверяется аж 3 раза (в т.ч. секретные):
1) в меню пароля, когда игра должна сказать, он верный или нет
2) после выбора меню Start перед появлением некоего рисунка. В этот момент, насколько я понял, загружается карта уровня
3) после картинки, перед выбором коммандоса. В это время загружается внешний вид уровня.
Что за уровни с номерами >44 понять не смог, наверно, опять повторы других, но на паузе отображается глюк.

Мысль - это интеллектуальный эксцесс данного индивидуума.
Valet2 (SMS)
Монстр

Тут с: 06.01.2002
Сообщения: 1290
Я из: I'm from Peter, from cool wild Peter!!!
СообщениеДобавлено: 30 Ноя 2006 12:46    Заголовок сообщения: Ответить с цитатой

Повторы карт 1 и 2 уровней, только они немного не так выглядят.

strange maps.png
 Описание:

Скачать
 Имя файла:  strange maps.png
 Размер файла:  4.86 KB
 Скачано:  19 раз(а)

HardWareMan (SMS)
Монстр

Тут с: 12.06.2004
Сообщения: 1619
Я из: г. Павлодар
СообщениеДобавлено: 30 Ноя 2006 14:17    Заголовок сообщения: Ответить с цитатой

Просто смещены
...I tried so hard and got so far, but in the end it doesn't even matter...
Valet2 (SMS)
Монстр

Тут с: 06.01.2002
Сообщения: 1290
Я из: I'm from Peter, from cool wild Peter!!!
СообщениеДобавлено: 30 Ноя 2006 16:57    Заголовок сообщения: Ответить с цитатой

Первая и вторая карта есть и чуть выше - до реакторных уровней. А потом они повторяются.
--- Old Habits Never Die ---
Organic (SMS)
Фанат

Тут с: 25.08.2001
Сообщения: 172
Я из: Чехов
СообщениеДобавлено: 30 Ноя 2006 18:47    Заголовок сообщения: Ответить с цитатой

> Organic, ты заинтриговал общественность до невозомжности :)
> 13 Лабиринт
> 14 Dockbridge Room 2
> 15 Одиночная камера
> То есть ты их видел, раз есть названия?

>> На эти уровни можно попасть только хакнув ром.
Конечно я видел эти уровни, но через пароль или обычным прохождением на них попасть нельзя. Эти уровни были добавлены разработчиками для отладки графического рендерера. Извиняюсь за повторения, но что-то не доходит..

0 error(s), 0 warning(s)
Chemist (SMS)
Фанат

Тут с: 02.10.2002
Сообщения: 122
Я из: Москва
СообщениеДобавлено: 01 Dec 2006 14:02    Заголовок сообщения: Ответить с цитатой

Отлично, Organic.

Радует описание алгоритмов без приведения ассемблерных кодов. Еще больше радует наличие готовой программы генерации паролей.

С уважением, Chemist.
Pinball Wizzard (SMS)
Монстр

Тут с: 30.04.2003
Сообщения: 1414
Я из: Moscow, Russia
СообщениеДобавлено: 01 Dec 2006 14:35    Заголовок сообщения: Ответить с цитатой

Organic писал:
>> На эти уровни можно попасть только хакнув ром.
Конечно я видел эти уровни

Из чего можно сделать вывод, что у тебя есть хакнутый ром.

Don`t panic!!!
Status:..До чего же назойливыми бывают Wizzard`ы!!!
Wirt (SMS)
Нереал

Тут с: 24.07.2003
Сообщения: 444
СообщениеДобавлено: 03 Dec 2006 22:18    Заголовок сообщения: Ответить с цитатой

...который неплохо бы поиметь и нам :)
MB MSI K9N Ultra @ Chipset nForce 570 Ultra -- Proc AMD64 X2 3600+ (Windsor) @ Socket AM2 -- Mem 1 Gb DDR2 Hyundai PC2-5300 -- Video GeForce 7300GT
GManiac (SMS)
Cheater

Тут с: 06.08.2003
Сообщения: 694
Я из: ниоткуда
СообщениеДобавлено: 04 Dec 2006 10:52    Заголовок сообщения: Ответить с цитатой

Про таблицу существования уровней я уже написал.
Мысль - это интеллектуальный эксцесс данного индивидуума.
Быстрый ответ



Цитировать последнее сообщение

Показать сообщения:   
Открыть новую тему   Ответить на тему    эмуФорум :: emuForum - оглавление -> Коды и прохождения Часовой пояс: GMT +3:00
 

  :: Romov.Net :: EMU-Russia ::
:: Chat :: Wiki :: Journal :: every game :: PSXDB ::  
Хостинг от uCoz