/*****************************************
*    dATE: 30.08.2004                    *
*    tYPE: Tutorial                      *
*      bY: ManSun                        *
*--------------------------------------- *
* pROGRAM: Dyzio's CrackMe 0.1           *
*     uRL: http://www.crackmes.prv.pl    *
*   tOOLS: Soft-Ice                      *
*          IDA                           *
*   lEVEL: easy                          *
*----------------------------------------*
*    iNFO: (Only Brute-Force or patch)   *
*****************************************/


Crackme zaczalem analizowac okolo wrzesnia 2003 ;) sporo czasu nie? Ale nie siedzialem nad nim tyle spokojnie ;). Rzucilem na niego okiem pod IDA zobaczylem co i jak sie dzieje, jedyna mozliwosc to only Brute-Force i tak jakos zostal lezec na dysku. Ostatnio rzucil mi sie w oczy przy robieniu porzadku, rzucilem okiem na http://www.crackmes.prv.pl status UNCRACKED, a wiec pora wrocic do niego, opisac go i wyslac co by bylo CRACKED ;)

Procka sprawdzajaco wpisany Password znajduje sie ponizej i jak dla mnie jest nieodwracalna. Haslo ma miec 36 znakow (od autora crackmeska wiem ze haslo sklada sie z zakresu " " - "z") czyli na bruta to zdeka za duzo. A wiec jedyne rozwiazanie to zapatchowanie kodu no chyba ze ktos napisze w testamencie aby pra-pra-wnuk odczytal haslo z bruta ;)

Wiec ponizsze zdanie z opisu to SCIEMA ;-/
"Ok, nie wolno patchowac proga, aby zadanie zostalo zaliczone musisz mi przyslac poprawne haslo dla ktorego pokazuje sie MessageBox z informacja "Bravo :>, ..."" 

SPOSOB DZIALANIA CRACKMESA:
1. Wyswietlenia MsgBox'a o Fatal Error (Nag screen)
2. Wyswietlenie okna crackmesa
3. Po wcisnieciu 'Check' crackmes nie wyswietla MsgBox'a o zlym Passwordzie
4. Po sprawdzeniu Passworda skok 'Call edx' do kodu na poczatku crackmesa. Pod SI lub w IDA zobaczycie kilka bajtow nieuzywanego kodu, gdzie obliczane sa parametry wywolania funkcji MessageBoxA, a nastepnie znowu skok 'Call edx' zapewne pod adres gdzie wyswietlany jest Nag Screen czyli '00401042' a tym samym wywolywana API MessageBoxa. Wyglada to mniej wiecej tak:

;-------------------------------------------------------------------------
;                        POCZATEK CRACKMESA         
;
.text:00401000                     public start
.text:00401000     start           proc near
.text:00401000 000                 call    sub_401034       ;ominiecie ponizszego kodu
.text:00401005 000                 retn
.text:00401005     start           endp
.text:00401005     
.text:00401006     ;  Ominiety kod 
.text:00401006                     nop
.text:00401007                     jmp     far ptr 7EF5h:75B98002h
.text:0040100E     ; 
.text:0040100E                     mov     esp, 7ED56ABAh
.text:00401013                     mov     esp, 7EF565BBh
.text:00401018                     mov     esp, 0C181406Ah
.text:0040101D                     cmpsb
.text:0040101E                     cmp     al, 0C1h
.text:00401020                     inc     ebx
.text:00401021                     add     ebx, 43C13CA6h
.text:00401027                     push    ebx            ;parametr MsgBox'a Topic
.text:00401028                     push    ecx            ;parametr MsgBox'a Text
.text:00401029                     add     edx, 43C13CA6h
.text:0040102F                     push    0              ;parametr MsgBox'a
.text:00401031                     call    edx            ;skok do wywolania funkcji                   MsgBox pod adres gdzie wyswietlany jest Nag Screen czyli '00401042'

.text:00401033                     retn
.text:00401034     ; -----------------Koniec ominietego kodu---------------
.text:00401034     ; ------------------S U B R O U T I N E ----------------
.text:00401034     
.text:00401034     
.text:00401034     sub_401034      proc near               ; CODE XREF: startp
.text:00401034 000                 push    10h             ; uType
.text:00401036 004                 push    offset aFatalError ; lpCaption
.text:0040103B 008                 push    offset aNieprawidOwaPr ; lpText
.text:00401040 00C                 push    0               ; hWnd
.text:00401042 010                 call    MessageBoxA     ;wyswietlenia NAGA
.text:00401047 000                 push    0               ; lpModuleName
.text:00401049 004                 call    GetModuleHandleA
.text:0040104E 000                 mov     dword_403000, eax
.text:00401053 000                 push    0               ; dwInitParam
.text:00401055 004                 push    offset DialogFunc ; lpDialogFunc
.text:0040105A 008                 push    0               ; hWndParent
.text:0040105C 00C                 push    64h             ; lpTemplateName
.text:0040105E 010                 push    eax             ; hInstance
.text:0040105F 014                 call    DialogBoxParamA
.text:00401064 000                 push    0               ; uExitCode
.text:00401066 004                 call    ExitProcess
.text:0040106B 000                 retn
.text:0040106B     sub_401034      endp
;------------------------------------------

5. Tak wiec jesli usuniemy Nag Screena, to nawet jak mielibysmy poprawny Password to i tak nie dostaniemy komunikatu o jego poprawnosci ;)
6. Napis aBravoTerazWyLi db 'Bravo ;>, teraz wylij mi haseko na: quarx@go2.pl',0 znajduje sie pod aresem '0040321B'
7. No i to by bylo na tyle ;-)

;----------------------------------------------------------------------------
;
;                    PROCKA SPRAWDZAJACA POPRAWNOSC PASSWORDA
;
; 

loc_401186:				; CODE XREF: DialogFunc+Cj
		cmp	edx, 111h
		jnz	short loc_4011B4
		cmp	[ebp+arg_8], 67h
		jnz	short loc_4011B2
		push	0FFh		; nMaxCount
		push	offset String	; lpString
		push	66h		; nIDDlgItem
		push	[ebp+hDlg]	; hDlg
		call	GetDlgItemTextA
		cmp	eax, 4
		jb	short loc_4011B2 ; skok	jezli ponizej
		call	sub_40106C	; Poczatek procki sprawdzajacej	serial

loc_4011B2:				; CODE XREF: DialogFunc+26j
					; DialogFunc+3Fj
		jmp	short loc_4011D0
; 


;  S U B	R O U T	I N E 

; Poczatek procki sprawdzajacej	serial

sub_40106C	proc near		; CODE XREF: DialogFunc+41p
		XOR	EDX, EDX
		mov	esi, offset String
		mov	edx, [esi+11h]
		mov	eax, [esi]
		bswap	eax
		add	eax, [esi+2]
		xor	eax, [esi+0Ah]
		bswap	eax
		sub	eax, [esi+6]
		bswap	eax
		xor	eax, [esi+1Ch]
		bswap	eax
		mov	[esi], eax
		add	eax, [esi+8]
		mov	ecx, [esi+14h]
		mov	dx, cx
		shr	ecx, 10h
		xor	cx, dx
		add	ecx, edx
		xor	edx, ecx
		bswap	edx
		add	dx, ax
		mov	[esi+0Ah], edx
		push	edx

loc_4010A8:				; CODE XREF: sub_40106C+54j
		push	eax
		cmp	ecx, 0
		jnz	short loc_4010B0
		mov	ecx, edx

loc_4010B0:				; CODE XREF: sub_40106C+40j
		cdq
		idiv	ecx
		pop	eax
		xor	eax, ecx
		add	eax, edx
		add	ecx, edx
		cmp	edx, 0EC5A7Dh
		ja	short loc_4010A8
		add	eax, [esi+0Ch]
		sub	eax, edx
		pop	edx
		add	eax, edx
		add	[esi+4], eax
		xor	ecx, ecx
		mov	edx, 10h

loc_4010D4:				; CODE XREF: sub_40106C+73j
		mov	al, [ecx+esi]
		xor	[edx+esi], al
		inc	ecx
		inc	edx
		cmp	ecx, 10h
		jnz	short loc_4010D4
		mov	eax, [esi]
		add	eax, [esi+10h]
		xor	[esi+20h], eax
		mov	edx, 5A7E4317h
		mov	ecx, 7

loc_4010F3:				; CODE XREF: sub_40106C+8Bj
		xor	[esi+ecx*4], edx
		dec	ecx
		jnz	short loc_4010F3
		xor	[esi+ecx*4], edx
		xor	ebx, ebx
		mov	eax, edx
		mov	ecx, 8
		push	edx
		imul	ecx
		xor	edx, edx
		pop	edx

loc_40110B:				; CODE XREF: sub_40106C+DDj
		add	eax, [esi+ecx*4]
		xor	ax, [esi+ecx*4]
		bswap	eax
		xor	eax, [esi+ecx*4]
		push	ecx
		movsx	ecx, byte ptr [esi+ecx*4]
		bswap	ecx
		shr	ecx, 18h
		add	ebx, ecx
		movsx	ecx, byte ptr [esi+ecx*4+1]
		bswap	ecx
		shr	ecx, 18h
		add	ebx, ecx
		movsx	ecx, byte ptr [esi+ecx*4+2]
		bswap	ecx
		shr	ecx, 18h
		add	ebx, ecx
		movsx	ecx, byte ptr [esi+ecx*4+3]
		bswap	ecx
		shr	ecx, 18h
		add	ebx, ecx
		pop	ecx
		dec	ecx
		jnz	short loc_40110B
		xor	eax, [esi+ecx*4]
		bswap	eax
		mov	ecx, 0Ch
		imul	ebx, ecx
		add	eax, ebx
		cmp	eax, 0CA6B8A50h
		jnz	short locret_40116B     ;skok BAD BOY
		cmp	bh, 6Ah
		jnz	short locret_40116B     ;skok BAD BOY
		add	edx, [esi+20h]
		call	edx                     ;skok pod adres w EDX do wyswietlenia MsgBox'a o poprawnym serialu

locret_40116B:				; CODE XREF: sub_40106C+F3j
					; sub_40106C+F8j
		retn			; KONIEC PROCKI	SPRAWDZAJACEJ SERIAL
sub_40106C	endp

;-----------------------------------------------------------------------------------


GREETS:
TeStON - cwaniaczku jeden ;-P
and ALL crackers