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

Cracking Tutorial by Chendler

Narzedzia:

- SoftIce pod Shita 95/98 (ja uzywam [i sie na nim wyzywam] v 4.0)
- W32dasm
- Tasm i Tlink assemblera

Stuff:

Prog: Crackme2 by THE_q /PC
skill: Nie pisalo ale dajmy na to Level 3
skad : www.crackmes.prv.pl (Albo email  Phrozen_q@cyberdude.com)

 			 ****** Crackme2 by THE_q /PC ******

UUUaaaa. To crackmie bardzo mi sie spodobalo (nie pod sensem wygladu chociaz tez,
ale pod katem napisania) 
nie jest takie proste jak sie wydaje ale udalo mi sie go skraczyc.
Nie polecam go newbies chyba ze z tym tutorem. Do dziela.

Po uruchomieniu crackme widzimy standardowe okno windows (pomniejszone) z menu. Cool
wybieramy Help i Register. Widzimy dwa miejsca na wpisanie pierwsze do ksywka ew. Imie
drugie serial. Czyli dla swojego imienia generujemy S/N. Let's go ja to uzupelnilem tak.

Name: Chendler
code: 191919

no i co teraz oczywista softIce (CTRL+D) i bpx hmemcpy raz F5 i raz F11 i 12 F12 he he.
Masz ok. A co masz? - oczywista ten kod przed soba.

:00401305 A3D2214000              mov [004021D2], eax
:0040130A 3C00                    cmp al, 00
:0040130C 743F                    je 0040134D
:0040130E 90                      nop
:0040130F 90                      nop
:00401310 90                      nop
:00401311 90                      nop
:00401312 E85E000000              call 00401375 ; Fajna funkcja no wiec F8 na nia ----
:00401317 E8A5000000              call 004013C1                                       |
:0040131C 85C0                    test eax, eax               			     /
:0040131E 742D                    je 0040134D                                       /
:00401320 90                      nop						   /
:00401321 90                      nop						  /
:00401322 90                      nop         					 /
:00401323 90                      nop						/
:00401324 6A00                    push 00000000				       /
     _______________________________________________________________________ --
    |
 --- ---
:00401375 33C9                    xor ecx, ecx
:00401377 BEA9214000              mov esi, 004021A9
:0040137C 8BFE                    mov edi, esi
:0040137E AC                      lodsb
:0040137F F7D1                    not ecx
:00401381 8A99B1214000            mov bl,[ecx+004021B1]
:00401387 F7D1                    not ecx
:00401389 02C3                    add al, bl
:0040138B AA                      stosb
:0040138C FEC1                    inc cl
:0040138E 80F904                  cmp cl, 04
:00401391 75EB                    jne 0040137E
:00401393 B904000000              mov ecx, 00000004
:00401398 BEA9214000              mov esi, 004021A9
:0040139D 8BFE                    mov edi, esi
:0040139F 83C704                  add edi, 00000004
:004013A2 F2                      repnz
:004013A3 A4                      movsb
:004013A4 BEA9214000              mov esi, 004021A9
:004013A9 8BFE                    mov edi, esi
:004013AB B908000000              mov ecx, 00000008
:004013B0 AC                      lodsb
:004013B1 F7D1                    not ecx
:004013B3 8A99DF214000            mov bl,[ecx+004021DF]
:004013B9 F7D1                    not ecx
:004013BB 32C3                    xor al, bl
:004013BD AA                      stosb
:004013BE E2F0                    loop 004013B0
:004013C0 C3                      ret
 
 No wiec co tu sie dzieje jezeli wiesz to przejdz dalej jesli nie to czytaj.
 
 Otoz w tym kodzie dzieja sie fajne operacje na naszym =-= Name =-=
 O to co na ksywie Chendler:
 Do esi kopiowane jest imie.Nastepnie kopiowane jes do edi.
 Ecx jest (instrukcja not ecx) zwiekszane na maks. wartosc
 czyli FFFFFFFFh. Do bl (czyli 8 bitowy rejstr [BL i BH daja BX]) przenoszony
 jest ostatni znak nasze ksywki ( dla mnie =-= r =-=) i jest on dodawany z
 wartoscia rejestru al (dolny AX - 8 bit.). A co w al sprawdz:
 ? al
 hmm dla mnie to C. Czyli pierwszy znak dodawany jest z ostatnim az do wyczerpania
 Uff ale mieszanina ale co dalej. Jak wiadomo przy instrukcji add al,bl
 wynik jest zawarty w al. Czyli po dodaniu wszystko to myka do al. OK next.
 Do esi kopiowana jest wartosc ta co jest w al (czyli wynik po dodaniu). 
 Potem przenoszona jest do edi i znowu dodawana o 4 czyli dla mnie w oknie danych
 zostaje dler (4 bajty po jeden znak). Yess dalej ble ble i na koniec
 
 :004013B3 8A99DF214000            mov bl,[ecx+004021DF]
 :004013B9 F7D1                    not ecx
 :004013BB 32C3                    xor al, bl
 :004013BD AA                      stosb
 :004013BE E2F0                    loop 004013B0
 :004013C0 C3                      ret
  
 wartosc w al czyli wynik po dodawaniu a raczej pierwszy bajt xorowany jest z
 bl czyli pierwszym znakiem nazwy PhrozenQ czyli P. I koniec call'a przechodzimy
 F10 przez ret.
 I mAmy nastepnego calla. Jak myslisz co teraz zrobimy tak atak (to pozniej) tak tak
 wchodzimy do niego i widzimy w SI
 
 :004013C1 A1D2214000              mov eax, [004021D2]
 :004013C6 8A0DA9214000            mov cl,  [004021A9]
 :004013CC D3C0                    rol eax, cl
 :004013CE 8B0DAE214000            mov ecx, [004021AE]
 :004013D4 33C1                    xor eax, ecx
 :004013D6 8B1DAA214000            mov ebx, [004021AA]
 :004013DC 8AC8                    mov cl,  al
 :004013DE D3CB                    ror ebx, cl
 :004013E0 33C3                    xor eax, ebx
 :004013E2 B800000000              mov eax, 00000000
 :004013E7 7506                    jne 004013EF
 :004013E9 90                      nop
 :004013EA 90                      nop
 :004013EB 90                      nop
 :004013EC 90                      nop
 :004013ED FEC0                    inc al
 :004013EF C3                      ret
 
 kapujesz ? nie. Pomysl co to jest! To procka sprawdzajaca serial czy jest ok.
 Ale w jaki sposob. Otoz omawiam teraz wiec czytaj dokladnie i wyciagaj wnioski.
 
 Do eax kopiowany jest nasz serial w formie decymalnej. Dla mojego seriala wyglada to tak
 
 ? eax
 
 0002EDAF 0000191919 ....
 
 nastepnie do rejestru cl przenoszona jest wartosc dla kazdej xywki inna.
 Dla Chendler rowna jest 0E5h. Ok co dalej. Potem nasz serial w postaci 
 decymalnej jest obcinany o ta wartosc przerobiona z imienia przez poprzedni
 bodajze call. Nastepnie do rejestru ecx przenoszona jest kolejna wartosc
 imienia ma sie rozumiec jest ona przerobiona. Dla Chendler wynosi 
 
 083BFA8h

 gdy przechodzimy przez linie 004013D4 w rejestrze eax jest wartosc seriala 
 po xorowaniu go wartoscia zawarta w rejestrze ecx (dana przerobiona na imieniu)
 
 Fajne co? A zaraz za xorowaniem do rejestru ebx jest przenoszona kolejna wartosc
 przerobionej xywki. Dla Chendler

 0EFBDA3A5

 Jest ok - nadazasz? . Dalej do 8 bitowego rejestru (chyba dolnego) CX czyli cl
 przenoszona jest wartosc z 8 bitowego rejestru AX czyli al. Ale co w nim jest?
 Sprawdz przez ? al . I wiesz - nie uff. Jesli tak to nie jestes newbies. Jest
 to ostatni bajt przerobionego seriala poprzez instrukcje  

 rol eax, cl
 xor eax, ecx
 xor eax, ebx 
 
 co nam daje nie banalna wartosc w eax, ale wrocmy do naszego ostatniego bajtu.
 Czyli rejestr al wskazuje na ostatni bajt naszego seriala. Po przenoszeniu go do cl
 nasz zdeformowany serial znow podlega operacji 

 ror ebx, cl
 
 czyli obrot w prawo (co to jest patrz nizej)

 ** Pause **
 
 Instrukcje rol i ror sa odwrotne 

 Wezmy instrukcje rol np
 
 mov al,15h
 rol al,1

 15h = 00010101B -=-= to 00010101B to 15h tylko ze w systemie dwojkowym
 po instrukcji rol al,1 w al siedzi 2Ah czyli 000101010B czyli tak jakby doklejenie

 Skoro  instrukcja ror jest odwrotnoscia rol wynik bedzie rowny

 0001010B 
 
 Mam nadzieje ze skapowales czyli co to jest ror?
 Jest to obciecie danej wartosci o dana wartosc (obrot w prawo) 

 
 ** End Pause **

 
 Po tej instrukcji daje na takze fajna liczbe. Dobra dalej tlumacze nasz kod czyli

 :004013E0 33C3                    xor eax, ebx
 :004013E2 B800000000              mov eax, 00000000
 :004013E7 7506                    jne 004013EF
 :004013E9 90                      nop
 :004013EA 90                      nop
 :004013EB 90                      nop
 :004013EC 90                      nop
 :004013ED FEC0                    inc al
 :004013EF C3                      ret

 w linijce 004013E0 wartosc z eax xorowana jest z ebx i wynik myka do eax.
 Potem do rejestru eax jest przenoszona wartosc 00000000 i w eax jest pusty
 i skok jesli nie rowne (flaga na 1). Dalej rejestr al zwiekszany jest o jeden
 a co w al pamietasz Nie? W al siedzi ostatni bajt seriala przerobionego. No 
 dobra przeciez mowilem ze to procka sprawdzajaca a tu ani nie widac ani nie slychac
 przykladowych instrukcji

 test eax,eax
 je ...

 cmp eax,ebx
 je ...
 
 to jak to moze sprawdzac. Otoz popatrz na instrukcje 

 xor eax,ebx

 przykladowo jezeli w eax siedzi wartosc 

 123456
 
 a w ebx
 
 787965
 
 to po zxorowaniu wyjdzie nam nie mala liczba (flaga ust. 0) a jezeli
 w ebx mamy 123456 to wyjdzie nam zero (flaga ust. 1) z tego wynika
 ze po wyzszych instrukcjach wprowadzony serial i przerobiony musial by byc taki
 sam jak w ebx i wtedy otrzymujemy gratulacje nie wierzysz do bierz hiew
 i patchuj (xor eax,ebx na xor eax,eax lub xor ebx,ebx ) i zpatchowaniu
 kazdy wprowadzony serial jest dobry.

 Z tego wynika ze to je 100% procedura sprawdzajaca serial. Ale pomyslisz
 
 =-= gosciu nie piep* tyle tylko powiedz jak wygenerowac poprwany S/N =-=

 Otoz wygenerowanie reczne a zarazem umyslowe nie jest takie banalne gdyz
 za kazdym innym serialem w al jest inna wartosc. Wygenerowac serial 10 cyfrowy
 ktory po przerobieniu i zxorowaniu z ebx da nam wartosc w eax rowne 0 w sposob
 odwrocenia procki jest niemozliwy. Przynajmnniej ja tak mysle . Moge sie mylic
 sa lepsi crackerzy odemnie wiec moga znalezc (jak ktos znajdzie to mail me please)
 No to jak wygenerowac serial. Spoko na wszystko je sposob. Mowa
 ty o Brute Force Atack. To jesli umiesz napisz i poczekaj az ci wygeneruje S/N
 dla:

 Chendler
 0686646802

 jesli nie umiesz napisac to czyt dalej. 

 No dobra co to jest ten brute force. Otoz 
 
 Brute Force Atack - jest to metoda ktora Cracker posluguje sie wtedy gdy nie mozna
                     odwrocic procki aby wygenerowala serial. Wtedy pisze program 
                     zawierajacy takie same instrukcje sprawdzajace S/N jak w programie
     		     ktory kraczy i wtedy moze uzyskac serial. Metoda ta dziala w 100%

 Dobra pamietamy ze Brute Force ma posiadac algorytm sprawdzajacy S/N ktory podaje.
 Musi tez miec petle z ktora S/N zwieksza sie o jeden.

 Spox ponizej moj source brute.asm oparty na brute noname/AAOCG teraz nie wiem w ktorej
 noname jest grupie chyba CrackPL bo z AAOCG odszedl dobrowolnie zatem pozdrawiam 
 cie noname i zeby nie bylo nie jasnosci pozdrawiam wszystkie grupy crackerskie.

 ****************** tu ciac ******************
 
; Brute Force Atack for CrackME 2 by THE_q / Phrozen Crew
; Written by Chendler /AAOCG
; Oparte na brute by noname

PROGRAM	SEGMENT						
ASSUME CS:PROGRAM	
org 100h				
.386
Start: jmp go
serial DD 0
info db "Brute Force Atack for CrackME 2 by THE_q/Phrozen Crew",0dh,0ah
     db "Coded by: Chendler /AAOCG$",0
go:
mov     ax,cs
mov     ds,ax
mov     dx,offset info    
mov     ah,09h                    
int     21h

ok:
inc dword ptr [serial]
xor eax,eax
mov eax,[serial]
jmp petla

show:
mov eax,[serial] 
int 3
jmp exit

petla:
mov cl,byte ptr 0E5h ;stala dla Chendler
rol eax,cl
mov ecx,dword ptr 083BFA8h ;stala dla Chendler
xor eax,ecx
mov ebx,dword ptr 0EFBDA3A5h ; -''-
sub cl,cl
mov cl,al
ror ebx,cl
xor eax,ebx
cmp byte ptr eax,00
jne kick
je show

kick:
xor ecx,ecx
xor ebx,ebx
sub cl,cl
jmp ok


exit:
mov ah,4ch
int 21h

PROGRAM		ENDS
END	Start

 ****************** tu ciac ******************

 Wiem ze ledwo zyjesz (po przeczytaniu) ale jeszcze zajmiemy sie omawianiem
 jak on dziala. Otoz

PROGRAM	SEGMENT						
ASSUME CS:PROGRAM	
org 100h				
.386
Start: jmp go
serial DD 0
info db "Brute Force Atack for CrackME 2 by THE_q/Phrozen Crew",0dh,0ah
     db "Coded by: Chendler /AAOCG$",0

na poczatku widzimy naglowek charakterystyczny dla plikow *.com 
Nastepnie ustawiamy przesuniecia na 100h i deklarujemy procesor
i zaczynamy progsa

go:
mov     ax,cs
mov     ds,ax
mov     dx,offset info     -----
mov     ah,09h                  |  
int     21h                     |
                             --- ---
jest to fragment wypisujacy na ekranie info

ok:
inc dword ptr [serial]
xor eax,eax
mov eax,[serial]
jmp petla

fragmencik zwiekszajacy nasz serial o jeden. Nastepnie przenosi go do eax
i wykonuje bezposredni skoko do petli

show:
mov eax,[serial] ------ 
int 3                  |
jmp exit               |
                    --- ---
fragment kodu odpowiadajacy za przerwanie brute gdy znalazl kod. Przerywa przez int 3

petla:
mov cl,byte ptr 0E5h ;stala dla Chendler
rol eax,cl
mov ecx,dword ptr 083BFA8h ;stala dla Chendler
xor eax,ecx
mov ebx,dword ptr 0EFBDA3A5h ; -''-          -------
sub cl,cl           				    |
mov cl,al					    |
ror ebx,cl					    |
xor eax,ebx					    |
cmp byte ptr eax,00				    |	
jne kick					    |
je show					            |
						 --- ---
Czyli powyzej mamy petle (zawiera algorytm crackme2) kopiuje ona wartosci
charakterystyczne dla imienia (kazde imie inne wartosci sprawdz swoje i zamien)
i sprawdza jezeli po przerobce seriala =-= eax rowna sie zero prog skacze do 
show i pokazuje nam go (czyli to co tygryski lubia najbardziej)
 
kick:
xor ecx,ecx
xor ebx,ebx
sub cl,cl
jmp ok


exit:
mov ah,4ch
int 21h

PROGRAM		ENDS
END	Start

kick to procedura zerujaca pewne wartosci. Dlaczego? otoz gdybysmy przykladowo nie zerowali
rejestru eax to przerobiona wartosc siedzaca w nim np. 2247962421 (<=< decymalnie)
powiekszala by sie o jeden. Czyli zamiast seriala 0000000321 (po powiekszeniu) 
otrzymalibysmy 2247962422. To cos jest be czyli prawdobodobienstwo ze w ten sposob
znajdzie serial jest bardzo male a co zatym idzie wydluza czas oczekiwania na
upragniony S/N. Natomiast exit: zawiera instrukcje charakterystyczne dla plikow
*.com poto aby zakonczyc prace.

To tyle. Acha ale jak uzywac tego bruta:

1. Najpierw kompilacja
  a) tasm brute
  b) tlink /t brute
  c) del *.map
  d) del *.obj
2. Otrzymujemy brute.com (okolo 200 bajtow!)
3. Wchodzimy do SOFTICE i ustawiamy i3here na on 
4. F5 (get over softice) i uruchamiamy brute.com
5. Gdy brute znajdzie pokaze sie SI
6. Wpisujemy ? eax i dla name Chendler bedzie to tak

..... 0686646802

Jak pamietamy serial ma miec 10 cyfr to moim serialem bedzie

0686646802

7. Spisujemy S/N na kartke i i3here off
8. F5

To tyle na dzis. Acha tutorial pisalem jak mialem zepsuty modem to nie wiem 
czy konto chendler@polbox.com jeszcze istnieje. To bye mowil Chendler /AAOCG

end.

Ukonczone: 23:14 00-07-10
