Commandos 2: Men of Courage
Автор      : Cauchy^HTB
Перевод    : NightCat^T53
Интстументы: SoftIce, Hex-editor
Защита     : CD-Check

Сегодня займёмся разбором защиты типа CD-Check в игре Commandos2: MoC.
Эх, просто  злость  берёт, когда думаю о программистах, которые писали
защиту к игре. А  потом еще удивляются откуда берутся пиратские копии!
Но давайте к делу.  Инсталлируем  игру(Full Install), винимаем диск из
привода  и  пробуем  запустить  игрушку.  Показывается   окошко   типа
RETRY/ABORT  с  информацией о том, что в приводе нет диска. У нас есть
два  варианта:   или   пробуем   поймать  игрушку   на   GetDriveTypeA
или  на  MessageBoxA.  Попробуем  первое.  Ставим  bpx  GetDriveTypeA.
А  теперь  запускаем  игру и... и ничего, появляется messagebox. Жопа!
Нужно пробовать ловить  окно.  Жмём Cancel и ставим bpx MessageBoxA. И
снова запускаем игру. Вот теперь вылетает SoftICE. Жмём F11... это что
такое? Нас выкинуло? :(. Но  жмём  еще  раз  и  мы снова в коде. Перед
глазами что-то такое:

0040276B  50                  PUSH      EAX                               
0040276C  57                  PUSH      EDI                               
0040276D  FFD6                CALL      ESI                               
0040276F  EBB3                JMP       00402724     <== Вот тут
00402771  8B0DD81CB500        MOV       ECX,[00B51CD8]                    
00402777  50                  PUSH      EAX                               
00402778  E883F40000          CALL      00411C00                          

Okи. прыгаем(F10) и приземляемся тут:

00402724  83F804              CMP       EAX,04  <== прилетели сюда
00402727  0F8566FFFFFF        JNZ       00402693                          
0040272D  57                  PUSH      EDI                               
0040272E  8D8C2488020000      LEA       ECX,[ESP+00000288]                
00402735  57                  PUSH      EDI                               
00402736  51                  PUSH      ECX                               
00402737  8B0DD81CB500        MOV       ECX,[00B51CD8]                    
0040273D  E81EF40000          CALL      00411B60         
00402742  3BC7                CMP       EAX,EDI                           
00402744  752B                JNZ       00402771         (1)
00402746  8B0DFC1CB500        MOV       ECX,[00B51CFC]                    
0040274C  6A15                PUSH      15                                
0040274E  57                  PUSH      EDI                               
0040274F  6832444349          PUSH      49434432                          
00402754  E837260100          CALL      00414D90                          
00402759  8B0DFC1CB500        MOV       ECX,[00B51CFC]                    
0040275F  50                  PUSH      EAX                               
00402760  57                  PUSH      EDI                               
00402761  6831444349          PUSH      49434431                          
00402766  E825260100          CALL      00414D90                          
0040276B  50                  PUSH      EAX                               
0040276C  57                  PUSH      EDI                               
0040276D  FFD6                CALL      ESI                               
0040276F  EBB3                JMP       00402724         (2)
00402771  8B0DD81CB500        MOV       ECX,[00B51CD8]                     

Как   видите    внизу  место  откуда  мы  прыгали  (2).  А  там  где  мы
приземлились   узнаётся  что  мы нажимали, Retry,  или  Abort. Мы нажали
Retry,  идём  дальше. Потом идут  несколько  call'oв,   но   лишь  после
одного  есть CMP. Нужно изменить джамп в строке (1). Это  можно  сделать
и в SoftICE:

Для регистров: r регистр новое_значение (пример. r eax FFFFFFFF)

Для флагов: r fl знак_флага, (пример. r fl z)

Как  мы  знаем, джамп jnz выполянется тогда, когда флаг Z не установлен.
В   нашем  случае  он  установлен.  Где  это  можно  увидеть?  Справа от
регистров.

EAX=00000004 EBX=8161D8F6 ECX=80006B90 EDX=80005AF0 ESI=BFF5412E
EDI=00000000 EBP=00E4FE38 ESP=00E4F820 EIP=00402724 odI S z a P c <= ОНО
CS=0167   DS=016F   SS=016F   ES=016F   FS=0E0F   GS=0000

Okи. Для того чтобы джамп выполнялся нужно только изменить флаг: r fl z,
и игра запускается. Yupiii. Хорошо, но ведь не каждый же раз так делать!
В этом случае нам поможет патч. На наше счастье программа не запакована.
запишем себе опкоды перед проверкой:

          [это опкоды]
00402737  8B0DD81CB500        MOV       ECX,[00B51CD8]
0040273D  E81EF40000          CALL      00411B60
00402742  3BC7                CMP       EAX,EDI
00402744  752B                JNZ       00402771 

В  нашем  случае  это:  8B0DD81CB500E81EF400003BC7752B. Теперь открываем
наш  comm2.exe  в каком-нибудь редакторе и ищем  эту последовательность.
Хорошо,  нашли  мы  место,  где  нужно  пропатчить. Как? Опкодом для JNZ
является  75h,  а мы хотим изменить его на JMP. Опкодом для JMP является
0EBh,  просто меняем 75 на EB, сохраняем и игра запускается без проблем.

This progi was cracked from cradle to the grave by Cauchy :)

BTW. если правда любите эту игру, то купите её!