Dexter crackme by ToMKoL [c4U]

Dzis pobawimy sie dexter crackme napisanym przez cyberboba. Wrzucmy je sobie do idy i popatrzmy
co tam sie dzieje. Na poczatek standardowe tworzenie dialogu i obsluga komunikatow dialogu.
Wiec sprawdzmy jakie komunikaty moga nas interesowac:
loc_40117F:
		cmp	dword ptr [ebp+0Ch], 1 ;REG_CREATED_NEW_KEY
		jnz	loc_401245
		push	offset aCrackmePlease ;	"Crackme please"
		push	0BB8h
		push	dword ptr [ebp+8]
		call	SetDlgItemTextA
		mov	eax, 52656458h
		push	eax
		push	offset dword_40429E
		push	1
		push	0
		push	offset aDexter	; "Dexter"
		push	80000001h ;HKEY_CURRENT_USER
		call	RegOpenKeyExA
		or	eax, eax
		jnz	loc_40122F
		mov	dword_4046A0, 1Eh
		push	offset dword_4046A0
		push	offset dword_4042A9
		push	offset unk_4046A4
		push	0
		push	offset aDeedee	; "DeeDee"
		push	dword_40429E
		call	RegQueryValueExA
		or	eax, eax
		jnz	loc_401225
		mov	esi, dword_4042A9
		bswap	esi
		pop	eax
		add	eax, esi
		xor	eax, esi
		xor	esi, 0DEE00DEEh
		rol	esi, 0C4h
		xor	esi, eax
		shr	esi, 1
		inc	esi
		cmp	esi, 7318C211h
		jnz	loc_40121A
		nop
		mov	byte_4042C7, 1
		jmp	loc_401222
loc_40121A:
		mov	byte_4042C7, 0
		nop
Czyli ten fragmencik sprawdza czy istnieje klucz HKEY_CURRENT_USER\Dexter i jesli tak odczytuje
wartosc ciagu "DeeDee" i sprawdza tylko pierwszy dword odczytanego ciagu. Wiec czas policzyc
ta wartosc. Procka sprawdzajaca jest nieodwracalna ale maly brute force (32-bity tylko) i juz
mamy nasza poprawna wartosc - Nina. Src bruta zalaczone. Kiedy rejestr sie zgadza crackme
pokazuje ukryte wczesniej przyciski check i exit oraz edit na haselko. Wiec sprawdzmy gdzie
crackme sprawdza nasze haselko:
loc_4012C8:
		mov	edx, [ebp+10h]
		shr	edx, 10h
		or	dx, dx
		jnz	loc_4013F6
		cmp	ax, 0BB9h
		jnz	loc_4013CD
		push	200h
		push	offset dword_404498
		push	0BB8h
		push	dword ptr [ebp+8]
		call	GetDlgItemTextA
		push	eax
		test	eax, eax
		jnz	loc_401316
		... tu info o nie wpisaniu niczego
loc_401316:
		pop	ebx
		sub	ebx, 0BEEBEEh
		mov	eax, dword_404498
		xor	eax, ebx
		rol	eax, 8
		add	eax, 0ADDh
		add	ebx, 32344D4Eh
		sub	eax, ebx
		cmp	eax, 0
		jnz	loc_4013A4
		nop
		mov	eax, dword_40449C
		mov	ebx, dword_4044A0
		xor	eax, ebx
		ror	eax, 8
		xor	ebx, 50514934h
		xchg	eax, ebx
		xor	ecx, ecx
		mov	cl, byte ptr dword_4044A0+3
		xor	cl, 21h
		mov	dword_404498, eax
		mov	dword_40449C, ebx
		mov	esi, offset dword_404498
		mov	edi, offset aMiky ; "Miky"
		cld
		repe cmpsb
		jnz	loc_4013A4
To cala procka sprawdzajaca nasze haselko. Wiec sprobojmy je policzyc. Crackme sprawdza tylko
3xdword wiec nasze haslo ma 12 znakow. Wiec pokolei, zacznijmy od pierwszego dworda:
ebx=0Ch czyli dlugosc naszego hasla
eax=1 dword hasla
na koncu eax musi byc rowne 0 a przedtem jest eax-ebx wiec eax=ebx, policzmy wiec ebx
ebx=0Ch-0BEEBEEh=0FF41141Eh+32344D4Eh=3175616Ch tak wiec zaczynamy od tej wartosci
eax=3175616Ch-0ADDh=3175568Fh ror 8=8F317556h^0FF41141Eh(wartosc ebx po odejmowaniu)=70706148h
Czyli nasz poczatek to ppaH teraz odwrocmy to i mamy Happ czyli 1 dword hasla. Pozostale dwa
sa polaczone i sprawdzane czy wynik rowny:4D696B79h i 00487E00h. A wiec sprawdzmy:
eax=00487E00h rol 8=487E0000^293A2079h=61442079h aD y czyli y Da - 2 dword
ebx=796B694Dh^50514934h=293A2079h ): y czyli y :) - ostatni dword
Czyli nasze haselko to "Happy Day :)" i crackme rozwiazane bez uzycia SI.

Source bruta dla rejestru i zrzut crackme z idy zalaczone.

Greetz goes to:
cyberbob - fajne crackme, poprosze nastepne
cybult - 32-bit calc rulez
Tymon - czekam na HTB official crackme
oraz dla wszystkich piszacych tutoriale a nie tylko suche keygeny

Jesli cos ode mnie chcecie to piszcie tom_c4u@o2.pl, najwyzej nie odpisze.
Zapraszam na www.crackmes.prv.pl