CrackMe 3o by Mario
Tutorial by Agent

Tools: SI
skill: easy

-----

Crackme, to pojawilo sie ostatnio na www.crackmes.prv.pl wiec mialo jeszcze status uncracked, ale nie bede sie rozpisywal i przejde od razu do rzeczy.

Odpalamy sobie crackme i jakos nic sie nie pokazalo :( najprawdopodoniej to ktoras ze sztuczek antidebug, wiec odpalamy icedumpa i problem z glowy. Wlaczamy ponownie crackme i jush mamy przed oczyma okienko naszego programiku, no wiec wpisujemy sobie jakis fake serial i :bpx getdlgitemtexta.

Jestesmy juz w crackmeku, teraz musimy znalezc kod weryfikujacy poprawnosc seriala, stukamy sobie wiec kilkadziesiat razy f10, az znajdziemy sie tu:

00401139	mov esi, 0040318D		;wskaznik do naszego fake sn
		call 00401248		;w tym callu nasz serial jest konwertowany na wartosc hex
		push eax			;a tu wrzucany na stos
		xor eax, eax		;zeruj eax
		cpuid				;ta instrukcja zwroci nam w 
		mov [0040317B], ebx	;rejestrach ebx, edx i ecx 
		mov [0040317F], edx	;"identyfikator" naszego procka,
		mov [00403183], ecx	;dla mojego pentium mmx zwrocila stringa GenuineIntel.
		mov edi, 0040317B		;wskaznik do naszego "identyfikatora".
		pop eax			;tutaj wraca do eax nasz sn w hex
		add ah, [edi]	;dodaje do ah 1 litere identyfikatora
		add al, [edi+09]	;dodaje do al 10 litere identyfikatora
		sub ah, [edi+06]	;odejmuje od ah 6 litere identyfikatora
		xor ax, [edi+03]	;xoruje ax z 5 i 6 litera identyfikatora
		mov edi, eax	;eax do edi
		xor eax, eax
		mov esi, 00403245
		bswap edi		;zamienia 1 bajt z 4 i 2 z 3 w edi jak mamy np. 000A2C2A to bswap zamienia to na 2A2C0A00
		mov eax, edi	;---|
		xor ax, [esi]	;---|
		xor ah, [esi+03]	;---|
		rol eax, 06		;---== smieci
		shl eax, 03		;---|
		ror eax, 07		;---|
		shr eax, 09		;---|
		bswap eax		;---|
		cmp edi, 000A2C2A	;tutaj znajduje sie to czego szukamy :)
		jz 004011AF

No wiec przeanalizowalismy juz sobie kawalek kodu odpowiedzialny za sprawdzenie seriala, wiec teraz pasowalo by znalezc owego ;)
No wiec patrzymy na nasze porownanie w przedostatniej linijce (nie chcialo mi sie przepisywac offsetow ;)) i widzimy tam ze edi jest porownywane z wartoscia 000A2C2A. Wiemy ze w edi znajduje sie nasz serial po paru przeksztalceniach, wiec pasowalo by kawalek tego kodu sobie odwrocic:

	xor eax, eax
	cpuid
	mov esi, offset IDEN

	mov dword ptr [esi], ebx
	mov dword ptr [esi+04], edx
	mov dword ptr [esi+08], ecx	

	mov eax, 000A2C2Ah
	bswap eax
	
	xor ax, [esi+03]
	add ah, [esi+06]
	sub al, [esi+09]
	sub ah, [esi]
	int 3h

Takie cos nam wyjdzie ;) no wiec zapisujemy sobie w asmie taki kawaleczek kodu, kompilujemy, ustawiamy w si :i3here on, i odpalamy nasz programik. Jak jush bedziemy w si wpisujemy :?eax i pojawia nam sie nasz serial, w moim przypadku to jest 707559681, ale to zalezy od typu procesora, wiec u was ten kod moze nie dzialac.

KeyGena jush mi sie nie chce pisac bo jestem wykonczony :P, ale mysle ze kazdy z was sobie takowego w ramach treningu napisze :P

Greetzy ida do ludzi z #crackpl, ktorzy kiedykolwiek mi pomogli ;)