Data : 1998.09.16 ; Bielsko-Biala
Yoo ! poczatkujacy crackerzy (jesli to czytasz to pewnie nim jestes) !Zdecydowalem sie napisac to FAQ ze wzgledu na to ze o crackingu nikt nic nie pisze (Po polsku of coz) , po (do tej pory kiedy to pisze) polsku widzialem tylko jednego zina - crcpl. Wszystko jest o hacking i prhreaking - W szczegolnosci ten drugi temat zostal juz wyczerpany.
Przydalo by sie stworzyc kanal na IRC dla crackerow, myslalem ze jest taki odpowiednik #hackpl = #crackpl, ...ale tam chyba nikt nie uczeszcza ???
Ten FAQ zawiera tylko najbardziej podstawowe podstawy wiec jesli chcesz sie jeszcze doksztalcac musisz zdobyc inne FAQ (niestety teraz sa tylko angielskie!).
Wiec kilka podstaw i co musisz umiec aby zostac crackerem :
Pamietaj! : Praktyka czyni mistrza ... im wiecej bedziesz crackowal tym wiekszej nabierzesz wprawy ... wiec proboj SAM zarejestrowac kazdy shareware'owy program który ci sie nawinie ... Sa tez programy "crack-me" ktore same w sobie zawieraja zabezpieczenie i sa specjalnie przeznaczone dla crackerow !
cracking.home.ml.org - strona zawierajaca najwiecej FAQ (oczywiscie po angielsku), debuggery, disassemblery, HEX-edytory i inne ciekawe rzeczy
heh...wiecej nie znam wiec jesli znasz jakies ciekawe adresy to czym predzej przysylaj maila...
Polecam inne FAQ o crackingu (Angielskie) np. +OCR , joe crackbook , JOSHi i jeszcze kilka innych
Dobra to wystarczy na poczatek. Wiem ze malo ... ale nie mam duzo czasu ... mam nadzieje ze zmobilizuje innych polskich crackerow do pisania swoich FAQ :) ! (moglby tez ktos napisac cos o Virii :))
Jesli sa bledy to wybaczcie - pisalem to chyba zbyt szybko...
A teraz (prawie doslowne) tlumaczenie znakomitego FAQ dla poczatkujacych ED!SON-a. |Jesli znasz angielski to nie czytaj dalej tylko zdobadz oryginalne FAQ - poniewaz (prawdopodone) moglem cos spieprzyc w tlumaczeniu moje "wstawki" oznaczylem (= ... =).
UWAGA - text probowalem napisac lopatologicznie wiec jesli masz jakies pojecie to przynajmniej nie czytaj dopiskow (=...=) ... bo mi wstyd :) Jesli uwazasz ze FAQ jest do dupy to go nie czytaj.
Jesli zrobisz sobie krzywde wykorzystujac materialy tu zawarte - nie miej do mnie pretensji.
Mozesz (Musisz :)) KOPIOWAC to FAQ dla kogokolwiek i czegokolwiek ! Tylko nie zmieniajac jego tresci !!!!!
I oczywiscie ... WIELKIE podziekowania dla Huffyk-a
A teraz tlumaczenie...
No wiec zaczynamy...
Lamanie (=Cracking=) programu Windows-owego (=czyt. SHIT-owego - dalej bede uzywal tej nazwy=) jest najczesciej prostsze niz DOS-owego.
W SHIT95 ukrycie czegokolwiek przed kims kto naprawde szuka informacji jest bardzo trudne, tak dlugo az wewnetrzne funkcje SHIT95 sa uzywane.
Pierwszym (i czesto jedynym) narzedziem który potrzebujesz jest SoftICE/Win 2.oo, Znakomity debugger od NuMega. Niektorzy ludzie mysla ze jest toporny w uzyciu, ale ja Ci powiem jak efektywnie debbugowac w nim, i mam nadzieje ze mnie zrozumiesz :-) . Zrobilem dodatek (A) z malym info do SoftICE/Win 2.oo ktore powinienes przeczytac. Nigdy nie mialem problemow instalujac SoftICE, wiec jesli jakies masz, musze skierowac do instrukcji obslugi.
URL-e do calego SOFT-u który potrzebujesz jest w dodatku (C).- ED!SON, edison@ccnux.utm.my
Oto dosc kiepski wglad na to co widzisz na ekranie w SOFTICE:
|--------------------| | Rejestry | Nacisnij 'R' aby edytowac |--------------------| | Okno z danymi | Nacisnij 'D' aby zobaczyc adres, 'E' aby edytowac |--------------------| | Okno instrukcji | Nacisnij 'U' aby zobaczyc adres, 'A' aby napisac kod ASM |--------------------| | Okno komend | Tu wprowadzasz komendy |--------------------|
Inne wazne przyciski to (w standardowym ustawieniu)
'H'/F1 - Pomoc Ctr+D/F5 - Pokazanie SoftICE F8 - wchodzenie w funkcje F10 - chodzenie ponad funkcjami F11 - wychodzenie z funkcji
3. Znajdowanie numerów rejestracyjnych
To jest prawdopodobnie najprostsza droga do praktyki, wziac program shareware i sprobowac go zarejestrowac.
3.1 Task Lock 3.00 - Proste zabezpieczenie - sam numer rejestracyjny
To jest proste zabezpieczenie, tylko numer rejestracyjny, który wogole sie nie zmienia
3.1.1 Badanie programu
Program jest 16 czy 32 bitowy? gdzie wpisujemy informacje rejestracyjne? Czy 'pomoc programu' daje jakis slad jak dziala rejestracja? Dowiedz sie tego zanim bedziesz kontynulowal! ....Teraz powinienes sprawdzac!...sprawdzasz?...sprawdziles?...OK, teraz wiesz ze jest to 32-bitowa aplikacja pod SHIT95, i to ze mozesz zarejestrowac program wpisujac pojedynczy numer rejestracyjny w oknie dialogowym ktore pojawia sie kiedy wybierzesz z menu "Register|Register...". Dowiedziales sie takze czytajac Help-a, ze sa 2 sposoby rejestracji: Indywidualna i przez siec. Wiec najprawdopodobniej beda 2 sprawdzenia czy wprowadziles prawidlowy kod.
3.1.2 "Sledzenie" kodu
Seriale (=czyli numery rejestracyjne=) sa przewaznie wpisywane w normalnych oknach dialogowych SHITA95.
Aby sprawdzic kod, program musi przeczytac zawartosc okna dialogowego uzywajac jednej z tych funkcji:
16-bitowe 32-bitowe ----- ----- GetWindowText GetWindowTextA, GetWindowTextW GetDlgItemText GetDlgItemTextA, GetDlgItemTextW
Ostatnia litera 32-bitowych funkcji oznacza ze funkcja uzywa jedno-bajtowych (=..extA=) lub dwu-bajtowych (=..extW=) lancuchow znakow. Dwu-bajtowe sa RZADKIE. Moze zastosujesz moja mysl... "Gdybym tylko mogl przerwac program gdy wywola funkcje GetWindowText" i - mozesz! Ale najpierw musisz sie upewnic ze te symbole so aktualnie zaladowane przez Softice (Zobacz dodatek A).
Aby ustawic "pulapke" (nazywa sie to punkt kontrolny) (=ang. Breakpoint - najlepiej uzywac tej nazwy=) najpierw uaktywnij Debuggera (=Softice=) wciskajac Ctrl+D, potem uzyj komendy BPX z nazwa funkcji albo adresem pamieci. Task Lock jest 32-bitowy wiec postawmy breakpoint na GetWindowTextA. Jesli to nie zadziala, wtedy sprobojemy innych. Wprowadz to w Softice (=w Command line - czyli najnizsze okno=):
:bpx getwindowtexta
Jesli dostales wiadomosc o bledzie np. "No LDT", upewnij sie ze nie masz uruchomionych zadnych innych aplikacji w tle. Zauwazylem ze Norton Commander lub DOS przeszkadza tej funkcji. Mozesz sprawdzic czy masz ustawione jakies Breakpoint-y wyswietlajac liste breakpoint-ow:
:bl
Komenda da ci cos w tym stylu:
00) BPX USER32!GetWindowTextA C=01
Aby wyjsc z softice (=Oczywiscie softice bedzie dalej w pamieci=), nacisnij Ctrl+D znowu
Dobra, masz ustawiony breakpoint który wykryje kazde wywolanie funkcji GetWindowTextA (=funkcji uzywaja tylko programy napisane dla SHIT95=).
Teraz (=Oczywiscie po uruchomieniu Task Lock 3.00=) wpisz dowolna wartosc w polu gdzie masz wpisac numer rejestracyjny i wcisnij OK... Nacisnales OK... i co?... dostales tylko glupia wiadomosc ze twoj numer byl zly. Wiec to nie bylo GetWindowTextA (=w innym programie moze byc to akurat ta funkcja=).
Sprobojmy GetDlgItemTextA. Wiec usuwamy stary breakpoint (=nie koniecznie=):
:bc 0
(0 oznacza numer breakpoint-u na liscie breakpoint-ow)
Teraz ustawiamy nowy breakpoint:
:bpx getdlgitemtexta
i probujemy wpisac serial-a od nowa...
(=Probuj funkcji :
GetDlgItemText GetDlgItemTextA GetDlgItemTextW GetWindowText GetWindowTextA GetWindowTextW GetDlgItemInt=)
3.1.3 w srodku Debugger-a
Wow! Zadzialalo! (=???=) Jestes teraz wewnatrz softice, w miejcsu gdzie funkcja GetDlgItemTextA sie zaczyna. Aby przeskoczyc w miejsce skadkolwiek ta funkcja zostala wywolana, nacisnij F11. Teraz jestes wewnatrz SGLSET.EXE, jesli nie jestes pewien,zobacz na linie pomiedzy oknem instrukcji a oknem gdzie wpisujesz komendy, powinienes zobaczyc cos takiego:
---------SGLSET!.text+1B13---------
Mozesz teraz wylaczyc breakpoint wpisujac:
:bd 0
Kiedy bedziesz chcial uaktywnic ten breakpoint pózniej wpiszesz:
:be 0
pierwsza linia w oknie instrukcji wyglada tak:
CALL [USER32!GetDlgItemTextA]
Aby zobaczyc linie ktore sa wyzej, wciskaj pare razy Ctrl+strzalka w gore, dopoki nie zobaczysz ponizszych lini. Jesli nie wiesz nic o Assemblerze (=To po co to czytasz??? :) =), zamiescilem komentarze do tych lini.
RET ;Koniec funkcji PUSH EBP ;Poczatek funkcji MOV EBP,ESP ;... SUB ESP,0000009C ;... PUSH ESI ;... > LEA EAX,[EBP-34] ;EAX=EBP-34 PUSH EDI ;... MOVE ESI,ECX ;... PUSH 32 ;Zapisuje: Maxymalny rozmiar ciagu znakow (=stringu=) > PUSH EAX ;Zapisuje: Adres bufora textowego PUSH 000003F4 ;Zapisuje: Identyfikator kontroli PUSH DWORD PTR [ESI+1C] ;Zapisuje: Uchwyt do okna dialogowego CALL [USER32!GetDlgItemTextA] ;Pobiera text
Komendy PUSH oznaczja zapisanie wartosci do pozniejszego uzycia.
Zaznaczylem wazne linie znakiem '>'. Patrzac na kod widzimy ze adres do bufora textowego jest trzymany w EAX, i EAX to bylo EBP-34. Wiec patrzymy na EBP-34 tak:
:d ebp-34
Teraz powinienes moc przeczytac to co wpisales w oknie danych. Teraz musimy znalezc miejsce gdzie twoj serial jest porownywany z prawdziwym. Wiec wykonujemy kilka instrukcji wciskajac kilka razy F10 dopoki nie znajdziemy czegos o EBP-34... Nie bedziesz dlugo naciskal zaraz powinien pojawic sie ten kod:
> LEA EAX, [EBP+FFFFFF64] ;EAX = EBP-9C LEA ECX, [EBP-34] ;ECX = EBP-34 PUSH EAX ;Zapisuje(=na stosie=): EAX PUSH ECX ;Zapisuje(=na stosie=): ECX > CALL 00403DD0 ;Wywolanie funkcji ADD ESP, 08 ;Kasuje zapisane informacje TEST EAX, EAX ;Sprawdza co funkcja zwraca JNZ 00402BC0 ;Skok jesli nie zero
Dla mnie, to wyglada dokladnie jak funkcja porownujaca stringi (=lancuchy znakow=).
To pracuje tak:
* pobiera 2 stringi, zwraca 0 jezeli sa rowne, w przeciwnym wypadku wartosc rozna od zera.
A dlaczego program porównuje string z tym który ty wpisales (=jako numer rejestracyjny=)?
Aby zobaczyc czy byl prawidlowy! (Jak sie juz pewnie domysliles) Dobra, co sie kryje pod adresem [EBP+FFFFFF64] ? SoftICE nie manipuluje dobrze blednymi numerami, wiec aby znalezc prawdziwy musisz przeprowadzic to obliczenie:
100000000 - FFFFFF64 = 9C
W Softice mozesz to zrobic tak:
:? 0-FFFFFF64
Numer 100000000 jest za duzy dla SoftICE, ale z drugiej strony to daje ten sam rezultat.
A teraz... Czas aby zobaczyc co kryje sie za EBP-9C... Zrob to tak:
:d ebp-9c
Okno danych pokaze teraz dlugi rzad numerów - numer rejestracyjny! Ale pamietaj co powiedzialem wczesniej... dwa typy rejestracji daja 2 kody... wiec po tym jak zapiszesz sobie kod który wlasnie znalazles, kontynuujemy wykonywanie kodu z F10... Dopoki nie znajdziemy tego kawalka kodu:
> LEA EAX, [EBP-68] ;EAX = EBP-68 LEA ECX, [EBP-34] ;ECX = EBP-34 PUSH EAX ;Zapisuje: EAX PUSH ECX ;Zapisuje: ECX > CALL 00403DD0 ;Znowu wywoluje funkcje ADD ESP, 08 ;kasuje zapisana informacje TEST EAX, EAX ;Sprawdza co funkcja zwraca JNZ 00402BFF ;Skok jesli nie zero
A co mozesz znalezc pod adresem EBP-68? Heh... inny kod rejestracyjny!
:d ebp-68
To na tyle... Mam nadzieje ze wszystko dziala!
3.2 Command Line 95 - Prosta rejestracja nazwa/kod, I zrobimy keymaker'a
To jest fajny przykladowy program, z bardzo prostym zabezpieczeniem.
1 Badanie programu
Zbadales program i widzisz ze jest to 32-bitowa aplikacja, wymagajaca Nazwy (=imie - czy cos takiego=) i kodu w oknie rejestracyjnym.
Wiec zaczynamy!
3.1.2 "Sledzenie" kodu
Robimy to co z TaskLock - ustawiamy breakpoint-y.
Mozemy ustawic breakpoint-y na obie najbardziej prawdopodobne funkcje: GetWindowTextA i GetDlgItemTextA. Nacisnij Ctrl+D aby uaktywnic SoftICE, i wpisz:
:bpx getwindowtexta :bpx getdlgitemtexta
Teraz wejdz do (=po uruchomieniu Command Line 95=) okna rejestracyjnego, i wpisz nazwe (=imie=) i jakis numer (najczesciej liczba calkowita). Ja napisalem tak, i nacisnalem OK...
Nazwa: ED!SON'96 Kod: 12345
Program zatrzymal sie na GetDlgItemTextA (=czyli Softice automatycznie sie uruchomil=), Tak jak w TaskLock, naciskamy F11 aby wrocic do wywolywanej funkcji. Przesuwamy okno instrukcji w gore naciskajac kilka razy Ctrl+(strzalka w gore) az zobaczymy to:
MOV ESI, [ESP+0C] PUSH 1E ;Maksymalna dlugosc PUSH 0040A680 ;Adres do bufora textowego PUSH 000003ED ;Identyfikator kontroli CALL [User32!GetDlgItemTextA]
Numer 40A680 wyglada dla nas interesujaco, wiec sprawdzamy adres:
:d 40a680
I co pojawi sie w oknie danych, jesli nie nazwa ktora wpisalismy (=ED!SON'96=),
Nastepnie patrzymy ponizej powyzszego kawalka kodu, czyli:
PUSH 00 ;(nie interesujace) PUSH 00 ;(nie interesujace) PUSH 000003F6 ;identyfikator kontroli MOV EDI, 0040A680 ;Zapisuje adres do bufora CALL [User32!GetDlgItemInt]
GetDlgItemInt jest podobne do GetDlgItemText, ale zwraca liczbe calkowita z okna dialogowego. To jest zwrocone w EAX, wiec przechodzimy przez te instrukcje, (=F10=) i patrzymy w okno rejestrów... U mnie to wyglada tak:
EAX=00003039
Ile to jest 3039 hexadecymalnie (=szestnastkowo=) ? Wpisujemy:
:? 3039
I otrzymasz to:
00003039 0000012345 "09"
^hex ^dec ^ascii
I, jak widzisz (jak juz pewnie zgadles), to pokazuje numer rejestracyjny który sam wpisales. Ok, co teraz?
Zobacz na nastepujacy wycinek kodu, najpierw zwracany kod jest zapisywany:
MOV [0040A548], EAX ;Zapisuje zwracany kod MOV EDX, EAX ;Wklada zwracany kod do DX
3.1.3 Kalkulowanie kodu
Teraz zlamiesz kod!
MOV ECX, FFFFFFFF ;Te wiersze kalkuluja dlugosc stringu SUB EAX, EAX ;. REPNZ SCASB ;. NOT ECX ;. DEC ECX ;ECX zawiera teraz dlugosc stringu MOVSX EAX, BYTE PTR [0040A680] ;Pobierz bajt w 40A680 IMUL ECX, EAX ;ECX=ECX*EAX SHL ECX, 0A ;Przesuniecie w lewo o 0A krokow ADD ECX, 0002F8CC ;dodaje 2F8CC do rezultatu MOV [0040A664], ECX
I potwierdzanie...
CMP ECX, EDX ;Porównuje kody JZ 00402DA6 ;Jezeli takie same, wykonaj skok...
Kiedy doszles do porownania numerów rejestracyjnych, mozesz sprawdzic jaki jest poprawny numer:
:? ecx
U mnie to dalo:
000DC0CC 0000901324
To oznacza ze prawdziwy kod dla mnie to 901324.
Wiec nacisnij F5 albo Ctrl+D aby pozwolic programowi sie wykonywac, sproboj teraz zarejestrowac z dobrym kodem ale w formie dziesietnej oczywiscie. To dziala!!!
Patrzymy powyzej na kalkulacje kodu, i tlumaczymy to na jezyk C. Tworzymy ta bardzo prosta deklaracje jak kod jest kalkulowany:
code = ( (uppercase_first_char * length_of_string) << 0x0A) + 0x2f8cc;
Uwaga (1):Nie mozna zapomniec ze wszystkie znaki sa konwertowane kiedy je wpisujesz do okna dialogowego, wiec musimy zrobic to samo.
Uwaga (2): "<< 0x0A" oznacza "pomnoz przez 2^10"
Caly program w C moze wygladac tak:
#include <string.h>
#include <stdio.h>
int main()
{
unsigned long code;
unsigned char buffer[0x1e];
printf("Command Line 95 Keymaker by ED!SON '96\n"
printf("Enter name: "); (=wprowadz nazwe (imie)=)
gets(buffer);
strupr(buffer);
code = ( ((unsigned long)buffer[0] *
(unsigned long)strlen(buffer))
<< 0x0A) + 0x2f8cc;
printf("Your code is: %lu", code);
return 0;
}
Baw sie dobrze !!!
Popatrzmy na ten kawalek kodu z TaskLock znowu:
PUSH 32 ;Zapisuje: Maxymalny rozmiar stringu PUSH EAX ;Zapisuje: Adres bufora textowego PUSH 000003F4 ;Zapisuje: Identyfikator kontroli PUSH DWORD PTR [ESI+1C] ;Zapisuje: Wskaznik do okna dialogowego CALL [USER32!GetDlgItemTextA] ;Pobiera text
Mozesz to wywolac z programu napisanego w C, Wywolanie bedzie wygladalo tak:
GetDlgItemTextA(hwndDlg, 0x3F4 (=to jest liczba szestnastkowa=), buffer, 0x32);
^ [ESI+1C] ^ EAX
PUSH wklada dane na cos co sie nazywa Stos. W rezultacie kazde wywolanie PUSH wklada nowy kawalek danych na szczyt stosu, i wtedy funkcja sprawdza co lezy na stosie i uzywa tego do czego jest przeznaczona.
Pliki .EXE napisane w Visual Basic-u (=VB=) nie sa prawdziwymi, skompilowanymi EXE.
One zawieraja kod aby przywolac VBRUNxxx.DLL, który odczytuje dane z EXE aby uruchomic program. To jest takze przyczyna dlaczego programy VB sa takie wolne. Wiec kiedy pliki EXE nie sa "prawdziwe", nie mozesz ich Disassemblowac, znajdziesz tylko wywolanie DLL-a i pelno smieci, a kiedy bedziesz Debugowal ten program, skonczysz takze na wywolaniu DLL-a (=ang. Dynamic Link Library=). Rozwiazaniem jest dekompilator. Jest dekompilator dla VB 2 i 3, zrobiony przez kogos o przezwisku DoDi. Program jest shareware i dostepny w sieci (Zobacz dodatek C). W SHIT95, sa 32-bitowe aplikacje napisane w VB 4, i nie ma narazie dla nich dekompilatora, chociaz chcialbym aby byl. Uwaga: Tylko nie prawdziwi (nie inteligentni) programisci pisza programy w VB.
Aby sprawdzic czy SoftICE zaladowal symbole dla GetWindowText, uaktywnij Softice naciskajac Ctrl+D i wpisz cos takiego:
:exp getwindowtext
Jesli nie dostaniesz listy wszystkich GetWindowText, musisz edytowac \SIW95\WINICE.DAT (=sciezka gdzie masz zainstalowanego SoftICE-a=) i usunac znaki (';') (= ; - znak komentarza=) z kilku lini 'exp=' ktore wystepuja po tym tekscie: "Examples of export symbols that can be included for chicago" blisko konca pliku. Mozesz usunac znaki (';') ze wszystkich tych lini, albo zeby zaoszczedzic pamiec, tylko w tych liniach ktore zawieraja pliki: kernel32.dll, user32.dll, gdi32.dll, sa one najwazniejsze. Kiedy juz to zmienisz, musisz zresetowac komputer aby to zadzialalo.
Zawsze o wiele latwiej zrozumiec wywolania funkcji o ktorych mowilismy majac ich deklaracje (=w C/C++=) , wiec:
int GetWindowText (int windowhandle, char *buffer, int maxlen); int GetDlgItemText (int dialoghandle, int controlid, char *buffer, int maxlen); int GetDlgItemInt (int dialoghandle, int controlid, int *flag, int type);
Aby zobaczyc bardziej szczegolowe deklaracje funkcji, sprawdz w podreczniku programowania Windows/Win32.
Narzedzia Crackerskie:
SoftICE/Win 2.oo:http://www.geocities.com/SoHo/2680/cracking.html
Dekompilator VB:ftp://ftp.sn.no/user/balchen/vb/decompiler/
Przykladowe programy:
TaskLock: http://users.aol.com/Sajernigan/sgllck30.zip
CommandLine 95: ftp://ftp.winsite.com/pub/pc/win95/miscutil/cline95.zip
Na IRC (EFnet): na #Ucf96, #Cracking
E-mail: edison@ccnux.utm.my albo an461165@anon.penet.fi