CrackMe v1.0 by cybult (very newbies) --- SoLUtIon bY Wily (Wilard, Wiliam ili itd.. :) )
00:33 11.07.2001r, okolice Debicy


(jezeli nie jestes totalnie poczatkujacym prosze, nie czytaj dalej...)

co bedzie potrzebne:
--SoftICE
--TASM/MASM (niekoniecznie)

heh
Witam wszystkie crackerki i crackerow, dzis zajmiemy sie crackme cybult'a jest ono bardzo
proste.Na pierwszy "zut" oka widac ze crackme zabezpieczenie name/serial lecz jak sie
przekonacie serial niebedzie nawet pobierany z okienka...
A wiec zaczynamy...:
Uruchamiamy crackme i wpisujemy jakies dane (ja wpisalem name: Wily, serial: 12121212)
klikamy przycisk sprawdz... zaraz zaraz ale przeciez niema takiego przycisku!!!
Hmm.. a wiec crackme sprawdza pole edycyjne na biezaca, wiec wpisujemy dane 
a przy ostatniej literze name wchodzimy do SI (ctrl+d) i zastawiamy plapke na GetDlgItemTextA
(bpx GetDlgItemTextA) i opuszczamy SI (F5) teraz wpisujemy nasza ostatnio syfre...
ok. SI przeja kontrole, widzimy cos takiego:

* Reference To: USER32.GetDlgItemTextA, Ord:0102h
                                  |
:00401133 E88E000000              Call 004011C6
:00401138 85C0                    test eax, eax      ;<<<<< tu wyladowalismy
:0040113A 7464                    je 004011A0
:0040113C 83F80C                  cmp eax, 0000000C
:0040113F 755F                    jne 004011A0

A wiec przeanalizujmy ten wycinek kodu... ,wywolywana jest funkcja GetDlgItemTextA pobiera ona
zawartosc pola edycyjnego, w eax po wywolaniu w/w funkcji zwracana jest liczba pobranych znakow,
wiec co robi kod po wywolaniu funkcji ???... nie wiesz! to ci powiem:), instrukcja test eax,eax
wykonuje na skladnikach operacje and, a ta skolei ustawia odpowiednie flagi, tyle ze skladniki
zostaja nie zmienione... and dziala w nastepujacy sposob:
	a | b |a and b
	-------------
	0 | 0 |   0
	1 | 0 |   0
	0 | 1 |   0
	1 | 1 |   1 
A wiec gdy eax bedzie rowne zeru zostanie ustawiona flaga z... i skok warunkowy nastepujacy
po tej instrukcji zostanie wykonany... 
Czyli ten kawalek kodu jest odpowiedzialny za sprawdzenie czy wogule wpisalismy cos do pola
edycyjnego. Nastepnie mamy porownanie eax z 0Ch i za tym skok warunkowy... czyli nasz serial
musi miec dlugosc 0Ch jest to liczba zapisana szesnastkowo wiec w SI dajemy ? C i pokaze sie
nam ta liczba w systemie szesnastkowym, dziesietnym oraz w kodzie ASCII...
Teraz blokujemy nasza plapke (bd 00) i wychodzimy z SI, wiemy ze nasz serial powinien miec 12 
(C) znakow, wiec wpisujemy je w pole name, pomijajac ostatni znak, wchodzimy do SI i teraz 
wystarszy odblokowac nasza plapke (be 00), opuszczamy SI i wpisujemy ostatni znak, znow jestesmy
w SI. Patrzymy nizej na kod, jest tam cos takiego:

:00401146 A1A4314000              mov eax, dword ptr [004031A4]
:0040114B 83F00A                  xor eax, 0000000A
:0040114E 0501208319              add eax, 19832001
:00401153 83E801                  sub eax, 00000001
:00401156 3D4781EA7D              cmp eax, 7DEA8147
:0040115B 7543                    jne 004011A0

przeanalizujmy powyzszy kod... do eax ida 4 pierwsze znaki naszego name, nastepnie sa one xor'owa
ne z liczba 0Ah (10d) do z xor'owanych juz 4 znakow dodawana jest liczba 19832001 ( i tu sie
mozna zastanowic co oznacza ta liczba:)) moi zdaniem jest to 1983<<rok urodzenia autora:)),
2001<<obecny rok) oraz od tego jeszcze odejmowane jest 1 teraz nastepuje porownanie eax
z liczba 7DEA8147h jezeli jest rowne to znaczy ze 4 pierwsze znaki sa wlasciwe. Ale jak wyciagnac
wlasciwe znaki??? to proste, wystarczy odwrocic procke sprawdzajaca, niewiesz jak?? 
A wiec po zakonczeniu operacji wykonywanych na znakach w eax ma byc 7DEA8147 robimy nastepujaco:
na samym poczatku do eax kladziemy ta liczbe, potem mamy instrukcje sub, przeciwna instrukcja 
jest add potem analogicznie instrukcja przeciwna do add jest sub i nastepnie jest xor...
xor dzila nastepujaco:
	a | b | a xor b
	---------------
	0 | 0 |   0
	1 | 0 |   1
	0 | 1 |   1
	1 | 1 |   0

a wiec gdy z xor'ujemy dwa razy te same rejestry to pozostana bez zmian np.
mov eax,010101
mov ebx,011011
xor eax,ebx
w wyniku w eax otrzymamy 001110, teraz znow wykonajmy dana operacje
xor eax,ebx 
czyli xor 001110,011011 w wyniku otrzymamy 010101 nasz eax jest taki jak na samym poczatku...
jest to tzw. odwrotnosc... wrucmy do naszej procedury
a wiec aby odwrucic xor nalezy wykonac go ponownie, caly fragment po odwroceniu bedzie wygladal
nastepujaco:

mov eax,7dea8147h
add eax,01h
sub eax,19832001h
xor eax,0ah

przejdzmy dalej zmieniajac flage przy pomocy SI robimy to w nastepujacy sposob: r fl i_flaga_
ktora chcemy zmienic w naszym przypadku jest to flaga "z" (r fl z).
teraz widzimy nastepujacy kod:

:0040115D A1A8314000              mov eax, dword ptr [004031A8]
:00401162 83F00B                  xor eax, 0000000B
:00401165 0501208319              add eax, 19832001
:0040116A 83E810                  sub eax, 00000010
:0040116D 3D5B40D693              cmp eax, 93D6405B
:00401172 752C                    jne 004011A0

ta procedura najpierw pobiera kolejne znaki naszego name i mieli go odpowiednio, jezeli po tym
mieleniu w eax bedzie znajdowc sie 93D6405B to bedzie znaczylo ze nastepne znaki naszego name sa
dobre. Jak juz pewnie sie domysliles odwrocimy ta procke:

mov eax,93d6405bh
add eax,10h
sub eax,19832001h
xor eax,0bh

i znow przechodzimy przez skok (r fl z) i widzimy procke sprawdzajaca nastepne 4 znaki naszego
name, oraz wywolanie funkcji SetDlgItemTextA:

:00401174 A1AC314000              mov eax, dword ptr [004031AC]
:00401179 83F00C                  xor eax, 0000000C
:0040117C 0501208319              add eax, 19832001
:00401181 2D00010000              sub eax, 00000100
:00401186 3D6E8BE43A              cmp eax, 3AE48B6E
:0040118B 7513                    jne 004011A0

* Possible StringData Ref from Data Obj ->"Congratulations!  Good Work!  "
                                        ->"You cracked me!"
                                  |
:0040118D 6863314000              push 00403163 

* Possible Reference to Dialog: DialogID_0067, CONTROL_ID:0069, ""
                                  |
:00401192 6A69                    push 00000069
:00401194 FF7508                  push [ebp+08]

* Reference To: USER32.SetDlgItemTextA, Ord:0228h
                                  |
:00401197 E84E000000              Call 004011EA

Teraz sam przeanalizuj procke sprawdzajaca kolejne 4 litery name... juz a wiec odwracamy:

mov eax,3ae48b6eh
add eax,100h
sub eax,19832001h
xor eax,0ch

Nastepnie kolejny raz zmieniamy skok i wciskamy F5... w polu edit zatytulowanym serial ukazala 
sie naszym oczom wiadomos ze crackme zostalo skraczone....
ale przeciez my nie wpisalismy poprawnego name...
stalo sie tak dlatego ze zmienialismy "po drodze" flagi...
Aby uzyskac wlasciwy serial napiszmy sobie kruciutki programik laczac nasze odwrucone procki...:

assume cs:kod, ds:kod
kod segment
org 100h
.486p

start:
	mov eax,7dea8147h
	add eax,01h
	sub eax,19832001h
	xor eax,0ah
	int 3h                 ;wywolanie przerwania 3h
	
	mov eax,93d6405bh
	add eax,10h
	sub eax,19832001h
	xor eax,0bh
	int 3h
	
	mov eax,3ae48b6eh
	add eax,100h
	sub eax,19832001h
	xor eax,0ch
	int 3h


mov ax,4ch
int 21h


kod ends
end start
------------------------------
kompilacja: tasm nazwa.asm
	    tlink /t nazwa.obj
------------------------------
Po skompilowaniu programu wchodzimy do SI i zakladamy plapke na przerwanie 3h (i3here on)
opuszczamy debugger i wlaczamy nasz program, ok jestesmy w SI patrzymy co jest w eax
(? eax) spisujemy kod ASCII pamietajac ze liczby powyzej 1 bajta sa zapisywane do pamieci w 
kolejnosci odwrotnej (przechowywanie odwrotne) tzn. jezeli mamy "dgaM" e SI to po odwruceniu
wyjdzie "Magd".
ok. jestesmy juz blisko, wciskamy F5 i znow SI przerwal, dajemy ? eax i spisujemy kolejne litery 
poprawnego seriala, jeszcze tylko F5 i ? eax mazemy wszystkie plapki (bc *) i blokujemy palapke
na 3h (i3here off). Laczymy nasz serial: "Magda Szala!"
Teraz czas na sprawdzenie poprawnosci naszego seriala. Otwieramy crackme i wpisujemy w pole 
name "Magda Szala!", ok dostajemy info ze crackme zostalo zlamane...

to wszystko jezeli masz jakies pytania zwiazane z crackme to niepisz poniewaz wytlumaczylem
chyba najlepiej jak umialem... jezeli jednak chcesz sie ze mna skontaktowac to mailme:

wilypl@go2.pl    lub/i    wilypl@poland.com

---------------------------------DODATEK:))--------------------------------------
jezeli pragniesz aby po kliknieciu prawym przyciskiem myszy na jakims pliku mozna go bylo 
zobaczyc np. w hiew wystarczy ze scalisz ten kawalek rejestru:
(wytnij zawartosc z pomiedzy ======= i przekopiuj do osobnego pliku nastepnie zapisz ten plik
tak aby mial rozszezenie .reg, kliknij na nim prawym przyciskiem myszy i wybierz scalaj czy jakos
tak:)). Jest to bardzo pomocne... autorem ponizszej skwencji jest: eax 
===========================================================================================
REGEDIT4
[HKEY_CLASSES_ROOT\*\shell\HIEW]
@="Edit with Hiew"
[HKEY_CLASSES_ROOT\*\shell\HIEW\command]
@="c:\\windows\\hiew.exe \"%1\""

=======================================================================================
@="c:\\windows\\hiew.exe \"%1\" <<<<< tu zmien sciezke dostepu do hieva np.
@="d:\\cracker\\programy\\hiew.exe \"%1\"



podziekowania:
naleza sie wszystkim osoba przebywajaym na kanale #crackpl
dla grup: CookieCrk, CrackPl, CHInc, AAOCG, ACG, UnderPl, DCS(?)








