   Nazwa Progu	: Fightme 3.0 by JuBE
   Data        	: 28/08/2001
   Napisal   	: Kwasek ...::[ HTBteam ]::...
   Co        	: tutorial
   Skill	: Medium


No to zaczynamy odpalamy CrackMe zakladamy pulapke na Senddlgitemmessagea
i wciskamy tyle razy F10 az pojawi sie kod CrackMe (a bedzie tego sporo, najlepiej przez chwile
przytrzymac F10). Gdy dojdziesz juz do wlasciwego kodu zdejmij pulapke, zobaczysz cos takiego:


		push	offset unk_402137
		push	1F4h
		push	0Dh
		push	12Dh
		push	dword ptr [ebp+8]
		call	SendDlgItemMessageA
		cmp	eax, 0
		jz	loc_401617
		cmp	eax, 4			;Name musi miec min. 4 znaki
		jb	loc_401606
		push	offset unk_40232B
		push	1F4h
		push	0Dh
		push	12Eh
		push	dword ptr [ebp+8]
		call	SendDlgItemMessageA
		cmp	eax, 0
		jz	loc_401628
		mov	ds:dword_402533, eax
		mov	ecx, eax
		mov	edi, offset unk_40232B
		dec	edi
		xor	ebx, ebx

Tu sie prawie nic nie dzieje, sa pobierane kolejno name i serial.


		mov	al, [edi+ecx]
		cmp	al, 2Dh		;czy znakiem jest '-'
		jnz	short loc_4013A9
		inc	ebx

loc_4013A9:			
		loop	loc_4013A1
		cmp	ebx, 4		;czy sa 4 '-'
		jnz	loc_401639 ; skok zly serial

Ta procedurka sprawdza czy serial ma 4 myslinik jesli tak to Crackme skacze do 
nastepnych obliczen. No dobra zalozmy sobie jakis serial z czterema
myslnikiami np: 1212-3434-5656-7878-9090
Dalej kazdy czlon seriala jest sprawdzany czy jego znaki znajduja sie w granicach od 0 do 9.
Z tego wniosek ze serial sklada sie z samych cyfr. Nastepnie kazdy czlon zamieniany jest 
na wartos szesnastkowa, ktory zapisywany jest w oddzielnym miejscu. Po tych wszystkich zamianach
ujzymy taki kod:
	
		mov	eax, 1 czlon seriala
		mov	ebx, 3 czlon seriala
		add	eax, 1315BE1h
		xor	eax, ebx
		rol	eax, 3
		cmp	eax, 2 czlon seriala
		jnz	loc_401639		;skacz gdy zly serial

Nie radzilbym narazie zawracac sobie glowe tym kodem po prostu wpisz r fl z i analizuj kod dalej

		mov	eax, 1 czlon seriala
		add	eax, 2 czlon seriala
		rol	eax, 1
		add	eax, 3 czlon seriala
		rol	eax, 2
		xor	eax, 4 czlon seriala
		sub	eax, 5 czlon seriala

Tutaj sa obliczenia praktycznie na calym serialu. Wynik obliczen znajduje sie w rejestrze EAX.
Ta wartosc jest bardzo wazna, poniewaz przez nia jest xorowany spory kawalek kodu oto on:

			dd 987452BCh, 0FF4CC61Dh, 53510D38h, 98746208h,	8A011E1Dh
			dd 98707AA2h, 0C1D2F51Dh, 9E84E15h, 52514D1Ah, 0D8AACD02h
			dd 0EFEE4A68h, 33510D3Ch, 0EA999CEFh, 0EB9942DEh, 3FB30ADCh
			dd 67019D96h, 0D8116C2Ah, 6E84A96h, 525147A1h, 0D8AACD02h
			dd 0EFEE4A68h, 33510D3Ch, 0EA919CEFh, 0DA918CFEh, 18908C1Eh
			dd 9934E1Fh, 7B30AD7h, 0EB917E4Dh, 0EB987EC6h, 0EBAE7ECFh
			dd 830815EBh, 13621247h, 106A8F2Eh, 0D82CC812h,	19524D1Dh
			dd 0D83B3468h, 9849D175h, 0D024B21Dh, 0EDAE2B77h, 0D8116D1Dh
			dd 0D8550AF5h
			db  1Dh 
 
Gdy cale xorowanie dobiegnie konca CrackMe przechodzi przez ten kod jak przez kod assemblera.
Czyli ten kwalek kodu to nic innego jak zxorowane instukcje assemblera. I to jest najtrudniejsza
czesc CrackMe. Skad mamy wiedziec jakie autor ukryl instukcje assemblera. Mi sie jedna a nawet
wiecej udalo odgadnac. Otoz przeglodalem sobie resource CrackMe i znalazlem tam okienko z
gratulacjami, czyli w ktoryms miejscu kodu CrackMe musi byc wywolane to okienko. Jak myslicie
w jakim ?. No pewnie ze tak w tej zakodowanej. A jaka instukcja wywoluje to okienko?. Pierwsza na
mysl, ktora mi przyszla to Call DialogBoxParamA oczywiscie juz mozna sie domyslic ze przed tym
jest kilka instr. push. No dobra teraz zobaczmy jak wyglada wartosc Call DialogBoxParamA:
E8xxxx0000 gdzie xxxx to wartosc pokazujaca typ call'a np: Call DialogBoxParamA, Call MessageBoxA
 itd. jeszcze jedno wartosc xxxx jest np. pod adresem 00402120 inna niz np. pod adresem 00403000.
Czyli wartosc Call DialogBoxParamA jest inny niz Call DialogBoxParamA znajdujacy sie pod innym adresem
E8 i 0000 sa zawsze stale. No dobra mozemy przystapic do pisania bruteforce (doloczony jest do
tutoriala). Bedzie wygladal nastepujaca:
- ustaw licznik na 0
- xoruj kolejno kawalek kodu przez licznik
- szukaj bajtu o wartosci E8
- jesli znalazl to sprawdz czy 4 bajt jest rowny 00 jesli nie to zwieksz licznik i licz dalej
- sprawdz czy 5 bajt jest rowny 00 jesli nie to zwieksz licznik i licz dalej  
- powiadom o znalezionym kluczu (int 3)
Pamietaj bruteforce moze poszukac obojetnie jakiego call'a.
Dobra ustaw w SoftIce I3Here On odpal bruteforce i niestety sprawdzenie wszystkich kombinacji
trwalo bardzo, bardzo dlugo ale sie oplacalo poniewaz program znalazl wlasciwy klucz:
D8yyyy1d lub D8yyyyF2, yyyy zjaduje sie w granicach od 0 do ffff. Teraz ktory klucz jest prawdziwy
obydwa sprawdzilem i tym prawdziwym kluczem jest wartosc D8yyyy1d. Mozna sie nawet skapnac po tym
ze bruteforc znalazl po zxorowaniu z tym kluczem call'a dokladnie na koncu kodu. No dobra mamy
juz poprawny klucz, ale nie jest on pelny, musimy w jakis sposob znalezc te yyyy. Zobaczmy jak
xorowany jest ten call 	   xor	|E8xxxx00|00
						=to musi sie rownac F50A55D8
				|1DyyyyD8|1DyyyyD8

czyli zeby poznac yyyy musimy znac xxxx, a dokladniej jaki to jest typ call'a wspomnilem juz o tym.
Tak wiec zrob cos takiego: Wejdz do Crackme dostan sie do kodu, gdy dojdziesz do odxorowywania
procki zamien klucz na ten znaleziony czyli: D800001d. Po zxorowaniu sprawdz pod jakim adresem 
znajduje sie nasz ukochany call, a znajduje sie pod adresem 004015e3 zapamietaj go sobie.
Teraz rozpakuj Crackme ProcDump'em. Nastepnie wrzucamy go do HIEW i przechodzimy pod adres 
w ktorym wywolywany jest DialogBoxParamA ale Abouta najedz na tego Call'a znajduje sie on pod 
adresem 00401259 i wcisnij F3 Call DialogBoxParamA zmieni sie na cos takiego: Call 102f zapisz 
sobie to. Teraz skaczemy sobie pod adres 004015e3 czyli wywolanie naszego przypuszczalnego okna 
z gratulacjami, adresu tego niema wiec postaw w poblizu NOP'a teraz gdy widzisz adres 004015e3 
wcisnij F3 pozniej F2 i wpisz tam wartosc wczesniej spisana czyl call 102f. Mozesz to teraz 
zapisac F9 i ukaze nam sie w tym miejscu Call DialogBoxParamA czyli: E847040000 i teraz po 
zxorowaniu juz powinienes wiedziec z czym, znalezlismy poprawny klucz: 	
		E8470400		 ----------
	   xor  	=1d4d51d8=czyli  |D8514d1d|
		F50A55D8		 ----------

Teraz bardzo latwo mozesz zobaczyc jak wyglada odszyfrowana procka, jest tam mielony twoj
name i nastepnie wynik porownywany jest z 2 czesciami seriala. Teraz powinienes poradzic
sobie sam z odwroceniem tej procki, ktora jest bardzo latwa do odwrocenia. Jesli jednak cos ci
nie wychdzi w obliczeniu prawidlowego seriala, to pooglodaj sobie zrodelko keygena.  

			

 