########################### Cracking Tutorial by ^Mateus^/AAOCG/ ################################

Helloooo

To jest moj pierwszy tutorial wiec jeszcze sie nie zdazylem wczuc :-)
Tak se pomyslalem ze Chendler ma tutora, CrossDresser ma tutora, lukep ma tutora, bede mial i ja!
Wlasnie tak powstal ten tootorial :>

#################################################################################################

Naszym celem jest Rusty CrAcKmE 2.0 /Win32 Console Mode/

#################################################################################################

Tools of the trade ktore musisz miec:

SoftICE lub Trw

#################################################################################################

OK let the mortal combat begin :P

Odpalamy proga i widzimy ze crackme jest consolowe. Ja sie zalamalem niewiem jak wy...
Nastepnego dnia obudzilem sie i stwierdzilem ze to sie musi dac zlamac :> so zajrzalem w exe
czy jest spakowany. Okazalo sie ze nie :) ale zauzazylem ze prog uzywa tych API z kernel32:

ExitProcess
GetStdHandle
WriteFile
ReadFile
SetConsoleMode

Napisow nie bylo widac poniewaz nasz kolega rusty zaszyfrowal je :) Tak mi sie przynajmniej
wydaje... Nie jestem za bardzo obeznany w programach consolowych bo nigdy takich nie pisalem
i dlatego zastanawialo mnie poco tam bylo WriteFile i ReadFile, czyzby byl jakis keyfile
do tego?? Stwierdzilem ze jest tylko jeden sposob zeby sie dowiedziec tj. odpalic trw i
zdebugowac proga od poczatku. Widzimy ze za kazdym razem przed wywolaniem WriteFile i
ReadFile prog pobiera StdHandle proga potrzebny do znanych nam 2 funkcji :> Przy pierwszym
wywolaniu WriteFile pomyslalem ze tym prog wypisuje tekst wiec wcisnalem F4 by zobaczyc czy cos
napisal ciekawego. Nic, pusto jak w glowie CrossDressera. Dobra lecimy dalej... Widzimy
nastepne wywolanie WriteFile, wciskamy F4 i naszym oczom ukazal sie napis :) Cool co?
Teraz wiemy po co jest WriteFile, zapewne ReadFile bedzie pobierac tekst wpisany przez usera.
Zeby sie dowiedziec lecimy dalej i okazalo sie ze miales racje :) Prog wywoluje ReadFile
2 razy bo mamy wpisac name i serial. Idziemy dalej az spotkamy taki kod:

0177:004010B1	MOV	ESI,004030B9		<------ tutaj offset do naszego name
0177:004010B6	XOR	EDX,EDX
0177:004010B8	LODSB				<------ skopiuj 1 bajt z [ESI] do AL
0177:004010B9	INC	DL			<------ zwieksz wskaznik do name o 1
0177:004010BB	NOT	AL			<------ jezeli wynik bedzie F2 to koniec name
0177:004010BD	MOV	[ESI-01],AL		<------ zastap zawartoscia AL 1 bajt name
0177:004010C0	CMP	AL,F2			<------ sprawdz czy koniec name
0177:004010B2	JNZ	004010B8		<------ jezeli nie to szukaj dalej

Wpisujemy w trw "d esi" i widzimy nasz name i widzimy 2 tajemnicze bajty na koncu,
tzn. 0D 0A. Pierwszy oznacza koniec wiersza a drugi mowi zeby przeniesc sie do nastepnego wiersza.
Wcisniecie ENTER powoduje wstawienie tych 2 znakow, bardzo dobrze znanych tym, ktorzy pisali
programy w asmie pod dos. Teraz nasz name jest zaszyfrowany. Pozniej mamy taki kod:

0177:004010C4	DEC	DL			<------ tutaj dlugosc naszego name
0177:004010C6	XOR	AL,F2			<------ wyzeruj AL
0177:004010C8	MOV	[ESI-01],AL		<------ zakoncz ciag zerem
0177:004010CB	MOV	[004031B9],DL		<------ zapisz do zmiennej dlugosc name
0177:004010D1	XOR	EDX,EDX
0177:004010D3	MOV	ESI,00403139		<------ zaladuj do esi wskaznik do seriala

Idziemy dalej i znajdujemy taki kod:

0177:00401016	LODSB
0177:00401017	INC	DL
0177:00401019	XOR	AL,80
0177:0040101B	MOV	[ESI-01],AL
0177:0040101E	CMP	AL,8D
0177:00401020	JNZ	00401016

0177:00401022	DEC	DL
0177:00401024	MOV	[004031BA],DL
0177:0040102A	XOR	AL,8D
0177:0040102C	MOV	[ESI-01],AL

Nie skomentowalem tych instrukcji poniewaz to samo jest na gorze i mozesz sie troche wysilic :>
Od myslenia glowa nie boli. Jezeli nie kumasz tego kodu to mozesz sie kogos spytac. OK idziemy
dalej, teraz dla odmiany mamy taki kod:

0177:004010F6	MOVZX	ECX,BYTE [004031BA]	<------ skopiuj do ECX dlugosc seriala
0177:004010FD	CMP	ECX, 1			<------ jezeli dlugosc seriala = 0
0177:00401100	JB	0040109E		<------ zakoncz dzialanie programu

0177:00401102	PUSH	DWORD 00401162		<------ adres procki konczacej program
0177:00401107	PUSH	DWORD 00401115		<------ adres procki sprawdzajacej serial
0177:0040110C	LOOP	00401107		<------ zaladuj ECX razy adres procki sprawdzajacej serial

0177:00401110	MOV	ESI,00403139		<------ zaladuj do esi wskaznik do seriala
0177:00401115	XOR	EAX,EAX
0177:00401117	LODSB
0177:00401118	CMP	AL,00			<------ jezeli koniec seriala
0177:0040111A	JZ	00401137		<------ skocz do nastepnej procki sprawdzajacej

0177:0040111C	SUB	AL,B0
0177:0040111E	CMP	AL,09			<------ sprawdz czy w AL znajduje sie cyfra
0177:00401120	JA	NEAR 0040109E		<------ jezeli nie to zakoncz program
0177:00401126	ADD	EDX,EAX			<------ zsumuj w EDX caly serial
0177:00401128	RET				<------ skocz ECX razy do procki sprawdzajacej serial a potem zakoncz proga

Jak widzimy serial musi skladac sie tylko z cyfr. Gdy program trafi na koniec seriala skacze do
tego kodu:

0177:00401137	MOV	[004031BB],DL		<------ zapisz w zmiennej sume cyfr seriala
0177:0040113D	MOV	EAX,EDX			<------ skopiuj do EAX ta sume
0177:0040113F	MOVZX	ECX,BYTE [004031BA]	<------ skopiuj do ECX dlugosc seriala
0177:00401146	XOR	EDX,EDX			<------ wyzeruj EDX
0177:00401148	DIV	ECX			<------ dzielenie sumy cyfr seriala przez dlugosc seriala
0177:0040114A	CMP	EDX,0			<------ jezeli jest reszta z dzielenia
0177:0040114D	JA	NEAR 0040109E		<------ zakoncz program
0177:00401153	RET				<------ skocz do nastepnej procki sprawdzajacej

A oto i ona:

0177:00401162	MOV	ESI,004030B9		<------ wskaznik do name
0177:00401167	XOR	EDX,EDX
0177:00401169	LODSB
0177:0040116A	CMP	AL,00
0177:0040116C	JZ	0040118C
0177:0040116E	ADD	DL,AL
0177:00401170	PUSH	DWORD 00401169
0177:00401175	RET

Tego tez nie bede opisywal jak nie kumasz tego to popatrz jak to bylo przy serialu. OK jak bedzie
koniec name to skoczy do takiego kodu: (chyba sie powtarzam :>)

0177:0040118C	MOV	AL,[004031B9]		<------ skopiuj do AL dlugosc name
0177:00401191	XOR	DL,AL			<------ sxoruj to co zostalo w DL z dlugoscia name
0177:00401193	CMP	DL,[004031BB]		<------ jezeli DL = sumie cyfr seriala
0177:00401199	JZ	004011D0		<------ to good boy

0177:0040119B	MOVZX	EAX,DL			<------ skopiuj do EAX to co zostalo w DL
0177:0040119E	XOR 	EDX,EDX
0177:004011A0	MOV	ECX,02			<------ ustaw dzielnik
0177:004011A5	DIV	ECX			<------ podziel dlugosc name przez 2
0177:004011A7	CMP	AL,[004031BB]		<------ wynik dzielenia rowny sumie cyfr seriala?
0177:004011AD	JZ	004011D0		<------ jak tak to good boy
0177:004011AF	INC	AL			<------ zwieksz AL o 1
0177:004011B1	CMP	AL,[004031BB]		<------ jezeli AL rowne sumie cyfr seriala
0177:004011B7	JZ	004011D0		<------ to good boy
0177:004011B9	PUSH	DWORD 0040109E		<------ adres procki zakanczajacej proga
0177:004011BE	RET				<------ zakoncz proga

OK, teraz musimy wygenerowac poprawny serial. Sprawdzilem ile znakow moze miec serial i jak
wpisze wiecej niz 15 to crackme sie zawiesza :) Widzimy ze program porownuje sxorowana sume name
z suma cyfr seriala, jezeli sa rowne to prog zarejestrowany. Jezeli bysmy wpisali dobry serial
dla naszego name to suma cyfr seriala byla by rowna name wiec jush cos wiemy :) Crackme generuje
3 liczby na wszelki wypadek jak by ktoras byla liczba pierwsza to jedna z nich nie powinna byc.
Dla mojej xywy tj. pReJkEr (bo ^Mateus^ ma za duze liczby :) hex value tych 3 liczb to w
kolejnosci: 61 30 31. Bierzemy sobie liczbe 30. 30h = 48d. Wiec jezeli podzielimy 48 przez np 8
to wyjdzie nam ilosc cyfr naszego seriala. Czyli 48 : 8 = 6. Wiemy jush ze serial bedzie skladal
sie z 6 cyfr. Cyfra ta jest nasz dzielnik. Nasz serial to 888888. Jezeli dzielimy to wynik musi
byc bez reszty. Gdybysmy podzielili 48 : 6 = 8 to by nam wyszedl tez prawidlowy serial
- 88888888. Moglibysmy powybierac rozne liczby do seriala ale poco taki jest latwiej wpisac i
mniej roboty.. :) No to chyba wszystko na dzis moze jak kiedys bede mial natchnienie to
napisze nastepny tutorial :)

#################################################################################################

Kontakt ze mna:
ICQ UIN - 52819897
E-Mail: mateus@multicon.pl
AAOCG HomePage: http://www.aaocg.prv.pl

#################################################################################################

Special Thanks to: IMMORtAL [immy] :)
Greetz to: AAOCG, CookieCrk, CrackPL, ACG, SeveN TeaM, UFO Crew, GANG, And of coz to YOU! :-)

#################################################################################################