			 > AAOCG <> AAOCG <> AAOCG <> AAOCG <> AAOCG < 

CrAcKinG TutoRiaL bY ChendLer

stuff:

Prog: Crackme 2.2 by LobiX
protect: s/n
skill: Medium

tools:

Zestaw super BiGCrack:

- SoftIce
- Hiew
- w32dasm .ew IDA
- Tasm

Topic: Jak zlamac Crackme2.2 by LobiX /CrackPL
__________________________________________________

Wstep:

Hej to znowu ja. Cieszycie sie prawda :)). Znowu bede was meczyl crackmesami.
Ktos moze pomyslec dlaczego tak ciagle lamiemy te crackmes. Odpowiedz prosta:

1. Latwe do zdobycia
2. Milutkie w wygladzie etc.

To jest moje pierwsze crackme na
poziom <> Medium <> Yupi Ka EY :)) ktore zlamalem.

Aha i od razu mowie ze ten tutor jest pisany wylacznie z moich przemyslen i umiejetnosci.
Nie jest oparty na innych tutorach (jak i inne mojej produkcji).
__________________________________________________

leT's gO

	Chwila przemyslen. Nic nie wymyslilem. Mamy SoftIce w pamieci. Fajnie
 uruchamiamy crackme i patrzymy ze widzimy nasze kochana winSHITowSkiE okienka 
  WinShita 95/98 ew. pulpit. No wlasnie ale my chcemy crackme. Dobra crackme zdradze wam
 ma zabezpieczenie AntySI. To lubie.

Czesc pierwsza:
Episod 1:

 Bliskie spotkanie 3 (int 3) stopnia :)) z AntySI.
Po krotszym zastanowieniu desamblerujemy plik Crackme2.exe
  i widzimy:

__________________________________________________

:00401000 892528324000            mov dword ptr [00403228], esp
:00401006 68E7134000              push 004013E7

* Reference To: KERNEL32.SetUnhandledExceptionFilter, Ord:026Ah
                                  
:0040100B E874060000              Call 00401684      -======
:00401010 BD4B484342              mov ebp, 4243484B         |
:00401015 B804000000              mov eax, 00000004         | ANTYSI
:0040101A CC                      int 03                    |
:0040101B 6A00                    push 00000000      -======      

* Reference To: KERNEL32.ExitProcess, Ord:0075h
                                  
:0040101D E850060000              Call 00401672

__________________________________________________


 Dobra ANtySI zlokalizowany. Teraz fajnie by bylo go rozwalic.
    Popatrz na to:

:00401006 68E7134000              push 004013E7

Ta intrukcja odklada na stos adres 004013E7 czyli dalsza (poprawna) czesc
crackme. Gdy mam zdesamblerowany plik crackme2.exe to wchodzimy do

Goto Code Location i wpisujemy wlasnie ten adres.
 Patrzymy na dol w32dasma i widzimy offset 7E7. Teraz uruchamiamy hiew'a 
i bedziemy patchowac crackme. Dobra crackme w hiewie zaladowane to teraz

    F4 & decode & F5 & 0400 & i widzimy to cos: -------_
      __________________________________________________|
     |
-----x-----

:00401000 892528324000            mov [00403228], esp
:00401006 68E7134000              push 004013E7                                  
:0040100B E874060000              Call 00401684      -======
:00401010 BD4B484342              mov ebp, 4243484B         |
:00401015 B804000000              mov eax, 00000004         | ANTYSI
:0040101A CC                      int 03                    |
:0040101B 6A00                    push 00000000      -======      

__________________________________________________

Nas teraz interesuje glownie intrukcja:

push 00000000

 Zmienmy ja na jmp 7E7
 W tym celu gdy jestesmy na tej intrukcji to F3 i enter
   i wpisujemy jmp 7E7. Swietnie  AnTySI za nami. Uruchamiamy crackme i widzimy
piekne okno dialogowe z miejscem na haslo. Ale zaraz nie tak predko. Zobaczmy co w 
 about.

Czytamy i wnioskujemy:

Haslo ma sie skladac z kodow ASCII czyli liter i cyfr (tylko). To dobrze pozbedziemy sie
nieprzyjemnych wpisywan. Ale do pokonania mamy jeszcze AntyBPX. No to do dziela.

Znowu desamblerujemu plik i idziemy pod adre 004013E7 i widzimy to co zawsze. Ale
chen(dler?) u gory mamy inne intrukcje: ------------_
         ____________________________________________|
   _____|_____

* Reference To: USER32.EnableMenuItem, Ord:00B4h
                                  |
:00401318 E8E9020000              Call 00401606
:0040131D 0F010D2C324000          sidt [0040322C]                (1)
:00401324 A12E324000              mov eax, dword ptr [0040322E]
:00401329 83C008                  add eax, 00000008
:0040132C 8B18                    mov ebx, dword ptr [eax]
:0040132E 83C010                  add eax, 00000010
:00401331 8B00                    mov eax, dword ptr [eax]
:00401333 25FFFF0000              and eax, 0000FFFF
:00401338 81E3FFFF0000            and ebx, 0000FFFF
:0040133E 2BC3                    sub eax, ebx
:00401340 83F81E                  cmp eax, 0000001E
:00401343 7407                    je  0040134C                   (2)
:00401345 C6051C32400001          mov byte ptr [0040321C], 01

(1) = To cos objawia sie nam przy intrukcjach majacych na celu
      wykrycie zastawionego breakpointa.

(2) = Tu jest skok warunkowy. Jezeli eax jest wartosc 0000001E
      to nie ma pulapki. Dobra skoro patching jest dozwolony
      to zmien na skok bezwarunkowy jmp (74 - EB)

JEZELI NIE CHCE CI SIE PATCHOWAC TEGO CO U GORY JEST NAPISANE SKORZYSTAJ Z MOJEGO
CRACKA POWINIEN BYC DOLACZONY DO ARCHIWUM.

Dobra gdy juz mamy ominiete zabezpieczenia mozna wziasc sie za password.
Wpisujemy co chcemy ja wpisalem:

password: Chendler

i standardowo zastawiamy pulapke na bpx Senddlgitemmessagea.
Wciskamy ok i SoftIce sie pojawil. Wciskamy F11
potem F12 kilka razy az dojdziemy do takiego kodu: 
__________________________________________________

:00401365 C1C804                  ror eax, 04 -------------
:00401368 48                      dec eax                  |
:00401369 C1C004                  rol eax, 04              | Procedura sprawdzajaca
:0040136C 83C002                  add eax, 00000002        |
:0040136F C1C804                  ror eax, 04              |
:00401372 48                      dec eax     -------------      
:00401373 7408                    je 0040137D
:00401375 8D0582134000            lea eax, [00401382]
:0040137B FFE0                    jmp eax
__________________________________________________


Zobacz gdzie jest procedura sprawdzajaca. Dobra tlumaczymy:

	W eax siedzi sobie dlugosc hasla tzn ilosc liter w hasle. U mnie jest 8.
 Eax jest ror z 04h i zmniejszane o jeden. Gdy to zostanie zrobione eax jest
  rolowane z 04h i dodawane do niego jest 002h. Nastepnie jest rorowane z 04h
i zmniejszane. Jezeli wynik rowna sie zero to ilosc liter w hasle sie zgadza.

Czyli gdy po tych wszytkich operacjach w eax jest 0 to jest dobrze. Ok odwracamy.
Po co? 
	Po to aby sie dowiedziec ile liter ma miec haslo.

Algorytm odwrocony: 

mov eax, 0h
inc eax
rol eax, 04h
sub eax, 02h
ror eax, 04h
inc eax
rol eax, 04h

Fajnie umiemy odwracac. Teraz jak sie dowiedziec co jest w eax? Napiszmy maly program.

------------------------------------------ CUT ------------------------------------------

PROGRAM	SEGMENT						
ASSUME CS:PROGRAM	
org 100h				
.386
Start: jmp Show

show:
mov eax,0h
inc eax
rol eax,04h
sub eax,02h
ror eax,04h
inc eax
rol eax,04
int 3

exit:
mov ah,4ch
int 21h

PROGRAM		ENDS
END	Start

------------------------------------------ CUT ------------------------------------------

Po skompilowaniu powyzszego proga ustawiamy softIce na tryb i3here on.
 Czyli CTRL+D i wpisz i3here on i enter. Uruchamiamy proga i widzimy SoftIce.
   wpisujemy:

? eax i widzimy:
0000001E 0000000030 ...

Czyli haslo ma miec 30 znakow.

Dobra to jeszcze raz wpisujemy haslo dajmy jakies zeby sie nam nie poplatalo np:

Advanced Art Of Cracking Group

Fajnie bo akurat 30 znakow (lacznie ze spacjami). Od razu mowie ze prog sie lapie na
bpx GetWindowTextA. Dobra to zaloz sobie ta pulapke a ja przejde do kodu ktory widze.
A oto on:
__________________________________________________

:004010B3 E8AEFFFFFF              call 00401066          
:004010B8 8D3DE5314000            lea edi, [004031E5]                
:004010BE B91E000000              mov ecx, 0000001E                  
:004010C3 F3                      repz                               
:004010C4 A4                      movsb                               
:004010C5 83EE1E                  sub esi, 0000001E                  
:004010C8 83EF1E                  sub edi, 0000001E                   
:004010CB 2BC2                    sub eax, edx                        
:004010CD 2DD5000000              sub eax, 000000D5                  
:004010D2 7406                    je 004010DA                           
:004010D4 58                      pop eax                            
:004010D5 8B0424                  mov eax, [esp]                     
:004010D8 FFE0                    jmp eax                            
:004010DA 33C9                    xor ecx, ecx                       
:004010DC 33C0                    xor eax, eax                       
:004010DE 8A5E1D                  mov bl,  [esi+1D]                   
:004010E1 83F9F1                  cmp ecx, FFFFFFF1                   
:004010E4 7416                    je 004010FC                         
:004010E6 F7D9                    neg ecx                            
:004010E8 301C31                  xor [ecx+esi], bl                  
:004010EB 8A0431                  mov al, [ecx+esi]                  
:004010EE F7D9                    neg ecx                            
:004010F0 8A5C311C                mov bl, [ecx+esi+1C]               
:004010F4 D2C0                    rol al, cl                         
:004010F6 3044311D                xor [ecx+esi+1D], al               
:004010FA E2E5                    loop 004010E1                      
:004010FC E865FFFFFF              call 00401066                      
:00401101 D1E2                    shl edx, 1                         
:00401103 2BD0                    sub edx, eax                       
:00401105 42                      inc edx                            
:00401106 C1CA04                  ror edx, 04                        
:00401109 4A                      dec edx                            
:0040110A 7406                    je 00401112                         
:0040110C 58                      pop eax
:0040110D 8B0424                  mov eax, [esp]
:00401110 FFE0                    jmp eax

To jest tzw. wedlgu mnie ofcoz Mydlenie Oczu. Tutaj nic nie dzieje sie ciekawego
password troszke przerobiony ale to nie potrzebne nam. Bardziej interesujacy jest
ponizszy kod. Omowmy go dokladnie.
________________________________________________________________

:00401112 B8BD8D9E9C              mov eax, 9C9E8DBD ----------|
:00401117 0107                    add [edi], eax              | 
:00401119 75F1                    jne 0040110C                | 
:0040111B B86B4D6520              mov eax, 20654D6B           |
:00401120 294704                  sub [edi+04], eax           |
:00401123 75E7                    jne 0040110C                |
:00401125 B8CED1CFDF              mov eax, DFCFD1CE           |  
:0040112A 014708                  add [edi+08], eax           |
:0040112D 75DD                    jne 0040110C                |
:0040112F 8B470C                  mov eax, [edi+0C]           |
:00401132 3D6279204C              cmp eax, 4C207962           |
:00401137 75D3                    jne 0040110C                |
:00401139 B8919D96A7              mov eax, A7969D91           |
:0040113E 014710                  add [edi+10], eax           |
:00401141 75C9                    jne 0040110C                |
:00401143 B8E0A4BC8D              mov eax, 8DBCA4E0           |
:00401148 014714                  add [edi+14], eax           | 
:0040114B 75BF                    jne 0040110C                |
:0040114D B89F9C94AF              mov eax, AF949C9F           |
:00401152 014718                  add [edi+18], eax           |
:00401155 75B5                    jne 0040110C                |
:00401157 66B8B4A2                mov ax, A2B4                |
:0040115B 6601471C                add [edi+1C], ax            |
:0040115F 75AB                    jne 0040110C                |
:00401161 33C9                    xor ecx, ecx                |
:00401163 83F910                  cmp ecx, 00000010           | 
:00401166 740E                    je 00401176                 |
:00401168 8B810C324000            mov eax, [ecx+0040320C]     |
:0040116E 310431                  xor [ecx+esi], eax          |
:00401171 83C104                  add ecx, 00000004           | 
:00401174 EBED                    jmp 00401163                | 
  ____________________________________________________________|
 |______
        |
--------x--------

Omowienie: 
 
Powyzszy kod jest bardzo interesujacy gdyz zawiera on krotkie i prosciutkie
procedury sprawdzajace serial. Poczawszy od pierwszej procedury czyli sprawdzenia 4 znakow
i przerobienia za pomoca odpowiednich intrukcji. Jezeli wynika da nam 0 to te znaki sa
odpowiednie. Odwrocmy to wszysto!
________________________________________________________________

:00401112 B8BD8D9E9C              mov eax, 9C9E8DBD
:00401117 0107                    add [edi], eax
:00401119 75F1                    jne 0040110C
________________________________________________________________

Jezeli wynik da zero to dobrze czyli zostana wykonane nastepne procedury.

oDwRacAniE (w softice):
________________________________________________________________

? 0-9C9E8DBD

63617243  1667330627 "carC"
________________________________________________________________

Dalej!

:0040111B B86B4D6520              mov eax, 20654D6B ;next4 znaki hasla " eMk"
:00401120 294704                  sub [edi+04], eax
:00401123 75E7                    jne 0040110C

Jezeli wynik da 0 to dobrze.
________________________________________________________________

Dalej!

:00401125 B8CED1CFDF              mov eax, DFCFD1CE
:0040112A 014708                  add [edi+08], eax
:0040112D 75DD                    jne 0040110C 

? 0-DFCFD1CE

20302F32   0540028466 " 0.2"
________________________________________________________________

Dalej!

:00401132 3D6279204C              cmp eax, 4C207962 ;4 znaki kolejne "L yb"
:00401137 75D3                    jne 0040110C
________________________________________________________________

Dalej!

:00401139 B8919D96A7              mov eax, A7969D91
:0040113E 014710                  add [edi+10], eax
:00401141 75C9                    jne 0040110C

? 0-A7969D91

5869626F  1483301487  "Xibo"
________________________________________________________________

Dalej!

:00401143 B8E0A4BC8D              mov eax, 8DBCA4E0
:00401148 014714                  add [edi+14], eax
:0040114B 75BF                    jne 0040110C

? 0-8DBCA4E0

72435B20  1917016864  "rC[ "
________________________________________________________________

Dalej!

:0040114D B89F9C94AF              mov eax, AF949C9F
:00401152 014718                  add [edi+18], eax
:00401155 75B5                    jne 0040110C

? 0-AF949C9F

506B6361  1349215073  "Pkca"
________________________________________________________________

Dalej!

:00401157 66B8B4A2                mov ax, A2B4
:0040115B 6601471C                add [edi+1C], ax 
:0040115F 75AB                    jne 0040110C

? 0-A2B4

FFFF5D4C  4294925644  "  ]L"

To wszystko teraz zlaczamy co otrzymalismy po odwroceniu i otrzymujemy haslo
poprawne czyli:

CrackMe 2.0 by LobiX [CrackPL]

Po wpisaniu go otrzymuje MessageBox z wiadomoscia You R The Best!

Fajnie bylo do zobaczenia w nastepnym tutorze.

________________________________________________________________

Chendler /AAOCG
chendler19@poczta.onet.pl
________________________________________________________________