LEKCJA4(4).TXT

(12 KB) Pobierz
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...
Zgłoś jeśli naruszono regulamin