GetRight 3.3.1 by Gonzo

Cel    : GetRight 3.3.1
Skad   : CHIP CD 2/99
Rozmiar: ok. 2MB
Czym   : SoftIce

Wstep:

Jest to bardzo przydatny program jak na polskie warunki. Umozliwia sciaganie plikow z netu z mozliwoscia wznowienia transmisji od miejsca w ktorym ja przerwano. Aby odblokowac program nalezy wpisac jedynie s/n w okienku Enter Code.

Newbies Note!

Wydawac by sie moglo, ze programy zabezpieczone wylacznie s/n sa latwiejsze do zlamania od zabezpieczen typu name i s/n. W praktyce jest na odwrot. Np jesli zastosowana jest metoda name i s/n to w ktoryms miejscu kodu programu musi byc procedura porownujaca kod, ktory wpisales z tym wygenerowanym z twojago name. Jesli jest sam s/n to mozna w jakis sposob uzaleznic wlasciwy kod od tego co wpisales.

Jesli nie jestes kompletnym Newbie to zamknij tego tutora i sprobuj sam skraczyc ten program.

Jesli w tym tutorze chcesz znalezc s/n to tez go nie znajdziesz.

Opis:

Na poczatek uruchamiamy GetRighta razem z SI. Wchodzimy do menu Help|About GetRight|Enter Code... Zobaczymy tam okieno bardzo nas zachecajace do wpisania kodu rejestracyjnego. Dobra, wpiszmy jakis dowolny kod np. 12131415 i zobaczmy co sie stanie. No tak! Program nas uprzejme informuje, ze wpisalismy ZLY KOD REJESTRACYJNY.

No to zrobmy inaczej.

Wchodzimy do SI (Ctrl+D) i zakladamy standadowe pulapki:

bpx GetWindowTextA
bpx GetDlgItemTextA

Teraz wychodzimy z SI (znowu Ctrl+D lub w linii komend wpisujemy X) i wciskamy OK. Przyneta zadzialala. GetRight zlapal sie na przynete GetWindowTextA :) Teraz wciskamy F11 aby wrocic do miejsca skad zostala wywolana procedura GetWindowTextA.

Newbies Note!

Podstawowe klawisze SI:

F5 - wyjdz z SI
F8 - analizuj krokowo kod programu z wchodzeniem w procedury (CALL'e)
F10 - analizuj krokowo kod programu bez wchodzenia w procedury (CALL'e)
F11 - skocz do miejsca skad zostala wywolana procedura
F12 - skocz do konca bierzacej procedury i wyjdz z niej

Teraz poszukajmy w pamieci naszego kodu. W moim przypadku

s ds:0 L FFFFFFFF "12131415"

W okienku danych (jesli go nie widzisz wpisz wd) zobaczymy nasz wpisany serial. W jego poblizu znajdziemu takze inne numery, ktore wygladaja zachecajaco :) Powiem Ci od razu, ze to nie sa wlasciwe s/n. Jesli chcesz to mozesz wpisac jeden z nich. Oczywiscie przed jego wpisaniem wylacz na chwile pulapki (bd *). Zobaczmy co sie stanie ....

Wpisuje: 431916083877 & OK

Otrzymamy komunikat "This registration number was received from a fraudulent or cancelled order. It has been disabled." i od tej pory nie mozemy juz wpisywac s/n. Dobre co ?

Zapewne powiesz - Jak ja mam teraz zlamac ten program skoro nie moge wpisac s/n ? Wystarczy usunac z rejestru klucz

HKEY_CURRENT_USER\SOFTWARE\HeadLight\GETRIGHT

i wszystko wroci do normy :)

Zrobmy wszystko od poczatku jescze raz:

- wlanczamy pulapki (be *)

- wpisujemy nasz s/n i wciskamy OK

- wychodzimy z GetWindowTextA klawiszem F11

W oknie ASM zobaczysz taki wiersz:

MOV   ECX, [EBP+10]

Zobaczmy co jest w rejestrze ECX, ale najpierw musimy wcisnac F10

<F10>
d ECX

Znajdziemy tam jekis smieci. W sumie nic ciekawego prawda ?

NIEPRAWDA !!!

Pierwsze cztery bajty wyswietlone w oknie kodu wygladaja nastepujaco:

3C 22 FF 00

Zastanawiasz sie dlaczego pierwsze 4 bajty ? Poniewaz ECX jest rejestrem 32 bitowym i mozna w nim "zapisac" wlasnie 4 bajty (8 bitow - 1 bajt, 32 bity - 4 bajty). No to juz wiesz dlaczego tak jest ale ciagle nie wiesz po co mi te 4 bajty. Oto odpowiedz, wpisz:

d 00FF22C3

Oooo! W oknie danych pojawil sie nasz s/n ! Hmmm... Ale dlaczego wpisalismy 00FF22C3 zamiast 3C22FF00 ? Ano dlatego, ze w rejestrach liczby "zapisywane" sa od tylu. No to juz wszystko jasne.

Jaki z tego wniosek ?

Nie mozemy zalozyc pulapki bpm, poniewaz w rejestrze ECX zapisywane jest odwolanie do miejsca w pamieci do miejsca, gdzie znajduje sie kolejne odwolanie do miejsca w pamieci, gdzie zapisany jest nasz s/n. Troche to zagmatwane :) ale jakos musisz to zrozumiec. Jesli nie to zawsze mozna pograc w kuaka :))

Newbies Note!

bpm - [Breakpoint on memory access] - jest to taka pulapka, ktora zadziala w momencie zapisu/odczytu danej z pamieci. Np:

bpm 00FFC567

Przerwie program tylko wtedy gdy jakas instrukcja bedzie wczytywala/zapisywala dana do komorki pamieci o podanycm adresie (00FFC567).

Skoro nie mozemy zalozyc bpm to pozostaje nam dokladnie analizowac kod programu.

W tej procedurze nie jest sprawdzany nasz s/n czy jest wlasciwy. Ewentualnie w ktoryms z CALL'i sa procedury sprawdzajace nasz kod z tymi "zakazanymi", ale my nie bedziewmy sie w nie zaglebiac ze wzgledu na to, ze nie tego szukamy :) A wiec wciskamy F10 do momentu wyjscia w bierzacej procedurki czyli do momenu, w ktorym w oknie kodu ASM zobaczymy polecenie RET (wyjscie z procedury i powrot do miejsca z ktorego zostala wywolana). W nastepnej tez nic nie bedzie ciekawego i w nastepnej tez nie :)

W sumie to mozemy sobie ulatwic zycie 3 razy wciskajac F12. Jeszcze kilka razy wcisniemy F10 i zobaczymy cos takiego:

LEA   ECX,[EBP-10] << Hmmm.. cos mi sie to wydaje znajome :)
CALL  0043C8B3     << Ciekawe co tu sie dzieje ? :)
TEST  EAX,EAX
JZ    004411E9     << Jesli EAX = 0 to skok

Zobaczmy ECX:

<F10>
d ECX

W okienku danych znajdzie sie cos takiego

6C 01 FF 00

A wiec:

d 00FF016C

Mam nadzieje, ze wiesz o co chodzi, jak nie to kuejk czeka :)) Ooo! Znowu nasz s/n. Skoro program zapisuje sobie gdzie ma szukac naszego seriala to ciekawe co on robi w tej procedurce ? Zaraz sie tym zajmiemy :) Narazie przejdzmy przez tego CALL'a wciskajac <F10> i kursor ustawmy na polecenu skoku (JZ). Teraz zobaczmy w oknie rejestrow (jesli go nie widzisz to wpisz wr) jaka wartosc ma EAX. No tak, EAX jest rowny 0. jesli znasz sie troche na ASM to wiesz, ze program wykona skok. Jesli nie wiesz dlaczego to przeczytaj Newbies Note!

Newbies Note!

Polecenie TEST porownuje ze soba np dwa rejestry. Np:

TEST   EAX,EAX

Pomyslisz sobie - Po jaka cholere porownywac ze soba to samo ? Przeciez to nielogiczne ! Masz racje. Ale komenda TEST poza porownywaniem rejestrow, sprawdza czy sa one wieksze od zera. Jesli sa wieksze to flaga zerowa (Z) jest ustawiana na 0, jesli sa rowne 0 to flaga Z jest ustawiana na 1. Mam nadzieje, ze rozumiesz, jesli nie ...

Musze jeszcze jedna rzecz wyjasnic. Co to sa te flagi ?

Flagi to sa takie "cyfrowe choragiewki", ktore mozna podniesc do gory lub opuscic, ustawic na 1 lub 0. Jesli w programie wykonywane sa jakies instrukcje, to np jako wynik porownywania dwoch rejestrow ustawiane beda rozne flagi w zaleznosci od tego czy te rejestry sa sobie rowne, czy tez jeden z nich jest wiekszy.

Program wykona ten skok dlatego, ze flaga zerowa jest ustawionan na 1. Mozna to latwo sprawdzic:

W oknie rejestrow do prawej stronie zauwazysz taki ciag znakow:

o d i s z a p c

To sa wlasnie rozne flagi. Jesli dana flaga jest ustawiona na 1 to ta flaga jest opisana duza litera, a jesli na 0 to mala literka.

Czyli w naszym przypadku jest duze Z, czyli flaga zerowa (Z) jest ustawiona na 1. Cziekawe co by sie stalo gdybysmy przestawili ta flage na 0 ? Mazna to sprawdzic poleceniem:

r fl z

Po takim poleceniu nasza flaga zostanie ustawiona na 0, a skok nie zostanie wykonany.

Wcisnijmy tylko <F5> i zobaczymy:

"Thank you for buying GetRight! Your support will help make GetRight even better."

WOW! Udalo nam sie go zarejestrowac ? NIE !!! zmienilismy tylko chwilowo program aby myslal, ze wpisalismy wlasciwy kod. Aby to utrwalic musimy zmienic kod ASM. Wydawaloby sie, ze wystarczy zmienic tylko JZ na JNZ i bedzi GIT !

Newbies Note!

JZ - skok jesli flaga zerowa = 1

JNZ - skok jesli flaga zerowa = 0

Niestety, nic z tego. Ano dlatego, ze kod rejestracyjny mozna wpisywac w roznych miejscach, a poza tym GetRight przy kazdym uruchomienu sprawdza czy rzeczywiscie jest wpisany dobry kod. W ten sposob musielibysmy zmieniac wszystkie procedury gdzie jest wykonywany skok, jesli s/n jest zly. Ale zawsze mozna zmienic procedure sprawdzajaca nasz s/n ! W koncu ona musi byc wywolywana przed wszystkimi skokami zlego kodu. Dobra, no to zobaczy co jest w tym CALL'u. W tym celu musimy jescze raz wpisac dowolny kod wcisnac <F11> potem 3 razy <F12> i jescze troche <F10> az do tego miejsca:

LEA   ECX,[EBP-10]
CALL  0043C8B3     << Tu wchodzimy
TEST  EAX,EAX
JZ    004411E9

Aby wejsc do tej procedury nalezy ustawic na nia kursor i wcisnac F8. Wciskamy teraz kilkanascie razy <F10> az dojdziemy do miejsca:

MOV   EAX,[EBX]             << w EAX nasz serial !
CMP   DWORD PTR [EAX-08],0C << sprawdz czy nasz serial ma 12 znakow dlugosci
JZ    0043C8DE              << jesli ma 12 znakow dlugosci to skok
XOR   EAX,EAX               << jesli nie to zeruj EAX ...
JMP   0043CDB7              << ... i skacz

Jak latwo sie domyslic (czytajac komentarze) w tym miejscu sprawdzana jest dlugosc Musi ona wynosci 12 znakow (0C w HEX = 12), bo jak nie to program zeruje EAX i skacze na sam koniec procedury i wychodzi z niej. Jak nie trudno sie domyslic wyzerowany EAX spowoduje skok do procedury wyswietlajacej komunikat o zlym kodzie.

Newbies Note!

XOR - jest to funkcja metematyczna. Nie bede sie tu zaglebial jak ona dziala (odsylam do ksiazek), ale moge powiedziec, ze jesli XOR'owana jest ta sama liczba to wynik zawsze bedzie rowny 0. Czyli:

XOR   EAX,EAX

Spowoduje, ze EAX = 0

My wpisalismy s/n o dlugosci 8 znakow. Musimy to zmienic. Wpiszmy inny serial np:

121314151617

Teraz skok zostanie wykonanay. Program zacznie sprawdzac nasz s/n. Troche to jest zagmatwane. Szczerze mowiac to nie mam zielonego pojecia w jaki sposob GetRight sprawdza nasz serial i wcale mi sie nie chce tego dowiadywac :) Jedno jest pewne. Jesli po wykonaniu tej procedury EAX bedzie wiekszy od 0 to program uzna, ze nasz serial jest OK. Zatem mozemy zmienic nieco kod programu, tak aby EAX zawsze byl wiekszy od 0. W tym celu udajmy sie na sam koniec tej procedury. Wciskaj <F10> az zobaczysz:

CALL  0043CDBB
JZ    0043CDB3
AND   DWORD PTR [EBP-08],00
MOV   EAX,[EBP-08] << tutaj trzeba nieco przerobic kod
...  << tutaj jest jeszcze kilka instrukcji, ale mi sie ich nie chcialo pisac
RET

Wystarczy nieco zmienic instrukcje:

    MOV   EAX,[EBP-08]

Na przyklad na:

    MOV   EAX,ECX

I od tej pory EAX zawsze bedzie wiekszy od zera. No dobra jak to zrobic ? Ustawiamy kursor na MOV ... i wpisujemy

a

...teraz mozemy zmienic kod...

MOV EAX,ECX

i jescze musimy dodac

NOP

...i od tej pory kazdy wpisany serial bedzie uznawany za dobry :)))) Drobne wyjasnienie. Po co ten NOP ? Aby Ci to wyjasnic musisz najpierw sobie wpisac

code on

Teraz przed instrukcjami bedziesz mial wypisane kody instrukcji (kazda instrukcja w ASM ma swuj kod zapisany w HEX). Dlugosc kodu instrukcji polecenia MOV EAX,[EBP-08] wynosila 3 bajty, a dlugosc MOV EAX,ECX 2 bajty. Wiec trzeba bylo dodac ten jeden bajt wlasnie za pomoca NOP'a. Dlugosc NOP'a wynosi wlasnie jeden bajt a ta instrukcja dokladnie nic nie robi. Za pomoca niej crackerzy uzupelniaja takie luki w ASM'ie.

No to teraz juz prawie jest wszystko OK. PRAWIE ! Dlatego, ze po zamknieciu GetRight'a i ponownym jego uruchomieniu okazuje sie, ze jest on dalej niezarejestrowany :( Dlaczego ? Ano dlatego, ze my za pomoca SI dokonalismy zmian tylko w pamieci, a nie we wlasciwym programie.

Musimy jeszcze raz dojsc na sam koniec tej procedurki sprawdzajacej seriala.

    7404       JZ    0043CDB3
    8365F800   AND   DWORD PTR [EBP-08],00
    8B45F8     MOV   EAX,[EBP-08]

Spisujemy kody instrukcji kilku polecen w poblizu MOV EAX,[EBP-08]. Czyli tak:

7404
8365F800
8B45F8

Teraz zmieniamy na MOV EAX,ECX i dopisujemy NOP. Znowu zapisujemy sobie kod instrukcji

8BC1
90

Aby program na stale uwazal, ze wpisujemy dobry s/n musimy zmienic go w dowolnym hex editorze. Polecam program Hiev 6.01 jest bardzo dobry. Jest dostepny na mojej stronie domowej (link na koncu tego tutora). Ladujemy getright.exe to Hiew'a. Teraz musimy znalezc to co mamy zmienic. W tym celu wciskamy F7 (szukanie) i wpisujemy

74048365F8008B45F8

Znalazl! Teraz zmienmy 8B45F8 na 8BC190 (chyba nie musze tlumaczyc dlaczego bo ....) Zapisujemy zmiany i juz teraz GetRight bedzie skraczony !!!!!!!!!

UFFF!!! Rozpisalem sie. Mam nadzieje, ze ten tutor bedzie Ci pomocny. Jesli masz jakies uwagi to napisz do mnie.


Jezeli szukasz tu jedynie seriali, to zle trafiles.

Dzialania opisane powyzej maja na celu analize kodu programu i poznanie schematu jego zabezpieczenia. Jezeli masz zamiar uzywac tego programu dluzej, kup go (nie dotyczy M$). Pozwoli to producentom udoskonalac oferowane programy, jak rowniez ich zabezpieczenia.

28.03.1999 by Gonzo (sebgonzo@alpha.net.pl http://www.free.com.pl/sebgonzo)