   Nazwa Progu	: CrackMe 4.0 by kaliber777 
   Data        	: 09/07/2001
   Napisal   	: Kwasek
   Co        	: tutorial


Czesc!

W tym tutorialu opisze sposob zlamania CrackMe 4.0 by kaliber777
No to zakladamy pulapke na GetDlgItemTextA, wpisujemy dane w moim przypadku Name: Kwasek
Serial: 123456 i naciskamy OK. Pojawil sie SoftIce. Teraz F12 i jestesmy w kodzie Crackme
Kod pochodzi z IDY
		
		push	200h
		push	offset name
		push	0BB8h
		push	dword_4030EC
		call	GetDlgItemTextA
		mov	esi, offset Name 	;Name w ESI
		mov	bl, al			;Kopiuj ilosc znakow name do bl	
		push	200h
		push	offset serial
		push	0BBAh
		push	dword_4030EC
		call	GetDlgItemTextA
		mov	edi, offset serial	;serial w edi
		mov	bh, al			;Kopiuj ilosc znakow seriala do bh
		cmp	bx, 1006h		
		jb	loc_40115F		;skok gdy mniejszy
		cmp	bx, 1010h
		jg	loc_40115F		;skok gdy wiekszy 

Z tego wynika ze serial musi miec 16 znakow a name min.6 a max.16
Teraz wszystko od poczatku name: Kwasek, Serial:1234567890abcdef.Zastawiamy pulapke
i mamy dalej taki kod:
		
		movzx	ecx, bl			;Kopiuj ilosc znakow name do bl	

loc_401075:				
		cmp	byte ptr [ecx+esi-1], 30h
		jb	loc_40115F
		cmp	byte ptr [ecx+esi-1], 7Ah
		jg	loc_40115F
		loop	loc_401075

Ta procka sprawdza czy znaki Name sa w granicach od 30 do 7a czyli od 0 do z

		movzx	ecx, bh		;Kopiuj ilosc znakow seriala do bh

loc_401090:				
		cmp	byte ptr [ecx+edi-1], 30h
		jb	loc_40115F
		cmp	byte ptr [ecx+edi-1], 7Ah
		jg	loc_40115F
		loop	loc_401090
		
Tak samo w przypadku seriala.
Dalej mamy:

		mov	ecx, 10h
loc_4010AD:				
		cmp	byte ptr [ecx+esi-1], 0
		jz	short loc_4010B6
		loop	loc_4010AD
loc_4010B6:				
		movzx	edx, byte ptr [esi]
		mov	[ecx+esi-1], dl
		cmp	cl, 0
		jnz	short loc_4010AD 

Ta procedura robi takie cos z name: KwasekKKKKKKKKKK
Gdyby Name byloby np.takie: 123456 to po przejsciu przez ta procke wyszlo:
1234561111111111. Juz wiesz na pewno o co chodzi. Dobra patrzymy dalej

		mov	ecx, 10h

loc_4010C7:				
		xor	eax, eax
		xor	ebx, ebx
		mov	bl, [ecx+esi-1]			;Kopiuj znak name do bl
		mov	bh, [ecx+edi-1]			;Kopiuj znak seriala do bh
		sub	bh, 30h				;Znak seriala - 30h
		add	al, bl				;Dodaj znak Name do al
		add	al, bh				;Dodaj do znaku Name znak serial-30
		cmp	al, 7Ah				;
		jb	short loc_4010E0		;Skok gdy mniejszy		
		sub	al, 4Ah				

loc_4010E0:				
		mov	[ecx+esi-1], al			;Kopiuj al do Name
		loop	loc_4010C7			;Petla = 10h


No dobra po tej mieszaninie w name otrzymalem: LydwjqRSTK234567
Ale fajnie zamieszalo, zobaczmy dalej


		mov	ecx, 10h
		mov	eax, 7AB7h
		mov	ebx, 6A2Fh
		xor	edi, edi

loc_4010F7:				
		xor	edx, edx
		movzx	edx, byte ptr [ecx+esi-1]	;Kopiuj 10 znak zaszyfrowanego name do edx
		push	edx				;znak na stos
		mul	ebx				;eax=eax*ebx
		pop	edx				;znak ze stosu
		imul	edi, eax			;edi=edi*eax
		add	edi, edx			;edi=edi+znak zaszyfrowanego name
		loop	loc_4010F7			;petla = 10h
		mov	dword_4034FA, edi		;kopij wynik mieszania

przewijajac troche kod w SoftIce doszedlem do porownania

	cmp	dword_4034FA, 0A10ED041h
		jnz	short loc_40115F;	skok do zle haslo

Tak mi sie zdaje ze ta procedura jest nie odwracalna, a moze Brute Force, wszystko byloby OK
ale wyniku chyba bym sie nie doczekal. Moze autor CrackMe cos nam uproscil, zobaczmy dalej 
  
		add	ecx, 8

loc_401114:				
		xor	edx, edx
		movzx	edx, byte ptr [ecx+esi-1]	;Kopiuj 8 znak zaszyfrowanego name do edx
		push	edx				;znak na stos
		mul	ebx				;eax=eax*ebx
		pop	edx				;znak ze stosu
		imul	edi, eax			;edi=edi*eax
		add	edi, edx			;edi=edi+znak zaszyfrowanego name
		loop	loc_401114			;petla = 8
		mov	dword_4034FE, edi
	
		cmp	dword_4034FE, 0DCFB75AFh
		jnz	short loc_40115F

Praktycznie ta sama procka tylko obliczanie wykonywane jest z uzyciem pierwszych 8 znakow.
Hmm...mozemy zrobic brute force dla 8 znakow, ktore to znaki bysmy wykozystali do zrobienia
drugiego brute force tez 8 znakowego. Ale sprawdzenie wszystkich kombinacji chyba by trwalo
tez bardzo dlugo. No nic ale sprubowac mozna. Dwa brutki powinny znajdowac sie wraz z tutorem
Poniewaz myslalem ze znalezienie odpowiedniego klucza zajmie duzo czasu w brute force uzylem
zapis do pliku np. szukanie rozpoczynasz np. od wartosci: 00000000 i przypuscmy po 30 min.
jest wartosc: 00zs3x32. Teraz gdybys wylaczyl kompa wszystko poszlo by sie walic.I dlatego
zrobilem zapis do pliku do ktorego co jakis czas zapisywana jest wartosc.To jest tak jakby
Save. Mozesz w kazdej chwili wylaczyc brute force , a gdy ponownie go zaloaczysz, Brut force
odczyta ostatnia zapisana wartos i zacznie dalej szukac. Gdy znajdzie poprawna wartosc brute
force stwozy plik z poprawnym wynikiem

Instrukca Obslugi:

- stwoz plik z tekstowy(.txt) o nazwie temp1
- wprowadz wartosc od ktorej ma szukac 8 znakow od 0 do z ja wprowadzilem: 99999999
- uruchom brut1
- wynik1.txt -nazwa pliku z poprawnym wynikiem

Ladnie go odpalilem nawet wewalilem go do autostartu. No moze za tydzien doczekam sie wyniku
(zalezy jak bede mial wlaczonego kompa). A tu niespodzianka po kilku minutach zostal utwozony
plik wynik1.txt. Cos szybko, chyba jest wiele rozwiazan :). Oto one: vwb:99Z9
Teraz ta wartos wstawiamy do drugiego brut force

Instrukca Obslugi:

- stwoz plik z tekstowy(.txt) o nazwie temp2
- wprowadz wartosc znaleziona przez brut1 czyli w moim przypadku : vwb:99Z9
  a pozniej wartosc od ktorej ma szukac kolejne 8 znakow od 0 do z ja wprowadzilem: 00000000
  cos takiego: vwb:99Z900000000 
- uruchom brut2
- wynik2.txt -nazwa pliku z poprawnym wynikiem

To samo jak wyzej dlugo na wynik nie czekalem oto on: vwb:99Z9MI0w00F0
jest to klucz wedlug ktorego mozna obliczyc prawidlowy serial

I teraz jak widac bardzo latwo obliczyc prawidlowy serial z tej procki


		mov	ecx, 10h

loc_4010C7:				
		xor	eax, eax
		xor	ebx, ebx
		mov	bl, [ecx+esi-1]			;Kopiuj znak name do bl
		mov	bh, [ecx+edi-1]			;Kopiuj znak seriala do bh
		sub	bh, 30h				;Znak seriala - 30h
		add	al, bl				;Dodaj znak Name do al
		add	al, bh				;Dodaj do znaku Name znak serial-30
		cmp	al, 7Ah				;
		jb	short loc_4010E0		;Skok gdy mniejszy		
		sub	al, 4Ah				

loc_4010E0:				
		mov	[ecx+esi-1], al			;Kopiuj al do Name
		loop	loc_4010C7			;Petla = 10h


Czyli tak: 
Name: Kwasek, nastepnie name = KwasekKKKKKKKKKK po zaszyfrowaniu z serialem: 1234567890abcdef
wyszlo: LydwjqRSTK234567 a ta wartos musi byc w takiej postaci vwb:99Z9lIr@00F0
No to liczymy 	'0'+4ah-'K'+30h = 50h(_)
		'F'+4ah-'K'+30h = 75h(u)
		'0'+4ah-'K'+30h = 75h(_)
		'0'+4ah-'K'+30h = 75h(_)
		'@'+4ah-'K'+30h = 6fh(o) 
		'r'+4ah-'K'+30h = a1h gdy wiekszy niz 7ah nie dodajemy 4ah -> 'r'-'K'+30h = 57h(W)
		'I'+4ah-'K'+30h = 78h(x)
		'l'-'K'+30h = 51h(Q) 
		'9'+4ah-'K'+30h = 68h(h)
		'Z'-'K'+30h = 3fh(?)
		'9'+4ah-'k'+30h = 48h(H)
		'9'+4ah-'e'+30h = 4eh(N)
		':'+4ah-'s'+30h = 41h(A)
		'b'+4ah-'a'+30h = 31h(1)
		'w'+4ah-'w'+30h = 30h(0)
		'v'-'K'+30h = 5bh([)

Dobrnelismy do konca 				

				Name: Kwasek
				Serial: [01ANH?hQxWo__u_
  

 



