by tepe^UnderPl 17.07.2001 Bytom Lekcja IV - "Znajdowanie poprawnego numeru seryjnego" a) pulapka hmemcpy b) instrukcje modyfikujace dane - add, sub - ror, rol - shl, shr - xor, and, or - inne c) uzywanie softice do obliczen d) kalkulator systemowy i jego pomoc przy lamaniu e) sposoby porownywania wartosci - cmp - test - sub - inne sposoby Let's Begin: -----====== a) pulapka hmemcpy ======----- Ok... wiec na poczatku bedzie o takiej ciekawej funkcji jak 'hmemcpy'. W SI zakladamy pulapki standardowo (komenda 'bpx hmemcpy'). W skrocie pulapka ta przydaje sie przewaznie przy pobieraniu tekstu. Wywolywana jest ona bardzo czesto w systemie wiec uwazaj przy jej zakladaniu, aby zrobic to juz po 'wpisaniu!' wszystkich danych (inaczej SI bedzie przerywal po kazdym wpisanym znaku). Przyznam sie, ze zawsze uzywam tylko tej pulapki (zamiast kombinacji GetWindowTextA itp..). Powod? pulapka ta wywolywana jest w 99,9% przypadkow pobierania tekstu. Nawet gdy programista uzyje ktorejs z wyzej wymienonych funkcji to pulapka ta i tak zadziala! Tyle wstepu ;-) Sposob jej wlasciwego uzytkowania moze jednak zniechecic newbies. Uzywania jej, przynajmniej na poczatku moze byc dosycc klopotliwe, ale sproboje wytlumaczyc wszystko lopatalogicznie, wiec chyba nie powinno byc problemu... Ponizej masz rozpiske krokow uzywania tej pulapki: a) wpisujemy serial, name itp... b) przechodzimy do SI i zakladamy pulapke na ta funkcje ('bpx hmemcpy') c) wciskamy przycisk register jesli jest, jesli natomiast program sprawdza poprawnosc seriala automatycznie po kazdym wpisanym znaku, to poprostu wklepujemy jeszcze jeden znak ;-) d) SoftIce powinien sie zaladowac... i teraz naciskamy ctrl-d o jeden mniej niz okien (po to azeby znalezc sie najblizej procedury mielacej serial). e) teraz naciskamy 'F11' dopoki nie bedziemy w kodzie programu... (o czym swiadczy, ze jestesmy w tym kodzie? widac to na pasku ktory oddziela okno komend, od okna instrukcji... wiesz ta pozioma kreska, gdie posrodku widac sensowny ciag znakow i pare cyferek - wlasnie ten ciag znakow oznacza, nazwe procesu, czy tez programu debugowanego - jest to poprostu nazwa pliku wykonywalnego .exe). f) gdy juz nacisniemy 'F11' tyle razy ze bedziemy mieli nazwe naszego lamanego programu na linii, to teraz bedziemy musieli przejsc sie troche po kodzie. Naciskajac klawisz 'F10' musimy przejsc przez pare instrukcji 'ret' az dojdziemy do normalnego kodu... przewaznie nad tym kodem bedzie widnialo wywolanie ktorejs ze znanych funkcji API do pobierania tekstu. Mimo iz wyglada to strasznie i jest bardzo zamotlane, to w praktyce jest to banalnie proste, i kazdy juz po paru probach bedzie sie orientowal w tym bez problemu. Najlepiej jest sobie pocwiczyc w ten sposob: zaloz raz pulapke na ktoras z tych normalnych funkcji API (GetWindowT... etc.), rozejrzyj sie po kodzie ponizej tego wywolania, a potem uzywajac juz funkcji 'hmemcpy' dostac sie w to samo miejsce ;-) Pamietaj: praktyka czyni mistrza ;-) -----====== b) instrukcje modyfikujace dane ======----- Heh... pamietajcie nic nie trwa wiecznie, wiec nie zawsze bedziecie sie spotykac z porownaniami w stylu 'cmp good_serial,wpisany_serial'... czesto nasz serial bedzie obrabiany i zmieniany a dopiero potem porownywany. Trzeba bedzie sie wiec nauczyc odwracania tych wszystkich procedur ;-) Ponizej masz najprostsze komende modyfikujace dane... po wiecej komend i szczegolow, musisz zajrzyc do spisu opkodow, ktory znajdziesz chocby na strone www.under2001.prv.pl ;-) Uwaga! Wiekszosc z tych komend operuje na bitach, wiec ich prawidlowe dzialanie widac dopiero w tym ujeciu ;-) -----====== add, sub ======----- Sa to najprostsze operacje dodawania i odejmowania, wiec nie powinienes miec z nimi zadnych problemow ;-) Add dodaje, a sub odejmuje... wiecej powinienes wiedziec ze szkoly ;P -----====== ror, rol ======----- ROL i ROR sa to instrukrcje 'obracajace' bity... ROL w lewo, a ROR w prawo. Najlepiej zobaczyc to na przykladzie... ROL i ROR maja wywolanie : 'ROL rejestr, ilosc_miejsc_przesuniecia'. Mamy wiec np. ROL EAX,03, gdzie EAX ma wartosc 32323232 (HEXOWO!!!), na bity to bedzie: 110010001100100011001000110010 rol obraca w lewo o 3 miejsca, a wiec mamy: - I przesuniecie 100100011001000110010001100101 - II przesuniecie 001000110010001100100011001011 - III przesuniecie 010001100100011001000110010110 ROL - scinamy bity z lewej strony i przenosimy na prawo... ROR - na odwrot... Jak widzisz ROL i ROR sa przeciwstawne wiec mozna do rozkodowania uzyc po prostu przeciwnej instrukcji z tym samym operandem i ta sama wartoscia przesuniec... :)))) -----====== shl, shr ======----- Instrukcje SHL i SHR sa bardzo podobne jak funckje powyzsze (ROL i ROR) z mala roznica... ale pierw zobaczmy przyklad: EAX - ma 32323232 - 110010001100100011001000110010 SHL EAX,02 W EAX otrzymujemy C8C8C8C8 - 11001000110010001100100011001000... zobacz co sie stalo... do liczby zostaly dopisane dwa!!! bajty z prawej strony... takie jest wlasnie dzialanie SHL i SHR dopisuja dwa puste bajty... lecz uwaga w momecie gdy zostanie przekroczona wartosc rejestru (w tym przypadku gdy bedzie mial dlugosc 32 bitow) procesor obetnie najstarsze bity... ktore to sa??? te przeciwne do strony do ktorej dodajemy... Aha, najlepiej do tego typu obliczen uzywaj kalkulatora WinShit'a w opcji zaawansowanej... -----====== xor, and, or ======----- XOR jest instrukcja artymetyczna wykonujaca operacje na bitach w/g pewnej reguly... Przy xor'rze mamy zawsze dwie wartosci, A i B... np. xor EAX, EBX... wynik operacji zapisywany jest w pierwszym operandzie (w tym przypadku EAX), wynik... no wlasnie jaki wynik??? XOR po koleji bierze po jednym bicie z kazdego operandu i przerabia je w/g schematu (a - pierwsza wartosc, b - druga wartosc, c - wynik operacji...): a | b | c --------- 1 | 1 | 0 0 | 1 | 1 1 | 0 | 1 0 | 0 | 0 Wypadalo by w tym miejscu wspomniec o pewnej wlasciwosci tej funkcji... XOR wykonany dwa razy na tych samych argumentach da nam z powrotem dane wyjsciowe! Wlasnie z tego powodu, ta funkcja czesto wykorzystywana jest w procedurach kodujacych... A oto przyklad: eax=22222222 ebx=11111111 1010100110001010110001110 101010011000101011000111 xor eax, ebx 1010100110001010110001110 EAX 0101010011000101011000111 EBX ------------------------- 1111110101001111101001001 Wynik w EAX Zwroci w rejestrze EAX wartosc: 33201993... (WARTOSCI DECYMENDLANE!!!) A teraz tabelka dla 'and': a | b | c --------- 1 | 1 | 1 0 | 1 | 0 1 | 0 | 0 0 | 0 | 0 Nie bede sie za bardzo rozpisywal o niej ;-) Wiekszosc pokrywa sie z opisem funkcji 'xor' (ale jak widzisz 'and' nie jest zamienne!). A teraz dla 'or': a | b | c --------- 1 | 1 | 1 0 | 1 | 1 1 | 0 | 1 0 | 0 | 0 Zasada jak powyzej ;-) -----====== inne ======----- Jest jeszcze wiele fajnych operacji, ktore cos tam dodaja, odejmuja, czy miela ;-) Istnieje jeszcze takze wiele komend koprocesora. Nie ucz sie teraz ich dzialania, bo dostaniesz jakiejs szajby ;-) Wystarczy, ze nauczysz sie tych paru podstawowych, a reszte to juz w praniu. Po prostu jak bedziesz lamal i nie bedziesz znal jakiejs tam komendy, to poprostu wlacz sobie jakis spis opkodow ;-) -----====== c) uzywanie softice do obliczen ======----- SoftIce posiada taka ciekawa instrukcje jak '?', ma ona moc wykonywania za nas zmudnych obliczen ;-) Standardowo wywolujemy komende '? operand', gdzie operandem moze byc rejestr (np. ? eax), kawalek pamieci (np. ? 00403433), albo jakakolwiek liczba. Musiszy tylko uwazac bo SI standrdowo bierze wszystkie liczby za zapisane w formacie hexcymendalnym. Jesli chcesz zapisac liczbe w trybie hexcymendalnym musisz dodac na jej poczatku '+' (np. ? +10). Aha, wspominalem, ze mozna tej komendy uzywac do obliczen... juz tlumacze jak. Gdybysmy np. chcieli sobie zxor'owac rejestr 'EAX' z '2222h' to po prostu uzywamy komendy '? eax^2222' ;-) Caly trick polega na tym, azeby pomiedzy danymi wstawic odpowiednia komende, rozpiske masz ponizej ;-)... + dodawanie - odejmowanie * mnozenie / dzielenie ^ xor & and | or ~ not >> shr << shl Mam nadzieje, ze sie polapiesz ;-) -----====== d) kalkulator systemowy i jego pomoc przy lamaniu ======----- Czasami zdarza sie ze potrzebujesz szybko cos tam policzyc, czy przemielic. Wtedy najprosciej posluzyc sie kalkulatorem w ktory powinien byc wyposazony kazdy system WinXX. Wystarczy ze przelaczysz go w tryb zaawansowany. Z tego co widzialem, takze wiele normalnych kalkulatorow, ma wbudowana opcje obliczen a'la xor, and itp ;-) -----====== e) sposoby porownywania wartosci ======----- Program moze kontrolowac poprawnosc seriala na bardzo wiele sposobo...
Scorpik