#######################################################################
#                                                                     #
#                  	       Tutorial			              #
#								      #
#        Program   :  Crackme 2.0 beta 2 by Jo Joro/CrackPL'99        #
#        Autor     :  BlackfooT                                       #
#        Narzedzia :  SoftIce					      #
#								      #
#######################################################################
Info:

   Crackme nie odpala sie w obecnosci debuggera, wiec mozna tu uzyc 
   IcePatch'a 2.0, ktory znacznie ulatwi nam zycie, albo sie meczyc
   omijajac zabezpieczenia. No ale jak kto woli. :))
   Ja nie bede zwiekszal rozmiaru pliku na opisywanie ominiecia
   metod anty-SI. :)


1) Odpalamy CrcMe. Ustawiamy sobie suwaki, checkboxy i wpisujemy 
   haselko. Zastawiamy "pbx hmemcpy" (program napisany jest w delphi :)
   klikamy "Rejestruj" i ... i nic :). Sprawdzmy czy Crcme nie pobiera
   hasla przy wpisywaniu - klikamy jakis klawisz no i jestesmy w SI, 
   teraz 15 razy F12 i jestesmy mniej wiecej tu :

    0177:0045A1E8  CALL      0043854C
    0177:0045A1ED  MOV       EDX,[EBP-08] <-- w edx nasze haslo
    0177:0045A1F0  MOV       EAX,EBX
    0177:0045A1F2  CALL      00407C84
    0177:0045A1F7  MOV       EAX,0045A29C
    0177:0045A1FC  CALL      0045A050
    0177:0045A201  MOV       EDX,0000002C 
    0177:0045A206  MOV       EAX,EBX
    0177:0045A208  CALL      0045A048     <-- xorowanie bajtow z 
					      naszego hasla z 2Ch
    0177:0045A20D  LEA       EDX,[EBP-04] <-- w edx wynik xorowania
    0177:0045A210  CALL      00407DA8
    0177:0045A215  MOV       EDX,[EBP-04]


2) Widzimy ze nasze haslo zostalo pobrane, w nastepnej kolejnosci
   kazdy bajt z hasla zostal zxorowany z 2Ch. Przejdzmy pare linijek
   dalej. Mamy petle ktora sumuje bajty z naszego zmodyfikowanego 
   haselka :

    0177:0045A23C  TEST      BL,BL
    0177:0045A23E  JBE       0045A26A
    0177:0045A240  MOV       BYTE PTR [EBP-09],01
    0177:0045A244  XOR       EAX,EAX    <-------------|
    0177:0045A246  MOV       AL,[EBP-09]	      | - petla 
    0177:0045A249  MOV       EDX,[00465870]	      |
    0177:0045A24F  MOV       AL,[EAX+EDX-01]	      |
    0177:0045A253  AND       EAX,000000FF	      |
    0177:0045A258  ADD       [0046586C],EAX <-- ?     |
    0177:0045A25E  CALL      0045A174		      |
    0177:0045A263  INC       BYTE PTR [EBP-09]	      |
    0177:0045A266  DEC       BL		  	      |
    0177:0045A268  JNZ       0045A244   <-------------|
    0177:0045A26A  XOR       EAX,EAX
    0177:0045A26C  POP       EDX


3) Zwrocmy uwage na linijke 0177:0045A258. Jest tam wczesniej
   wspomniane dodawanie do [0046586C] bajtow z haselka.
   Pojdzmy na skroty i zastawmy breakpointa na ten obszar pamieci
   "bpm 0046586C". Teraz F11 i ... 

    0177:0045A173  RET
    0177:0045A174  MOV       EAX,[00465868]
    0177:0045A179  INC       EAX
    0177:0045A17A  IMUL      DWORD PTR [0046586C]
    0177:0045A180  SUB       EAX,4C   <--- Tu jestesmy :)
    0177:0045A183  MOV       EDX,[00465864]
    0177:0045A189  XOR       EDX,14
    0177:0045A18C  IMUL      EDX,[0046586C]
    0177:0045A193  ADD       EDX,[00465864]
    0177:0045A199  ADD       EDX,000000D5
    0177:0045A19F  ADD       EAX,00000545
    0177:0045A1A4  SUB       EAX,EDX
    0177:0045A1A6  JNZ       0045A1B0 <--- Jezeli nie skoczy to zlamane 
    0177:0045A1A8  MOV       BYTE PTR [00465874],01
    0177:0045A1AF  RET
    0177:0045A1B0  MOV       BYTE PTR [00465874],00
    0177:0045A1B7  RET


4) No coz wydaje mi sie ze to procka sprawdzajaca ;) teraz wystarczy to
   tylko odwrocic i znalezc odpowiednie haselko. Pod 00465868 znajduje sie
   liczba z ustawien suwakow, a pod 00465864 z checkboxow.


5) Sprawdzimy teraz jak generowane sa wartosci pod 00465868 i 00465864
   walimy bpm 00465868 i podobnie z drugim, F11 i przestawiamy
   suwak - wyladowalismy:

    0177:0045A30F  MOV       [00465868],EAX    
    0177:0045A314  MOV       EAX,0045A42C      
    0177:0045A319  CALL      0045A050          


6) Oczywiscie sprawdzamy co jest wyzej:

    0177:0045A2C4  MOV       EAX,[EAX+0000020C] <-- Wartosc suwaka 4
    0177:0045A2CA  MOV       EDX,[EBX+000002F0]
    0177:0045A2D0  ADD       EAX,[EDX+0000020C] <-- Dodaje do eax
 						    wartosc suwaka 5 
    0177:0045A2D6  MOV       EDX,[EBX+000002F4]
    0177:0045A2DC  MOV       EDX,[EDX+0000020C] <-- Wartosc suwaka 6
    0177:0045A2E2  INC       EDX               
    0177:0045A2E3  MOV       ECX,EDX            
    0177:0045A2E5  CDQ                          
    0177:0045A2E6  IDIV      ECX               
    0177:0045A2E8  MOV       EDX,[EBX+000002E0]
    0177:0045A2EE  MOV       EDX,[EDX+0000020C] <-- Wartosc suwaka 1
    0177:0045A2F4  MOV       ECX,[EBX+000002E4]  
    0177:0045A2FA  IMUL      EDX,[ECX+0000020C] <-- mnozy edx przez 
                                                    wartosc suwaka 2 
    0177:0045A301  MOV       ECX,[EBX+000002E8]
    0177:0045A307  ADD       EDX,[ECX+0000020C] <-- dodaje do edx 
                                                    wartosc suwaka 3
    0177:0045A30D  ADD       EAX,EDX           
    0177:0045A30F  MOV       [00465868],EAX     <-- wynik


7) to juz wiemy jak jest ustalana wartosc suwakow, czas teraz na
   checkboxy. Zaznaczamy jakis checkbox i ladujemy :

    0177:0045A63F  MOV       [00465864],EAX
    0177:0045A644  MOV       EDX,00000014  <-- Ilosc checkboxow
    0177:0045A649  MOV       EAX,ESI       
    0177:0045A64B  XOR       ECX,ECX       <-----------|  
    0177:0045A64D  MOV       CL,[EAX]                  |
    0177:0045A64F  MOV       EBX,ECX                   | - petla :)
    0177:0045A651  ADD       EBX,ECX                   | 
    0177:0045A653  MOV       ECX,EBX                   |
    0177:0045A655  ADD       [00465864],ECX            |
    0177:0045A65B  INC       EAX                       |
    0177:0045A65C  DEC       EDX                       |
    0177:0045A65D  JNZ       0045A64B      <-----------|


8) Mamy tu mala petelke i jak widac dodaje ona pod 00465864 podwojona
   wartosc zaznaczonego checkboxa (czyli wynik zawsze parzysty :)


9) Majac juz wszystkie nam potrzebne informacje szukamy haselka :P
   Procke z punktu 3 mozna zapisac matematycznie :

       x*z - 4Ch+545h = y1*z + D5h+y

   Gdzie ustawienia suwakow to 'x' (po dodaniu 1), checkboxow to
   'y1' a po xorowaniu z 14h 'y', zas nasze haslo to 'z'.
   Po przeksztalceniu mozemy obliczyc 'z' :
   
       z = (-424h+y) / (x-y1)

   Ja dobralem sobie ustawienia checkbosow i suwakow tak 
   aby (x-y1) = 2 --> wtedy wartosc (-424h+y) jest podzielna przez 2,
   bo wiadomo juz ze wartosc z ustawien checkboxow jest zawsze parzysta.
   Dla moich ustawien (x=52, y1=54, y=40), z = 1F2h
   Teraz tylko dobieramy takie haslo zeby 'z' wyszlo 1F2h i gotowe :)

10) Klikamy "Rejestruj" i wyskakuje nam about tylko ze na image'u
    mamy napis "Cracked!".


A oto moje rozwiazanie:

  - Ustawienia suwakow    : 9, 8, 7, 6, 5, 4
  - Zaznaczone checkboxy  : 2, 4, 5, 6, 7, 8
  - haselko               : FFFFh*

					Thats All :)
