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: