Cel : BrainWave Generator v.2.0.4 Skad : CyberCD 2/99, http://www.bwgen.com Rozmiar : 1.6MB Czym : SoftIce, HexWorkshopWstep:
"Program o dosc ciekawym przeznaczeniu, poprzez generowane dzwieki o zmiennych czestotliwosciach i czasach trwania to niesamowite narzedzie stara sie wplywac na nasza psychike. Czyzby to komputer mial nam w XXI wieku pomagac wychodzic z dolków psychicznych przy pomocy generowanych dzwieków? Autorzy juz wypuscili w waskim gronie kolejna wersje beta programu o jeszcze silniejszym oddzialywaniu. Proponuje wiec sprawdzic czy nasza blaszana maszynka moze sterowac Waszymi odczuciami..."
(opis z Cybera 2/99)
UWAGA!Tutorial przeznaczony jest tylko dla poczatkujacych, gdyz zlamanie tego programu osobom siedzacym w temacie nie sprawi zadnego problemu. Jesli jednak dopiero zaczynasz sie tym bawic to zapraszam do lektury :))))
Opis:W tym tutorialu chcialbym wprowadzic Was co nieco w tajniki patchowania programu. Po uruchomieniu wprawdzie widzimy standardowe okienko w ktorym mozemy wpisac swoj username oraz serial, jak jednak wykaze dalsza analiza kodu nie jest to takie latwe jak moglismy to zrobic przy okazji np. WinZip-a 7.0, ktorego rozgryzlismy w poprzednim tutorialu. O ile analiza kodu jaka bedziemy musieli wykonac w BrainWave ogranicza sie do absolutnego minimum, jednak nigdzie podczas analizy nie znajdziemy w pamieci dokladnych danych jakie musimy wpisac (takie dane znajdziemy w wiekszosci popularnych programow). Po prostu ten programik przeprowadza pewne operacje zarowno na nazwie jak i na wpisanym serialu i dopiero wynik tych operacji pozwala na stwierdzenie czy podane dane sa prawidlowe czy nie. Nie bede tu tez analizowac calego kodu w celu dobrania sie do calej procedury dajacej serial, wygenerujemy sobie patcha.
Okej, uruchamiamy programik, pojawia sie nag-screen. Klikamy na przycisk: 'I have registered' (raczej watpie aby kogos zainteresowala opcja Register on-line, chociaz jesli programik podoba ci sie to kup go). Widzimy nasza "ulubiona" tabelke z dwoma polami: Name oraz Key. W pole Name wpisujemy McKiler/CrackPL'99 w pole Key cokolwiek, chociaz z pewnych wzgledow radze wpisac kod 9-cyfrowy (powyzej mamy tak napisane ze program czeka wlasnie na kod 9-cyfrowy), uchroni nas to od dziwnych odwolan powodujacych wyswietlenie informacji o nieprawidlowej rejestracji. Akurat tutaj nie bedzie to nam potrzebne, ale w innych programach mozemy spotkac sie z instrukcja sprawdzajaca dlugosc kodu juz na samym poczatku - dlatego tez dowiedz sie jak najwiecej o programie jeszcze zanim zaczniesz go crackowac. A wiec w pole Key wpisujemy 123456789. Naciskamy OK, i jak moglismy sie spodziewac kod jest nieprawidlowy.
Newbies Note!Zanim cokolwiek zaczniesz robic w SoftIce upewnij sie ze w pliku winice.dat dokonales niezbedne poprawki, mianowicie sprawdz czy nie masz srednikow przed liniami
EXP=c:\windows\system\kernel32.dll EXP=c:\windows\system\user32.dll EXP=c:\windows\system\gdi32.dll
Jesli ich nie usuniesz SoftIce nie zalozy pulapek na funkcje z ktorych za chwile skorzystamy! Linijke INIT=costam zamien na ponizsza, ulatwi to analize kodu:
INIT="lines 60; wd 22; wc 25; wr; code on; X;"
Naciskamy CTRL+D aby wejsc do SI i zakladamy standardowa pulapke wpisujac:
bpx getdlgitemtexta
Wychodzimy z SI (F5 lub CTRL+D), i ponownie nacikamy OK w polu rejestracji. Bum, jestesmy znowu w SI, naciskamy jeszcze raz F5 i pozwalamy programowi dalej sie wykonywac. Dlugo to nie potrwa (kilka milisekund :) i znowu jestesmy w SoftIce.
Newbies Note!Dlaczego program zatrzymuje sie dwa razy na naszej pulapce? Proste - odczytuje dane pierwszy raz z pola Name, drugi raz z pola Key
Naciskamy F11 aby wrocic do miejsca w ktorym funkcja zostala wykonana. Na ekranie widzimy:
015F:0040D77D 8D44242C LEA EAX,[ESP+2C] <- pobranie name 015F:0040D781 8D4C240C LEA ECX,[ESP+0C] <- pobranie seriala 015F:0040D785 50 PUSH EAX 015F:0040D786 51 PUSH ECX 015F:0040D787 E8A4EAFFFF CALL 0040C230 015F:0040D78C 83C408 ADD ESP,08 015F:0040D78F 85C0 TEST EAX,EAX 015F:0040D791 7510 JNZ 0040D7A3 (NO JUMP)
Naciskamy F10, przechodzimy do linii drugiej, wpisujemy d EAX - i co widzimy? wpisany username! Naciskamy F10, przechodzimy do linii trzeciej, wpisujemy d ECX - i widzimy nasz (wpisany) serial PUSH EAX i PUSH ECX wkladaja je na stos, nastepnie wywolywana jest CALL-em procedura dokonujaca odpowiednich obliczen na kodzie i serialu. Chwilowo nas to nie interesuje. Naciskamy F10 az dojdziemy do linii TEST EAX,EAX. Po co porownywac dwie te same rzeczy? Ano, dlatego ze funckja TEST sprawdza rowniez czy dane sa rowne czy rozne od zera i ustawia odpowiednie flagi. Jesli dane sa rowne zero flaga zerowa zostaje ustawiona na 1, w SoftIce widzimy to jako literke Z. Tak bedzie teraz w naszym przypadku (kod jest nieprawidlowy).
Newbies Note!Flaga moze przyjmowac wartosc 0 albo 1. Flagi widzimy jako male lub duze literki w prawym gornym rogu w SoftIce. Mala literka oznacza flage ustawiona na 0, duza na 1. JZ - skok jesli flaga zerowa = 1 JNZ - skok jesli flaga zerowa = 0
Dochodzimy teraz do linii JNZ 0040D7A3. Skok zostanie wywolany tylko wtedy kiedy flaga zerowa zostanie ustawiona na 0 (z). Jesli pozwolimy programowi wywolywac sie dalej to szybko zobaczymy komunikat o nieprawidlowej rejestracji. Wniosek stad ze ten wlasnie skok odpowiada za to, czy nasza rejestracja zostanie uznana za prawidlowa. Wchodzimy jeszcze raz do SI, zatrzymujemy sie na linii JNZ 0040D7A3 i wpisujemy magiczne polecenie:
r fl z
Powoduje ono zmiane wartosci flagi zerowej! Widzimy tez ze SI pisze nam ze zaraz zostanie wykonany skok (F10). Wyjdzmy z SI (F5) i oto widzimy podziekowania za pomyslna rejestracje! Tada! Wyjdzmy teraz z BrainWave'a i odpalmy go ponownie.... Buuuu, znowu pisze ze nie jest zarejestrowany! Po prostu zmiany jakie dokonalismy nie zostaly zapisane nigdzie w pliku programu tylko zostaly dokonane podczas wykonywania programu. Kod rejestracyjny jest natomiast sprawdzany przy kazdym uruchomieniu programu. Jak to obejsc? Mozemy zamiast JNZ 0040D7A3 (kiedy nie zero) zapisac JZ 0040D7A3 (kiedy zero). Jak tego dokonac? Wpisujemy:
a
i przechodzimy do okna edycji danych, wpisujemy
JZ 0040D7A3
Widzimy zmiane wartosci 7510 na 7410. Te wartosci to po prostu zapis heksadecymalny tej instrukcji w kodzie programu. Wiec mozemy go wyedytowac dowolnym edytorem hex. Jednak to nam nic nie da, gdyz kod w programie porownywany jest w wielu miejscach i wszystkie je nalezaloby zabezpieczyc, a jest to qpe roboty. Wobec tego mozemy zadbac o to zeby funkcja TEST EAX,EAX zawsze dawala wyniki wieksze od zera. W tym celu musimy wejsc w funkcje wywolywana CALL-em kilka linijek wyzej - jest ona wywolywana za kazdym razem w celu sprawdzenia kodu. Znajdziemy w niej linijke ktora robi cos w rejestrze EAX. Lapiemy program w pulapke od nowa, dochodzimy do ww. CALL-a, naciskamy F8 aby wejsc w funkcje i widzimy rozne smieci. Przechodzimy F10 az dojdziemy do ponizszego fragmentu kodu
.......blablabla....... 015F:0040C2DD 8A4605 MOV AL,[ESI+05] 015F:0040C2E0 3C2D CMP AL,2D 015F:0040C2E2 740A JZ 0040C2EE (NO JUMP) 015F:0040C2E4 33C0 XOR EAX,EAX <----- WAZNE !!!!!!!!! 015F:0040C2E6 5D POP EBP 015F:0040C2E7 5F POP EDI 015F:0040C2E8 5E POP ESI 015F:0040C2E9 5B POP EBX 015F:0040C2EA 83C458 ADD ESP,58 015F:0040C2ED C3 RET <----- POWROT DO FUNKCJI
Funckja XOR jest tzw. wykluczajaca sie alternatywa. Po zXORowaniu jednego z tym samym zawsze daje zero. A jest to ostatnia funkcja robiaca cos z EAX przed wywolaniem TEST EAX,EAX. Przed XORowaniem w EAX sa jakies wartosci, wazne ze wieksze od zera. Wiec wystarczy zadbac o to zeby to XORowanie nie nastapilo :)))) Instrukcja XOR EAX,EAX zajmuje dwa bajty (widzimy to jako 33C0 w hex). Zamiast niej mozna zastosowac funkcje NOP, ktora dokladnie nic nie robi. Naciskamy a i jestesmy w oknie edycji kodu. Wpisujemy NOP i naciskamy ENTER. UWAGA! Instrukcja NOP zajmuje 1 bajt, dlatego musimy ja wpisac dwukrotnie !!! Teraz musimy zebrac dane niezbedne do edycji pliku. Spisujemy dane znajdujace sie w okolicach opisywanej komendy, a wiec ciag hex: 740A33C05D5F. Odpalamy dowolny hexeditor - jest ich wiele ja jednak polecam Hex Workshop - jest to profesjonalny 32-bitowy edytor hex z mnostwem bardzo przydatnych opcji (np. porownanie pliku), najnowsza wersja to 2.54. Opcja Find znajdujemy ten ciag i dokonujemy podmiany 33C0 na 9090, czyli na podwojny NOP. Dajemy na SAVE, odpalamy program, wpisujemy dowolne dane i teraz mozemy wybrac sie na pivo (bezalkoholove ofkoz :) aby oblac zcrackowany program. UWAGA! Wpisany kod musi byc 9-cyfrowy !!!! Jako BONUS mozna jeszcze napisac programik ktory zrobi podmianke automatycznie.
Pisalem to strasznie lopatologicznie, wiec mysle ze dla beginnerow bedzie to zrozumiale, jesli nie to ask me.
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.
1999.03.31 by McKiler (mck@zg.home.pl)