CtoM tutor #5

     Data: 06.01.2001
  Program: Crackme by matr0n^CHInc
     Skad: www.crackmes.prv.pl 
    Tools: SoftIce, FrogIce
  Anty SI: jest
Spakowany: brak
   Poziom: latwy

[ROZPOZNANIE]

Odpalamy crackme i widzimy, ze naszym celem jest znalezienie poprawnego hasla. Wpisujemy dane np 6218714 i w SI zakladamy pulapke bpx GetWindowTextA i naciskamy Sprawdz i tutaj jesli nie masz uruchomionego FrogIce'a lub zapatchowanego SI czeka cie niespodzianka. Zamiast SoftIca widzimy box z napisem "Hmm no to na razie!!! Chyba wiesz dlaczego...". Otoz autor tego crackme w tym dosc nietypowym miejscu umiescil sprawdzanie obecnosci SoftIce'a w pamieci. Do zlokalizowania SI crackme uzywa INT68. Aby zatrzymac sie w momencie wywolania sprawdzania zakladamy pulapke bpx exec_int if ax==68, uruchamiamy crackme wpisujemy dane klikamy na sprawdz, crackme lapie sie i po F11 i 2xF12 jestesmy w takim oto fragmencie kodu:

:00405E50  B443                MOV       AH,43                       
:00405E52  CD68                INT       68                          
:00405E54  663D86F3            CMP       AX,F386  <-- JESLI SI ZALADOWANY
:00405E58  0F84C2FEFFFF        JZ        00405D20 <--  TO SKOK DO INFO I EXITPROCESS
:00405E5E  A188854000          MOV       EAX,[00408588]                     

pod adresem 405e54 zmieniamy flage poleceniem r fl z i po kilku F10 jestesmy tutaj:
(Jesli uzywasz FrogIce'a i zalozysz pulapke bpx GetWindowTextA takze powinienes widziec takie cos)

:00405E7F  E8D8DFFFFF          CALL      USER32!GetWindowTextA <-- POBIERANIE WPISANEGO SERIALA
:00405E84  33C0                XOR       EAX,EAX  <----- ZEROWANIE EAX
:00405E86  8A4306              MOV       AL,[EBX+06] <-- DO AL 7 ZNAK WPISANEGO SERIALA
:00405E89  83F007              XOR       EAX,07  <------ XOROWANIE TEGO ZNAKU Z 7
:00405E8C  83F830              CMP       EAX,30  <------ CZY PO XOROWANIU EAX=30h
:00405E8F  7552                JNZ       00405EE3 <----- JESLI NIE TO SKACZ

i tutaj rozpoczyna sie sprawdzanie porawnosci wpisanych danych. Widzimy ze poprawny znak to taki, ktory po xorowaniu go z 7 da nam 30h czyli 0. Aby znalezc poprawna wartosc musimy odwrocic procedure xorowania, czyli xorujemy 30 z 7 komenda ? 30^7 w wyniku, ktorej otrzymujemy liczbe 7. Zatem wiemy juz, ze siodmy znak seriala to 7. Zmieniamy flage i widzimy

:00405E91  33C0                XOR       EAX,EAX  <----- ZEROWANIE EAX
:00405E93  8A4302              MOV       AL,[EBX+02] <-- DO AL 3 ZNAK SERIALA
:00405E96  83F007              XOR       EAX,07  <------ XOROWANIE TEGO ZNAKU Z 7
:00405E99  83F837              CMP       EAX,37  <------ CZY PO XOROWANIU EAX=37h
:00405E9C  7545                JNZ       00405EE3 <----- JESLI NIE TO SKACZ
:00405E9E  33C0                XOR       EAX,EAX  <----- ZEROWANIE EAX

(........)

:00405ED3  8A4301              MOV       AL,[EBX+01] <-- DO AL 2 ZNAK 
:00405ED6  83F007              XOR       EAX,07      ITD.
:00405ED9  83F833              CMP       EAX,33      ITD.
:00405EDC  7505                JNZ       00405EE3    ITD.
:00405EDE  E8BDFEFFFF          CALL      00405DA0 <---- INFO O POPRAWNEJ REJESTRACJI
:00405EE3  33C0                XOR       EAX,EAX     
:00405EE5  5A                  POP       EDX         
:00405EE6  59                  POP       ECX         
:00405EE7  59                  POP       ECX         
:00405EE8  648910              MOV       FS:[EAX],EDX
:00405EEB  68F85E4000          PUSH      00405EF8    
:00405EF0  C3                  RET                   

proces sprawdzania kolejnych znakow jest identyczny, wiec nie przytaczam calej procedury lecz tylko jej fragmenty. Po przejsciu przez ten fragment powinienes juz wiedziec, ze prawidlowe haslo jest takie: 1402197
Ps. Swoja droga haslo moze miec wiecej niz 7 znakow, z tym tylko, ze pierwsze musza byc takie jak powyzej, reszta zas dowolna np.: 1402197abc

_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

Wszelkie uwagi, bugi, fucki itp. prosze kierowac na ctom@poland.com
Pozdrawiam 
CtoM
