______________________________________________________________________________________ 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 /
Scorpik