Cel	:Ultra Zip Password Cracker
Opis	:Suy do znajdywania hase w zaszyfrowanych archiwach ZIP
URL	:http://members.xoom.com/m53group
Tools	:SoftIce

Program w wersji niezarejestrowanej umoliwia szukanie hase tylko
o dugoci mniejszej od 6 znakw, nie umoliwia szukania hase korzystajc
ze sw slownika w odwrotnej kolejnoci liter.Trzeba temu zaradzi...

1.Program umoliwia zarejestrowanie.Po wpisaniu jakichkolwiek danych
wyskakuje MessageBoxA z textem, e wprowadzilimy bdny serial
Szukanie cigu o niepoprawnym serialu w W32dsm nie ma sensu, chyba
,e najpierw rozpakujemy gwnego exe-ka :P.Ok, zakadamy puapk
bpx GetDlgItemTextA, wprowadzamy kolejny raz dane, klikamy OK po
przejciu wywoa GetDlgItemTextA, jestemy na miejscu:

mov	eax,00701ACCh
mov	edx,00701BCCh
mov	ebx,0161E84Ch	; wartoci potrzebne do obliczenia offsetu
sub	ebx,00F42400h	; funkcji sprawdzajcej
call	ebx		; procedura sprawdzajaca poprawnosc seriala
test	eax,eax		; jeeli w eax zwrcone jest 0 serial jest OK
jnz	zy_serial

mov	eax,offset szThanksForSupport	; to raczej moja interpretacja
jmp	over_it				; kodu, ale mniej wicej tak to
mov	eax,offset szWrongBytes		; wyglda...
over_it:
push	...
push	...
push	eax
push	...
call	ebx				;w ebx adres MessageBoxA

2.Warto lookn co znajduje si za call ebx, wic F8 i widzimy kod:

...
lea	eax,dword ptr[ebp-50]	; gdzie bdzie zapisany klucz
lea	edx,dword ptr[ebp-40]	; nasze dane, mianowicie imi
call	006DC4B4h		; procedura tworzenia klucza
mov	esi,006E6124h		; poprawny klucz dla naszego imienia
mov	edi,dword ptr[ebp-50]	; wygenerowany dla naszego seriala
mov	ecx,200h		; max. moliwa dugo klucza
@check_loop:			; ptla porwnujca oba klucze
mov	eax,[esi]		; kolejne fragmenty klucza do eax
cmp	eax,[edi]		; eax porwnywane z [edi]
jne	@exit_proc		; jeeli si rni to wyjd
mov	edx,[esi+4]
cmp	edx,[edi+4]
jne	@exit_proc
mov	eax,[esi+8]
cmp	eax,[edi+8]
jne	@exit_proc
mov	edx,[esi+0Ch]
cmp	edx,[edi+0Ch]		; jeeli fragment ten zgadza si
je	@serial_is_correct	; wyjd z procedury z wyzerowanym eax
add	esi,10h			; zwiksz adres gdzie jest przechowywany jeden z kluczy
dec	ecx			; zmniejsz licznik ptli
jne	@check_loop		; jeeli ecx nie osigno zera kontynuuj sprawdzanie
@exit_proc:
mov	eax,1			; ustaw eax na 1
@after_flag:
pop	edi			; mieci
pop	esi
pop	ecx
pop	ebx
leave
ret				; wyjcie z procedury
@serial_is_correct:
xor	eax,eax			; zeruj eax
jmp	@after_flag		; wyjd z procedury

3.Program generuje 2 klucze, jeden z naszego imienia a drugi z naszego
wprowadzonego seriala.Gdy klucze si zgadzaj program grzecznie mwi
nam, twj serial jest OK.Klucze s generowane wg."troszk" zakrconych
algorytmw, mona si bawi w szukanie poprawnego seriala, ale mona
te w znacznie szybszy sposb sprawi aby program zaakceptowa nasz
dowolny serial.Hmm, tylko jak skoro exek jest spakowany, patchowanie
bezporednie wychodzi wic z gry.Ano mona programik patchn w pamici
, ale wie si z tym jeden may kopot, mianowicie nie moe to by
tradycyjny loader, a czemu nie?Poniewa taki loader(jak ja to nazywam)
najpierw tworzy proces danego programu, nastpnie czeka a system
zaaduje go do pamici, i kiedy system mwi:OK zaadowaem kod programu
pod okrelony adres, loader patchuje wtedy odpowiednie bajty programu.
Ale nasz exek jest spakowany, gdy spatchujemy okrelone bajty pod
okrelonym adresem w praktyce spatchujemy spakowany/zabezpieczony
kod a nie orginalne bajty.Program musi wic by cakowicie odbezpieczony
aby mona byo patchowa w pamici.W przypadku UZPC patch musi
by aplikowany co start programu, wiem jest to troch niewygodne i
niektrzy pomyl sobie na cholere takie rozwizanie?Mwi, nigdy
nie wiadomo co nas spotka i moe wtedy wanie takie nietypowe metody
potrzebne bd aby "pokona" program.
4.Patchowanie
Program akceptuje rejestracj jeeli oba klucze s takie same, wic
trzeba tak "zaczarowa" jak mawia moja babka z maty, aby porwnywane
byy dwa takie same klucze:

lea	eax,dword ptr[ebp-50]	; gdzie bdzie zapisany klucz
lea	edx,dword ptr[ebp-40]	; nasze dane, mianowicie imi
call	006DC4B4h		; procedura tworzenia klucza

mov	esi,006E6124h		<--esi wskazuje klucz orgina
mov	edi,dword ptr[ebp-50]	<--edi 2 klucz

patch

mov	esi,006E6124h		<--esi wskazuje klucz orgina
lea	edi,[esi]		<--edi=esi a wic wskazuje take klucz orgina
nop				<--rwnanie bajtw

Po takich zmianach(w pamici) program daje korzysta ze wszystkich
swoich moliwoci!

Pozdrowienia
bart

wojcikb@192.168.1.1
