		     ___      ___           ___            ___
		    /  /     /__/       /---  /--         /  /
		   /  /     ___ ________--/  ---/_____   /  /
		  /  /----//  //  ___   \/  /   ___  /  /__/
		 / ---/  //  //  /  /  //  /   _____/_ ___
		/__/ /  //__//__/  /__//__//_________//__/
		    /  /
		   /__/   hinte@box43.gnet.pl

	[What..............................CrackMe 4 by LobiX]
	[Who broke.....................................hinte!] 

     	      SERIAL [ ]       CRACK [ ]       PATCH [ ]  
 	      KEYGEN [ ]      LOADER [ ]         TUT [x]

	To jest moj pierwszy tutor, sorki za bledy :)
	Wszelkie uwagi prosze przysylac moj e-mail

Tools:

- softice v4
- frogice v0.43 (wiadnomo po co :)
- masm32 (moze sie przydac :)

Zaczynamy:

	Ladujemy do pamieci SI, i uruchamiamy CrackMe4.exe
	jak widac, crackme sie nie uruchamia, a wiec odpalamy
	fploader.exe (fice), crackme i mamy blue screen, naciskamy
	't', i mamy nastepny bs, znowu 't', ok a wiec crackme sie
	odpalilo :), wpisujemy name i serial, ja wpisalem name:
	'HINTE!', a serial: '1234321' wciakamy (ctrl+d) i dajemy
	pulapke na GetDlgItemTextA, ctrl+d i klikamy 'OK', dobra
	progs sie zlapal, klikamy F12 i powinnismy sie sie znalesc
	mniej wiecej tutaj:

017F:1000105C  E8C5000000          CALL      USER32!GetDlgItemTextA
017F:10001061  59                  POP       ECX       <--- JESTESMY TU
017F:10001062  8D1D14300010        LEA       EBX,[10003014] <---NASZ NAME
017F:10001068  C9                  LEAVE
017F:10001069  C20400              RET       0004
...
017F:100010A3  3B054A300010        CMP       EAX,[1000304A]
------------------------------------CRCME4!.text+005C--------------------

	patrzymy uwaznie i widzimy ze nieznajdujemy sie CrackMe4.exe
	tylko w CRCME4.dll, dll-ka zawiera funkcej pobrania, msg i
	porownanie, reszta nas nie interesuje, idzemy F8 i mamy:

017F:0040100C  0BC0                OR        EAX,EAX <--- CZY COS WPISANE
017F:0040100E  753C                JNZ       0040104C <--- JESLI TAK TO SKACZE DALEJ
017F:00401010  EB17                JMP       00401029 <--- GOODBYE

	wykonujemy jnz 0040104C i widzimy:

017F:0040104E  8AC8                MOV       CL,AL <--- WRZUCA DO CL ILOSC BAJTOW NAME
017F:00401050  8BF3                MOV       ESI,EBX
017F:00401052  FF3524304000        PUSH      DWORD PTR [00403024] 
017F:00401058  E89F030000          CALL      004013FC 
017F:0040105D  38C8                CMP       AL,CL <--- CHYBA WIADOMO
017F:0040105F  7C0A                JL        0040106B <--- JESLI MNIEJSZE TO NARA

	po call 004013FC serial jest ebx (d ebx), w al dlugosc seriala
	dalej: 

017F:00401063  8BF8                MOV       EDI,EAX
017F:00401065  F7F1                DIV       ECX
017F:00401067  0BD2                OR        EDX,EDX
017F:00401069  7415                JZ        00401080 <--- MUSI ZAISTNIEC
017F:0040106B  E8A4030000          CALL      00401414 <--- BLEDNY MSG

	po div ecx, w eax mamy czesc calkowita a w edx reszte, z funkcji
	wynika ze edx musi byc = 0 czyli dlugosc serial to wielokrotnosc
	name, np. jesli name=6 zn. to serial=6,12,18 zn. (ogranicznie 20)
	skaczemy jz 00401080 i mamy:

017F:00401080  8BD7                MOV       EDX,EDI
017F:00401082  8AF1                MOV       DH,CL <--- DO DH DLUGOSC NAME
017F:00401084  0FB6CA              MOVZX     ECX,DL <--- DO ECX DLUGOSC SERIALU     
017F:00401087  8BEB                MOV       EBP,EBX <--- SERIAL DO EBP
017F:00401089  33FF                XOR       EDI,EDI 
017F:0040108B  807C29FF30          CMP       BYTE PTR [EBP+ECX-01],30 <---| 
017F:00401090  7CD9                JL        0040106B			  | 
017F:00401092  807C29FF39          CMP       BYTE PTR [EBP+ECX-01],39	  | 
017F:00401097  7FD2                JG        0040106B			  | PETLA
017F:00401099  33DB                XOR       EBX,EBX			  | 
017F:0040109B  0FB65C29FF          MOVZX     EBX,BYTE PTR [EBP+ECX-01]	  | 
017F:004010A0  83EB30              SUB       EBX,30			  | 
017F:004010A3  03FB                ADD       EDI,EBX			  | 
017F:004010A5  E0E4                LOOPNZ    0040108B <-------------------|

	a wiec w edi mamy sume znakow serial po odjeciu od nich 30h (np
	dla seriala 1234321 suma to: 1+2+3+4+3+2+1=10h), ostatnia cyfra
	musi byc rozn od 0 bo wtedy program nielizy sumy, a ona bedzie
	pozniej potrzebna, idziemy dalej:

017F:004010A7  0FB6CE              MOVZX     ECX,DH <--- DLUGOSC NAME
017F:004010AA  33C0                XOR       EAX,EAX
017F:004010AC  33DB                XOR       EBX,EBX <-------------------|
017F:004010AE  0FB65C31FF          MOVZX     EBX,BYTE PTR [ESI+ECX-01]   | PETLA
017F:004010B3  03C3                ADD       EAX,EBX	 		 |
017F:004010B5  E0F5                LOOPNZ    004010AC <------------------|
	
	ta petla zlicza sume bajtow name w eax, ale to oczywiste :)

017F:004010B7  8BD8                MOV       EBX,EAX
017F:004010B9  8BC7                MOV       EAX,EDI
017F:004010BB  8AE3                MOV       AH,BL <--- DO AH KONCOWKE SUMY NAME (B. WAZNE)
017F:004010BD  0FB6CA              MOVZX     ECX,DL <--- WIANOMO
017F:004010C0  8A4C29FF            MOV       CL,[EBP+ECX-01] <---| TO NIE PETLA, ALE OD SUMY
017F:004010C4  80E930              SUB       CL,30		 | BAJTOW SERIALA ODEJMUJE
017F:004010C7  2AC1                SUB       AL,CL		 | PIERWSZA I OSTATNIA LITERKE
017F:004010C9  8A6D00              MOV       CH,[EBP+00]	 | A WIEC PROGRAM LICZY TYLKO
017F:004010CC  80ED30              SUB       CH,30		 | SUME BAJTOW BEZ BAJTOW
017F:004010CF  2AC5                SUB       AL,CH <-------------| SKRAJNYCH :) I WWALA DO AL

	w cl mamy ostatnia cyfre passworda, a w ch pierwsza, potem:

017F:004010D1  660BC9              OR        CX,CX
017F:004010D4  7495                JZ        0040106B <--- NARA

	czyli cl niemoze byc rowne 0 (ostatnia cyfra po sub 30h, bo
	nieliczy wtedy sumy bajtow), a w ch mamy pierwsza cyferke ktora
	tez niemoze byc zero (or cx,cx) dalej jest najwazniejsza czesc
	kodu:

017F:004010D6  32E0                XOR       AH,AL <--- WAZNE !!!!
017F:004010D8  8AD0                MOV       DL,AL <--- DO DL SUMA SERIALA
...
017F:004010EE  E81B030000          CALL      0040140E <--- POROWNYWANIE EAX Z 0000CAFEh
017F:004010F3  0F8572FFFFFF        JNZ       0040106B <--- WIADOMO
017F:004010F9  FF3524304000        PUSH      DWORD PTR [00403024]
017F:004010FF  E804030000          CALL      00401408 <--- GOOD MESSAGE :)

	najwazniejsza i zarazem najtrudniesza czesc crackme (hmm.. jak ja
	to napisze? :), tu jest potrzebna suma seriala, w powownywaniu
	eax z 000cafeh musimy znalesc taka sume bajtow (i tu wlanie troche
	nie tak z progsem bo niemozna wpisac do name co sie chce), zeby
	po xorowaniu z al wyszlo nam w ah -> cah, a koncowka sumy name ma
	ma byc zblizona ale wieksza do cah np. dfh, e4h, bo w tedy suma
	bajtow seriala jets mala a to dlatego: np. jesli name ma 6 znakow
	to suma seriala wyniesie maxymalnie: 4*9 albo 10*9 albo 16*9 czyli
	maxymalnie c6h, ktos moze powiedziec ze duzo i mozna wpisac co sie
	chce, niestety nie, jak ktomus suma name wyjdzie 11h i co??? nieda
	sie wtedy do tego name wygenerowac seriala, spojrzmy na brakujaca
	czesc kodu czesc kodu: 

017F:004010DA  80E20F              AND       DL,0F 
017F:004010DD  80CA08              OR        DL,08
017F:004010E0  02D1                ADD       DL,CL <--- PIERWSZA LITERKA SERIALA (PO SUB 30h)
017F:004010E2  C0E204              SHL       DL,04
017F:004010E5  C0E804              SHR       AL,04
017F:004010E8  0C08                OR        AL,08
017F:004010EA  02C5                ADD       AL,CH <--- OSTATNIA   -//-
017F:004010EC  0AC2                OR        AL,DL <--- NAJGORSZE, PO TYM AL MUSI BYC ROWNE FEh

	i teraz zaczyna sie problem... jak to zrobic?? a wiec po wypiciu
	jednego browca odpalamy masm32 i piszemy:

---------------------------------<CUT HERE>-------------------------------
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib

.data
Msg      db "00",0

.code
start:

mov cx,00h
petla:
cmp cl,9h
jnz dodaj
	cmp ch,9h
	jz exit
add ch,1h
mov cl,-1h
dodaj:
add cl,1h

mov ah,xxh ;koncowka sumy bajtow (u mnie 99h)
mov al,yyh ;sume bajtow seriala (zeby po xor wyszlo cah) (u mnie ma byc 53h :)
	   ; to suem mozna obliczyn na kalkulatorze wingrozy znajac sume bajtoe name :)
xor ah,al
mov dl,al
and dl,0fh
or dl,08h
add dl,cl
shl dl,04h
shr al,04h
or al, 08h
add al,ch
or al, dl
cmp ax, 0cafeh
jnz petla

exit:
add cl, 30h
add ch, 30h
mov [Msg], ch
mov [Msg+1], cl

	invoke MessageBox, NULL,addr Msg, addr Msg, MB_OK
	invoke ExitProcess,NULL
end start
---------------------------------<CUT HERE>-------------------------------
	
	to jest taki maly generatorek mozliwosci, jedno zastzrenenie,
	jesli w msg wyswietli 99 tzn ze nieznalazl takich liczb i trzeba
	zmenic name :( no coz take juz jest te crcme, ale na ogol znajduje
	liczby :) pierwsza liczba w msg to pierwsza w serial a druga to
	ostatnia :) aaa i pamietajcie ze zadna z nich niemoze byc 0! 
	(dla mnie 199999999924) no i to by bylo na tyle... uffff ale sie
	rozpisalem, mysle ze kazdy znajdzie dla siebie s/n, jak cos to
	mail me :)




