Среда, 26.04.2017, 22:41
Вы вошли как Гость | Группа "Гости" | RSS

.
 
 
Главная Регистрация Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: Nemesis_c, Smoke 
Форум » Elektropage.ru » Zero Tolerance [smd] » Взлом генератора паролей ZT (ромов.нет)
Взлом генератора паролей ZT (ромов.нет)
Nemesis_cДата: Среда, 03.08.2011, 04:00 | Сообщение # 1


 
Сообщений: 1118
Статус: 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


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

И напоследок пара хак-паролей, которые невозможно получить, честно играя в игру smile
!QLKrQZ6p - пароль с нулевой жизненной энергией
DFg***Kvx - второй уровень с лазерной винтовкой!
 
Nemesis_cДата: Среда, 03.08.2011, 04:10 | Сообщение # 2


 
Сообщений: 1118
Статус: 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


 
Сообщений: 1118
Статус: 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


 
Сообщений: 1118
Статус: 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


 
Сообщений: 1118
Статус: 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


 
Сообщений: 1118
Статус: 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


 
Сообщений: 1118
Статус: 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


 
Сообщений: 1118
Статус: 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. Придется тогда взять правильный пароль. smile

добавлено спустя 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 битов (типов оружия), иначе пароль будет считаться неправильным. Кстати такой способ задания автоматически сортирует инвентарь по номеру оружия smile

Биты 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% боезапаса нельзя sad Это позволяют сделать только секретные пароли..

Биты 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) через пароль тоже нельзя sad
Кроме того пароль не пускает на следующие уровни: 13, 13, 15, 31 (бокс) и на 44-63.

Ну вот и всё, осталось написать программку, которая создает и декодирует пароли!
 
Nemesis_cДата: Среда, 03.08.2011, 04:37 | Сообщение # 9


 
Сообщений: 1118
Статус: Offline
 

Organic (27 Ноя 2006 08:57):

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

Разбор пароля происходит нормально, но вот генератор паролей пока хромает на 1 стадии (неправильно сортируется аммуниция).
Прикрепления: Zeropass.zip(39Kb)
 
Nemesis_cДата: Среда, 03.08.2011, 04:39 | Сообщение # 10


 
Сообщений: 1118
Статус: 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 понять не смог, наверно, опять повторы других, но на паузе отображается глюк.
 
Форум » Elektropage.ru » Zero Tolerance [smd] » Взлом генератора паролей ZT (ромов.нет)
Страница 1 из 11
Поиск:


Select language:
English
French
German
Portuguese
Chinese
Nemesis_c, r57shell, Smoke, Lipetsk, GoodBye (aka vfiuchcikicshuusrch) & Segaman © 2017
Хостинг от uCoz