Взлом генератора паролей ZT (ромов.нет)
| |
Nemesis_c | Дата: Среда, 03.08.2011, 04:00 | Сообщение # 1 |
 Сообщений: 1148 Статус: Offline
| Organic (23 Ноя 2006 01:04):[/b]
Пароль может состоять из 64 символов:
Code 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 (таблица не закончена):
Code 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):
Code 1 <= 6 <= 12 50 <= 55 <= 61 13 <= 18 <= 24 62 <= 68 <= 74 25 <= 30 <= 37 75 <= 80 <= 86 38 <= 43 <= 49 87 <= 92 <= 99
Округление экипировки (таблица не закончена):
Code 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 и всеми бойцами (меняется только этап):
Code #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 - второй уровень с лазерной винтовкой!
|
|
| |
Nemesis_c | Дата: Среда, 03.08.2011, 04:10 | Сообщение # 2 |
 Сообщений: 1148 Статус: Offline
| Organic (23 Ноя 2006 20:31):
Для уровней зарезервировано 64 номера (6 бит), а в игре только 40 уровней.
Путем ром-хакинга удалось установить, что реальная таблица символов, на самом деле выглядит так:
Code 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.
Есть прогресс. Теперь осталось выяснить как изменяются биты при изменении, например, количества живых коммандос, или после изменения номера этапа. Простым подбором получить алгоритм не удалось, значит придется хакать ром с помощью отладчика Gens и его модификации Gens Tracer 2.14. Начинаем трассировку в Gense, вывалившись в его отладчик.. Там он крутится на каком-то цикле. Все такие циклы мы пропускаем кнопкой N
Code 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
Code 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. Видимо что-то связанное со звуком.
Code 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, видимо отрисовка изображения.
Code 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.
Code 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
|
|
| |
Nemesis_c | Дата: Среда, 03.08.2011, 04:12 | Сообщение # 3 |
 Сообщений: 1148 Статус: Offline
| Organic (23 Ноя 2006 20:31):
В этой процедуре происходит обработка кнопок.
Code 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
Х. знает что, какая-то игровая логика.
Code 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
Какая-то работа с памятью, пропускаем.
----------------------------------
|
|
| |
Nemesis_c | Дата: Среда, 03.08.2011, 04:13 | Сообщение # 4 |
 Сообщений: 1148 Статус: Offline
| Organic (23 Ноя 2006 20:31):
Вот эти проверки кажутся очень подозрительными, и похожи на проверку нажатия кнопок. -$7FD2(A6) это на самом деле та самая [$FF002E]!! Так и есть.
Code 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
---------------------------
Code 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.
Битовая карта:
Code Значение WORD ($FF002E). U 0x0190 A 0x4090 D 0x0290 B 0x1090 L 0x0490 C 0x2090 R 0x0890 S 0x8090
|
|
| |
Nemesis_c | Дата: Среда, 03.08.2011, 04:17 | Сообщение # 5 |
 Сообщений: 1148 Статус: Offline
| Organic (23 Ноя 2006 20:31):
Возвращаемся к проверке кнопок:
Code 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".
Беглый просмотр....
Code 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
Code 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 используются дополнительные символы в конце алфавита:
Так выглядит таблица символов:
Code 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
А так она хранится в памяти:
Code 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".
Code 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
|
|
| |
Nemesis_c | Дата: Среда, 03.08.2011, 04:18 | Сообщение # 6 |
 Сообщений: 1148 Статус: Offline
| Organic (23 Ноя 2006 20:31):
Ну допустим мы ввели код "AAABBBCCC", теперь проследим поведение программы при нажатии на DONE. Gens не поддерживает нажатие кнопок джойпада в отладчике, поэтому просто обманем переходы, пропустив их кнопкой N.
Code 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!!! (У разработчиков всё в порядке с чувством юмора :))
|
|
| |
Nemesis_c | Дата: Среда, 03.08.2011, 04:22 | Сообщение # 7 |
 Сообщений: 1148 Статус: Offline
| Organic (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 в роме можно узнать все типы аммуниции и номера уровней.
Типы аммуниции:
Code 0 Нет аммуниции в слоте 1 Био-сканер 2 Мины 3 Бронежилет 4 Огнетушитель 5 Огнеупорный костюм 6 Фонарик 7 Гранаты 8 Пистолет 9 Прибор ночного видения 10 Лазерный пистолет 11 Ракетница 12 Шотган 13 Огнемет 14 Лазерная винтовка
(Мои догадки о нумерации оружия подтвердились)
Как оказалось экипировка не ограничивается 100%, и может принимать максимальное значение 990%
Уровни:
Code 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).
|
|
| |
Nemesis_c | Дата: Среда, 03.08.2011, 04:27 | Сообщение # 8 |
 Сообщений: 1148 Статус: Offline
| Organic (27 Ноя 2006 04:13):
Я больше не буду нагружать тут дизасмом, а лучше разберу процесс декодирования на примере. В качестве примера я выбрал пароль AAABBBCCC (он заведомо неправильный).
Шаг 1.
Вначале "AAABBBCCC" переводится в двоичный символьный формат, так как изначально пароль записан символами ASCII. Для перевода используется следующая таблица:
Code 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. Битовая последовательность соответственно выглядит так:
Code 00110010|00110010|00110010|00000001|00000001|00000001|00111100|00111100|00111100 "A" "A" "A" "B" "B" "B" "C" "C" "C"
Шаг 2.
Далее эта битовая последовательность пакуется странным методом (такого я ещё не видел). Вместо того, чтобы "вырезать" лишние 2 нуля из каждого байта и потом всё вместе склеить, алгоритм поступает следующим образом:
Code 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 (причем ключ генерируется программно). Операция исключающее-или является элементарным способом шифрования. Не зная ключ, узнать оригинальную последовательность хрен получится.
Code 10110010|00101100|00000111|01000001|11000000|11110011|--111100| ^ 01001001|10101101|00101000|01101011|10010100|11011001|--001001| ------------------------------------------------------------------- 11011011|10000001|00101111|00101010|01000100|00101010|--110111|
Шаг 4.
Перегруппировка (reordering) битовой последовальности, чтобы запутать код. Производится по заранее определенной таблице:
Code 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
Причем нумерация бит выглядит следующим образом:
Code 11011011|10000001|00101111|00101010|01000100|00101010|--110111| 7......0|15.....8|23....16|31....16|39....32|49....40| 53..48|
После перегруппировки последовательность принимает такой вид:
Code 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.
Code 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
Получилась последовательность:
Code |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.
Ну вот и всё, осталось написать программку, которая создает и декодирует пароли!
|
|
| |
Nemesis_c | Дата: Среда, 03.08.2011, 04:37 | Сообщение # 9 |
 Сообщений: 1148 Статус: Offline
| Organic (27 Ноя 2006 08:57):
Предварительная версия.
Разбор пароля происходит нормально, но вот генератор паролей пока хромает на 1 стадии (неправильно сортируется аммуниция).
|
|
| |
Nemesis_c | Дата: Среда, 03.08.2011, 04:39 | Сообщение # 10 |
 Сообщений: 1148 Статус: Offline
| GManiac (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 понять не смог, наверно, опять повторы других, но на паузе отображается глюк.
|
|
| |
|