LEKCJA14(4).TXT

(9 KB) Pobierz
______________________________________________________________________________________

				    Tutorial by:
______________________________________________________________________________________
         		     ___      ___           ___            ___
         		    /  /     /__/       /---  /--         /  /
         		   /  /     ___ ________--/  ---/_____   /  /
         		  /  /----//  //  ___   \/  /   ___  /  /__/
         		 / ---/  //  //  /  /  //  /   _____/_ ___
        		/__/ /  //__//__/  /__//__//_________//__/
        		    /  /
        		   /__/   hinte@box43.pl
______________________________________________________________________________________

					Done for:
______________________________________________________________________________________
				   __   __  ____  _____ 
				  / /  / / / __/ / ___/
				 / /  / / / /    \ \
				/ /__/ / / /__  __\ \
			       /______/ /____/ /____/ 
______________________________________________________________________________________
		
			Lekcja XIV - "Techniki pisania keygenow" 
______________________________________________________________________________________

		Spis tresci:

			1. Co to jest keygen?
			2. Rodzaje keygenow
			3. Od czego zaczac pisanie
			4. Czy zawsze da sie napisac?
			5. Keygen do WinZip'a

ooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOooooo
1. Co to jest keygen?
ooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOooooo

	A wiec zaczynamy: keygen to taki malutki < lecz niezawsze ;> programik
	dzieki ktoremu mozemy zajestrowac wybrany program, na dowolnie wybrane
	dane. "Dowolnie" to zbyt swobodnie powiedziane, poniewaz niektore pro-
	gramy posiadaja jakies specyficzne wlasciwosci doboru name, np dlugosc
	name,  wielkie litery, brak cyfr itp.  Kazdy raczej widzial keygena na
	oczy, wiec niema sie co tu bardzo rozpisywac. Przejdzmy dalej.

ooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOooooo
2. Rodzaje keygenow
ooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOooooo

	Ja dziele sobiwe keygeny na 3 glowne gropy gdzie wynikiem jest:

	a) serial
	b) key-file
	c) odpowiedni wpis w rejestrze

	oczywiscie do kazdego mozna doliczyc wpisywanie name,company, numer ID
	i tego podobne rzeczy.  Z tymi mozliwosciami chyba sie kazdy z was tez
	sie juz wczesniej zetknol. Ja dodatkowo do wszystkich tych 3 rodzajuw,
	wliczam 2 podgrupy: keygeny kopiowane i keygeny na myslenie ;).  W tym
	pierwszym przypadku chodzi o to ze nasz keygen jest dokladnym odwzoro-
	waniem procki generujacej serial z naszego ukochanego programu.  Nato-
	miast ta druga grupa jest juz trudniejsza, tutaj wane jest zrozumienie
	kodu, musimy wnikac <czasem bardzo dlugo> co robi prog, a potem trzeba
	to jakos odwrocic. czasem to zawodzi bo jesli w procce jest zagmatfany
	algorytm,  a wystarczy zmienic jeden bajt to prosciej  go zmienic niz,
	tracic tygodnei na zlamanie,  chociaz niewolno sie za szybko poddawac.
	Tutaj jeszcze musze wspomniec  o jednej grupie keygenow,  ktorej wyzej
	niewymienilem a mianowicie:

	d) keygeny stale

	posiadaja one wpisane konkretne wartosci liczb, najczesciej sa w jakis
	tablicach i keygen wybiera je losow. Czyli nasz program ma,  powiedzmy
	100 seriali i my piszemy keygena  ktory w danej chwili, wybiera  tylko
	1 serial i go nam wyswietla, sa to tak zwane <w/g mnie> pseudo keygeny
	bo niema w nich zadnej generacji tylko procka wyswietlajaca przypadko-
	wy serial. Jednakze i do tych keygenow mozna zaliczyc jedna podgrupe -
	keygeny nieodwracalne. Np nasz progs ma znowu np 100 sriali ale, jesli
	wpisujemy serial, to prog przepuszcza go przez jakis algorytm  szyfru-
	jacy <np MD5> i porownuje tylko wynik a nie sam serial. W takiej sytu-
	acji nieda sienapisac keygena. Owszem autor programu moze sobie go na-
	pisac bo zna seriale i zna wyniki... niestety nam zastaje tylko zmiana
	bajtow w programie. To tyle o rodzajach keygenow.

ooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOooooo
3. Od czego zaczac pisanie
ooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOooooo

	Wszystko opisuje  na swoim przykladzie, nie  musisz robic identycznie,
	ale mozesz sie sugerowac wskzuwkami. Zanim zaczne pisac keygena,  wra-
	cam do  punktu drugiego,  czyli identyfikuje procke  zabezpieczajaca w
	programie. Kaygena zaczynam pisac od szkieletu, po stwierdzeniu do ja-
	kiej nalezy grupy i podgrupy. Jesli jest to keygen kopiowany, to zapi-
	suje sobie malutki obraz procki <co ona robi>, poniewaz np delphi  po-
	trafi jednym call'em na 200 stron usuwac bajt z danego ciagu. Po tymch
	ogledzinach albo kopiuje zywcem kod, lub go lekko modyfikuje, zeby byl
	mniejszy <w bajtach> i sprawdzam czy dziala poprawnie. Jesli natomiast
	procka wymaga pomyslenia i odwrocenia, najpierw kalkuluje ile mi czasu
	zajmie jej odwrocenie a pozniej napisanie. Jesli czas ten jest niezbyt
	proporcjonalny do czasu wolnego jaki posiadamy, to rezygnuje z keygena
	i pisze cracka. Jeli czasu mma duzo i spore mozliwosci to pisze keyge-
	na. Jednak czasem  oblczenia szacunkowe  <bo tak powinnismy je nazwac>
	okaza sie blaede, i odwroecnie zajmie nam o wiel wiecej czasu, i jesli
	program nieda sie scrackowac <np jest spakowany> to taki moj  projeket
	laduej w koszu. Zadko kiedy wracam do takich projektow. Polowa progsow
	dostepnych na rynku jest calkowicie kopiowalna jesli chodzi o kod, ale
	sa i takie gdzie trzeba pomyslie a i niebrakuje tych ktorych nieda sie
	odwrocic. Jesli juz wiesz,  ze dana procke da sie odwrocic,  to prawie
	masz juz napisanego keygena, jeszcz tylko pare screendump'ow, lub copy
	kod z IDA,  do tego jeszcze jakies ladne opakowanie, w postaci okienka
	dailogowego <win32> i masz swaja produkcje.

ooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOooooo
4. Czy zawsze da sie napisac?
ooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOooooo
	
	Nie. Mimo to,  ze procka jest odwracalna.  Niektore algorytmy dzialaja
	na tak wielkich liczbach, ze zeby to mogl policzyc nasz procek w takim
	czasie <np 1/2 h - zachaczam juz chyba o bruta>  w jakim by sie nam to
	oplacalo to muslilby miec czestotliwosc nieosiagalna przez jakies ~100
	lat!! tak tak to nie jest straszne ani dziwne, poprostu liczby  sa tak
	duze ze ciezko by bylo je zapisac w jednej linijce kartki zeszytu. RSA
	jets przykladem takeigo algorytmu. Mozna go odwrocic znajc liczby p, q
	ale nieche juz tu mowic o takich algorytmach,  bo ja sam za to sie nie
	biore. Chce tylko wspomniec ze tylko jest cos takiego.

ooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOooooo
5. Keygen do WinZip'a
ooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOoooooOooooo

	Wiem, ze to co opisalem dotychczas to jes malo, ale cos juz zrobic mo-
	zna. Na poczatek proponuje keygen do WinZip 8. Nieopisze tutaj calosci
	tutka jak to zlamac,  lecz przedstawie kawalki kodu z opisami.  WinZip 
	nalezy do kaygenow typu "serial" i do podgrupy "kopiowane", wiec niema
	z nim zbytniego problemu, a takze kodu jest niewiele ;)

	Najpierw lukamy prog, i widzimy, ze dla okresonego name generuje staly
	serial. Wiec mozna sie pokuusic o keygena. Zauwaamy tez ze liczba jest
	<liczba - serial> jest odwzorowaniem wartosci rejestru  <eax bodajrze>
	i jako serial zawiera 8 znakow z przeiali 0..9 i A..F no to screendump
	w najbardziej wykonywanym kodzie i lekka przerobka:


	xor	eax,eax
	xor	ebx,ebx
	xor	edi,edi
	xor	edx,edx
	mov	ecx, offset _name	; _name to bufor na nasz name

	mov	dl,[ecx]
	mov	esi,ecx

@00407B5A:
	test	dl,dl
	jz	@00407B6E		; czy juz wszystkie znaki name?
	movzx	dx,dl			; dx = dl
	imul	edx,edi
	add	ebx,edx	
	mov	dl,[esi+1]		; kolejny znak <do testowania>
	inc	edi
	inc	esi
	jmp	@00407B5A

@00407B6E:
	mov	esi,ecx
	mov	cl,[ecx]

@00407B7C:
	test	cl,cl
	jz	@00407B99		; czy juz ostatni bajt?
	movzx	cx,cl			; cx=cl
	call	@00407BB9
	mov	cl,[esi+1]
	inc	esi
	jmp	@00407B7C

@00407B99:
	add	eax,63h
	movzx	eax,ax
	rol	eax,16
	mov	ax,bx

	tego kawalka kodu, w WinZip'ie chyba nieda sie niezauwazyc ;)  jeszcze
	tylko przerobka tego call'a


@00407BB9	proc

	push	esi
	rol	ecx,8
	push	8
	pop	edx

@00407BC8:
	mov	esi,eax
	xor	esi,ecx
	test	si,8000h
	jz	@00407BDA
	add	eax,eax			; = shl eax,1
	xor	ax,1021h
	jmp	@00407BDC

@00407BDA:
	shl	eax,1			; eax = eax*2

@00407BDC:
	shl	ecx,1
	dec	edx
	jnz	@00407BC8
	pop	edi
        ret
@00407BB9	endp

	no i mamy wszystko <w razie jakis pomylem piszcie od mnie>. Na koncu w
	EAX mamy liczbe ktora trzeba zamienic na serial, mozna to zrobic  tak:

	mov	edi, offset _serial
	push	eax
	push	offset _x		; _x db '%X',0
	push	edi			; mijesce na serial <9 dup (0)>
	call	wsprintfA
	add	esp,3*4			; przywracanie stosu

	cmp	al,8			; czy dlugosc znakow seriala to 8?
	jz	@ok			; jesli nie to trzeba to uzupelnic '0'

	push	8
	pop	ecx			; ecx = 8
	sub	ecx,eax			; ile zer dopisac z przodu

	push	ecx			; zapisz ilosc dopisu
	push	edi			; edi = offse _serial
	mov	ecx,eax			; ile bajtow ma ciag
	mov	esi,edi			; esi = offset _serial
	add	edi,8			; edi = offset _serial + 8
	add	esi,eax			; esi = offset _serial + sizeof _serial

@przepisz:
	dec	edi
	dec	esi
	mov	al,[esi]
	mo	[edi],al
	loop	@przepisz
	pop	edi			; = offset _serial
	pop	ecx			; zdejmij ilosc dopisu
	mov	al,30h
	rep	stosb			; dopisz
@ok:

	i tu wyswietlam ciag w EDIT ;) to by bylo chyab na tyle
							hinte!^2oo1 / UCS /


Zgłoś jeśli naruszono regulamin