			Jak puknac KeyGenMe 1 by jopas...

Ave!!!

...moja przygoda z tym pieknym keygenme zaczela sie w chwili gdy wpadlem na strone jopasa. Keygenme sobie sciagnalem, no i lukam, a tu level: very easy. KeygenMe i very easy, cos tu nie gra...Nic, laduje proga do OllyDbg (btw jest spakowany UPX-em) i czaje co tam piszczy. Okazuje sie, ze funkcje zawarte tam s jakies podejrzane. Pierwsza mysl - crypto!!!. Osobiscie nie jestem doswiadczony z kryptografia, ale juz mam troche wiedzy na ten temat i okazuje sie, ze wiedza ta wystarczyla do zlamania tego proga. Postaram sie teraz zrelacjonowac jak odbyla sie cala akcja crackania. Sprzydadza sie trzy rzeczy IDA, Procdump (do unpacku), krypto stuff, czyli implemy algosow crypto (looknij na www.witeg.prv.pl) lub jakis crypto snifer np. christal cryptotool (na www.jopas.prv.pl).

i oto codek:
UPX0:00402232                 cmp     ax, 66h
UPX0:00402236                 jnz     locret_402322
UPX0:0040223C                 push    21h             ; nMaxCount
UPX0:0040223E                 push    offset Cracker_name ; lpString
UPX0:00402243                 push    65h             ; nIDDlgItem
UPX0:00402245                 push    [ebp+hWnd]      ; hDlg
UPX0:00402248                 call    GetDlgItemTextA
UPX0:0040224D                 test    eax, eax
UPX0:0040224F                 jz      you_are_lame
UPX0:00402255                 cmp     eax, 2
UPX0:00402258                 jbe     you_are_lame
UPX0:0040225E                 mov     ds:Dlugosc_name, eax
UPX0:00402263                 push    21h             ; nMaxCount
UPX0:00402265                 push    offset Serial   ; lpString
UPX0:0040226A                 push    68h             ; nIDDlgItem
UPX0:0040226C                 push    [ebp+hWnd]      ; hDlg
UPX0:0040226F                 call    GetDlgItemTextA
UPX0:00402274                 cmp     al, 20h <- serial musi skladac sie z 32 znakow
UPX0:00402276                 jnz     you_are_lame

...no wiadomo co to robi, pobiera name i serial, a przy okazji gotuje zupe ogorkowa i formatuje dysk twardy ;)

UPX0:0040227C                 push    offset Serial
UPX0:00402281                 call    Is_serial_hex <- czy serial jest liczba hex
UPX0:00402286                 test    eax, eax
UPX0:00402288                 jnz     you_are_lame <- jesli nie to, jak nazwa mowi ;)
UPX0:0040228E                 push    offset MD5_hash <- wynik hasha md5
UPX0:00402293                 push    ds:Dlugosc_name <-chyba rozumiesz polsko-angielski
UPX0:00402299                 push    offset Cracker_name <- a kto to ten cracker wogole?
UPX0:0040229E                 call    MD5 <- hash md5, tu imple snatch'a

...wypadaloby tak zwiekszyc objetosc tego tuta i napisac co to ten md5, moze to jakis krol elfow z rytualna laska do lechtania swin. MD5 jest hashem (z angielska balagan), czyli szyfrem jednokierunkowym tzn jak cos zaszyfrujesz to nie odszyfrujesz. Wynikiem md5 jest zawsze 128-bitowa tablica unikalnych liczb dla danej wartosci. Hash ten mozna spotkac w 2/3 crypto-crackmesow, wiec jak juz zaczajisz jak wyglada, to bedziesz go poznawac bez problemu. Jeszcze jedna rzecz. Jak poznawac algosy krypto?. Pierszy sposob polega na porownaniu funkcji z programu z znanymi implemetacjami crypto. Metoda pewna, ale czasochlonna. Druga metoda polega na skorzystaniu z crypto-snifera jak np. ten z christal cryptotool 1.2. Snifer pokazuje raw offset (offset w pliku) uzytej funkcji krypto(nie jest to pewny sposob). Trzeci sposob polega na blaganiu autorow crackmesow o wskazowki, ale w 99% jest pewne, ze ci nie powiedza. Czwarty sposob polega na zlozeniu ofiary dla Radia Maryja, nadajacego de fakto na falach 666 MHz. Ojciec Rydzyk zapewne poblogoslawi i odrazu zlamiesz proga. Piaty sposob....eee nie ma takiego ;). 

UPX0:004022A3                 push    esi
UPX0:004022A4                 push    edi
UPX0:004022A5                 mov     esi, offset Serial <- textowy serial
UPX0:004022AA                 mov     edi, offset Serial_hex <- tablica na hexowy serial
UPX0:004022AF                 mov     ecx, 4
UPX0:004022B4 
UPX0:004022B4 loc_4022B4:                             ; CODE XREF: DialogFunc+11Bj
UPX0:004022B4                 call    str2hex
UPX0:004022B9                 stosd
UPX0:004022BA                 add     esi, 8
UPX0:004022BD                 dec     ecx
UPX0:004022BE                 jnz     short loc_4022B4

Cala ta funkcja zajmuje sie konwersja twojego serial z textu na liczby hex, czyli tworzy hexadecymalny odpowiednik seriala.

UPX0:004022C0                 mov     esi, offset Serial_hex
UPX0:004022C5                 mov     eax, offset MD5_hash 
UPX0:004022CA                 call    TEA_CRYPT
UPX0:004022CF                 add     esi, 8
UPX0:004022D2                 call    TEA_CRYPT

..a nastepny zonk - TEA (Tiny Encryption Algorithm). Hhmm...pewnie jakas nowa ustawa sejmowa czy jak?. A tak przy okazji to chyba takie algo krypto, ktore potrzebuje 16- bajtowego klucza i szyfruje max. 8 bajtow. W tym wypadku nasz serial jest szyfrowany po polowie, a kluczem do szyfrowania jest hash md5 naszego name.
UPX0:004022D7                 pop     edi
UPX0:004022D8                 pop     esi
UPX0:004022D9                 push    10h
UPX0:004022DB                 push    offset MD5_hash
UPX0:004022E0                 call    __rc4_setkey@8  ; _rc4_setkey(x,x)
UPX0:004022E5                 push    10h
UPX0:004022E7                 push    offset Serial_hex
UPX0:004022EC                 call    __rc4_crypt@8   ; _rc4_crypt(x,x)

...tak tak to jest RC4, podobnie jak TEA jako klucza uzywa hasha md5 z name. RC4 nie ma ograniczenia jesli chodzi o dlugos danych i klucza i nie ma tez funkcji odwrotnej. Wstarczy, ze uzyjesz wyniku jako danych do szyfrowania i posluzysz sie tym samym kluczem, a uzyskasz oryginalne dane

UPX0:004022F1                 push    esi
UPX0:004022F2                 push    edi
UPX0:004022F3                 mov     ecx, 10h
UPX0:004022F8                 mov     esi, offset MD5_hash
UPX0:004022FD                 mov     edi, offset Serial_hex
UPX0:00402302                 repe cmpsb
UPX0:00402304                 pop     edi
UPX0:00402305                 pop     esi
UPX0:00402306                 test    ecx, ecx
UPX0:00402308                 jnz     short you_are_lame

A to juz koncowka bajki autorstwa jopasa i wynika z tego, ze nasz szyfrowany serial musi byc rowny hashowi (typowy schemat). A teraz wielkie odwracanie, czyli to co psychicznie chorzy crackerzy lubia najbardziej....

Schemat szyfrowania:

	MD5(name)
	str2hex(serial)
	TEA_Crypt(serial,hash_md5_name)
	RC4_Crypt(serial,hash_md5_name) ;serial juz zaszyfrowane przez TEA
	crypted_serial = hash_md5_name

Schemat deszyfrowania:

	MD5(name)
	serial = hash_md5_name
	RC4_Crypt(serial,hash_md5_name)
	TEA_DeCrypt(serial,hash_md5_name)
	hex2str(serial)
	Serial is valid!!!

KeygenMe calkiem proste i przyjemne, ale nielamalne bez wiedzy o kryptografii.


Czas na...piwo marki zywiec...chyba tak, ale najpierw pozdrowimy sobie kogos

Cauchy...................dobrze robi sie z toba interesy ;)
FiNS.....................ty may konspirancie ;)
veneta...................twoje cm12 to niezla sieka, nie mam nerwow do tego :/
jopas....................za mile crackme, pierwsze krypto jakie zlamalem :D
KAT......................bo teraz w winampie leci sobie Cradle of filth - zajebiste!!! :)

...i fajrant

Przypadkowo naciskal klawisze tej klawiatury -> payteR [payteR@o2.pl]


	

