Witaj! Rejestracja

Lekcja II - SoftIce - podstawowe narzedzie, konfiguracja i uzytkowanie


a) instalacja SoftIce, wraz z mozliwymi problemami
b) konfiguracja:
- plik winice.dat wraz z srednikami
- dostosowanie wygladu softice do preferencji uzytkownika (kolory,
szerokosc i wysokosc okna, kolory, rozmiary czcionki itp.)
- z SoftIce'm, czy bez niego (menu w autoexec'u)
c) podstowe komendy (pulapki, szukanie, itp.)
d) wyjasnienie zagadnien zwiazanych z softicem i debugowaniem w
systemie windows
e) omownienie roli loadera softice
f) system pomocy dolaczony do softice
g) problemy z uzytkowaniem softice
h) debugujemy pierwszy program
- funkcje API
- pulapki
- zmiany rejestrow i kodu
- znajdowanie poprawnego kodu (zwykle porownanie cmp good, bad)
- skoki warunkowe


Let's Begin:

-----====== a) instalacja SoftIce, wraz z mozliwymi problemami =====-----

Instalacja SoftIce nie sprawia wiekszych problemow i z zalozenia powinna
przebiegac bez bledow i problemow ;-) Podczas tej instalacji nalezy podac
numer seryjny (znajduje sie on w wiekszosci dystrybucji... jesli jednak
go nie ma znajdziecie na stronie producenta czyli... [ Link do strony zewnętrznej. Zarejestruj się lub zaloguj aby zobaczyć link ]).
Nastepnie musimy wybrac rodzja posiadanej przez nas karty graficzenej
(teoretycznie instalator powinien automatycznie wybrac nasz karte, ale
czasami trzeba mu pomoc). Sa tez do wyboru dwie opcje. Pierwsza z nich
oznaczona jako 'Universal Video Driver (SoftIce appears in Window)...',
jak sama nazwa wskazuje pozwala wlaczyc dzialania SoftIce w okienku.
Dla mnie jest to bardzo fajna rzecz, bo mozemy potem dowolnie manipulowac
wymiarami okna, tak azeby bylo widac kawalek normlanego ekranu. W ogole
wlaczanie i wylaczanie debugera przebiega szybciej (im mniejsze okno).
Druga opcja pozwala nam wlaczyc monitor monochromatyczny. Przed przejsciem
dalej musimy tylko jeszcze kliknac przycisk 'test' ;-)
Na nastepnej stronie mozemy zdecydowac czy bedziemy uzywac myszki (musimy
wskazac port pod ktorym ona dziala). Jesli posiadamy myszke z rolkami i
innymi bajerami wlaczamy opcje na dole, SoftIce bardzo ladnie wspomaga
takie bajerki ;-)
Dalej mozemy pozwolic SoftIce'owi azeby dokonal modyfikacji w pliku
autoexec.bat. Teraz pozostaje nam tylko zresetowac komputer ;-)

-----====== b) konfiguracja: =====-----

Wbrew oczekiwania SoftIce jest bardzo prosto konfigurowalny, cala kwestia
polega na opanowaniu parunastu komend ;-)

-----====== plik winice.dat wraz z srednikami =====-----

Ok, teraz chwila uwagi ;-) 90% newbies popelnia opisany nizej blad,
wiec jak mozesz to uwazaj... A wiec tak, azebys mogl uzywac funkcji
API w SoftIce musisz wlaczyc ich ladowanie przez SoftIce. W skrocie
zabieg ten polega na skasowaniu srednikow z pliku winice.dat. Nie
kasuje sie jednak wszystkich srednikow, tylko te w ostatniej sekcji,
oznaczonej jako:

; ***** Examples of export symbols that can be included for Windows 95 *****
; Change the path to the appropriate drive and directory

Plik winice.dat znajduje sie w katalogu gdzie instalowales SoftIce
(standardowo c:\program files\numega\softice\winice.dat). Wyedytuj
sobie ten plik, ponizej tego napisu zobaczyc kolumne mniej wiecej
czegos podobnego do tego:

;EXP=c:\windows\system\kernel32.dll
;EXP=c:\windows\system\user32.dll

Musisz usunac wlasnie te sredniki po lewej stronie ;-) Zrob tak z cala ta
sekcja. Jesli bedziesz kasowal sredniki z innych sekcji SoftIce przy
zalaczaniu bedzie wywal ci blad (spowodowany nie odnalezieniem plikow
WinSDK). Azeby sprawdzic jakie funkcje sa ladowane przez SoftIce uzyj
komendy 'exp parametr'. Parametrem moze nie byc nic, pozwala on zawezic
obszar posuzkiwanych funkcji. Jest to taki filtr ;-) W skrocie wyglada
to tak, ze jak np. nie napiszesz nic to zaleje cie mnostwo nazw. Jesli
jednak uzyjesz jako parametru np. "GetWind" wyswietlone beda tylko
funkcje ktorych nazwa zaczyna sie od tego ciagu znakow.

W pliku winice.dat znajduje sie takze sekcja 'INIT', mozemy tam umiescic
zbior komend wykonywach zaraz po pierwszym zalaczeniu SoftIce. Mozemy
tam umiescic ile tylko komend chcemy, jednak kazda z nich od poprzedniej
musi byc oddzielonej srednikiem (inaczej wszystkie wykonaja sie jako
jedna komenda, a to wiadomo co spowoduje ;-)).

W winice.dat mozemy ustawic jeszcze mnostwo opcji, jak chocby skroty
klawiaturowe itp. Latwiej to jednak zmieniac z poziomu panelu sterowania
dostepnego w loaderze softice (zwanego 'symbol loader').

----===== dostosowanie wygladu softice do preferencji uzytkownika ====----

SoftIce daje sie bardzo latwo dostosowac do wymagan uzytkownika ;-) Ponizej
masz spis komend sluzacych do zmiany opcji:

width xx - zmienia szerokosc okna, standardowo: 80
lines xx - zmienia wysokosc okna, standardow: 30(?)
colors xx xx xx xx xx - zmienia kolory calego SoftIce, standardowo:
07 0B 71 30 02
wc xx - wielkosc okna kodu
wd xx - ---- || ---- danych
wr xx - wlacza/wylacza okno rejestrow

To by bylo w skrocie na tyle, teoretycznie mozna chyba wszystko zmienic,
co sie chce. A przynajmniej ja zawsze robilem z nim co chcialem. Zachecam
do poeksperymentowania z wartosciami, a nastepnie do zapisania winikow
do winice.dat, tak azeby nie trzeba bylo wszystkie za kazdym razem zmieniac.

----====z SoftIce'm, czy bez niego (menu w autoexec'u) ====----

Dobra a wiec SoftIce (SI) dziala mamy okienko, kolorki, firanki i inne bajery..., wiec jak juz wiesz, a jak nie to sie dowiesz ze SI laduje sie jeszcze przed Windows'em i czy tego chcesz czy nie SI bedzie za kazdym razem aktywny gdy uruchomisz komputer. No ale SI spowalnia kompa (bo caly czas dziala w tle), a czasem chcemy w cos pograc lub ogolnie robic inne rzeczy do ktorych SI nam nie jest wogole potrzebny (w koncu caly czas nie bedziemy crackowac ;->). Wiec jak zrobic aby SI sie nie ladowal. Mozna to zrobic na dwa sposoby (tyle mi jest znanych):
.1. Uruchomic komputer, wyedytowc plik 'Autoexec.bat' i przed linijka SI (u mnie C:\PROGRA~1\SOFTIC~1.05\WINICE.EXE) postawic slowko 'rem', zrestartowc komputer i nie ma SI, no ale my nie bedziemy tacy brutalni (zreszta za duzo roboty z tym rem'owaniem) i zrobimy to ladniej
.2. Zrobic w 'Autoexec.bat' tak ze jak uruchomimy kompa to zeby nas sie pytal czy chcemy ladowac SI czy nie, wiec piszemy albo Ctrl+c, i Ctrl+v i wklejamy do Autoexec'a
----------cut here---------
@echo off
cls
echo.
echo **Uruchomienie SoftIce'a**
echo * *
echo * 1. No SI ! *
echo * 2. SoftIce w tle! *
echo * *
echo **************************
choice /C:12 Wybierz cyfre:
IF ERRORLEVEL 2 GOTO soft
IF ERRORLEVEL 1 GOTO bez
GOTO koniec
:bez
GOTO koniec
Confusedoft
C:\PROGRA~1\SOFTIC~1.05\WINICE.EXE
:koniec
---------end cut here------
wklej to na samym koncu w pliku 'Autoexec.bat' i ewentualnie zmien sciezke (na taka jak ty masz) do pliku winice.exe w przedostatniej linijce w tym co powyzej !!!
Zrestartuj kompa no i co... ale ladnie, teraz tylko wciskamy 1 lub 2 zalenie co chcemy !!!!

-----====== c) podstowe komendy (pulapki, szukanie, itp.) =====-----

bpx nazwa_funkcji - zalozenie polapki na wywolanie funkcji nazwa_funkcji

bpx adres - zalozy polapke na adres np. bpx 00402034 zatrzyma
program przy tym adresie

s ds:0 l ffffffff "tekst" - przeszuka pamiec w poszukiwaniu textu 'tekst'

s - kontunuowanie poszukiwania
P.S. Gdy znajdziesz cos o adresie zaczynajacym sie od
8 i C to nie zpisuj tego!!! Jest to pamiec SoftIce i
ekranu!

bpm adres - zalozenie polapki na adres, np. tego wyszukanego przez
SoftIca

bd numer - wylaczenie polapki o numerze 'numer'

be numer - wlaczenie polapki o numerze 'numer'

bc numer - kasowanie polapki o numerze 'numer'

bl - spis polapek, te z gwiazdkami sa nieaktywne

a adres - zmiana kodu w pamieci

d rejestr,adres - wyswietla zawartosc adresu lub zmiennej

? rejestr - pokazuje wartosc rejestru, pozwala takze przeprowadzac
male obliczenia, ale o tym kiedy indziej ;-)

bmsg hwnd funkcja - polapka na wywolanie funkcji okna

bh - wyswietla historie breakpointow

bpio port - polapka na dostep do portu

bpint przerywanie - polapka na wywolanie przerywania

code on/off - wlacza wystwietlanie kodow hexowych komend

cls - czysci ekran

faults on/off - wlacza/wylacza obsluge faults'ow

help - pomoc

i1here on/off - wlacza pulapke na przerywanie #1

i3here on/off - jak wyzej, ale na #3


Reszte komend poznacie z biegiem czasu i potrzeby ;-)


-----====== d) wyjasnienie zagadnien zwiazanych z softicem i debugowaniem w systemie windows =====-----

Debugowanie programow w systemie windows jest w zasadzie bardzo proste ;-)
W skrocie wyglada to tak, ze kazdy program dziala sobie w systemie spokojnie.
SoftIce jednak podpina sie pod niektore zachowania, funkcje etc. (zaleznie
od woli jego zarzadcy). W momecie przejecia kontroli SoftIce program
zostaje zatrzyma, przechodzi w tryb procesora zwany 'step by step'. Wyglada
to tak, ze program wykonywany jest instrukcja po instrukcji, a debuger ma
nad nim calkowita kontrole ;-) Inne procesy dzialaja jednak w tle
(w praktyce dzialaj tylko wtedy gdy zaczniemy poruszac sie po kodzie programu,
lub puscimy go wolno). W momencie uruchomienia SoftIce, nawet zegar systemowy
przestaje dzialac normalnie, dlatego nie dziw sie jak bedzie pokazywal
czas przesuniety o pare godzin ;-)

-----====== e) omownienie roli loadera softice =====-----

Loader dolaczony do SoftIce umozlwia konfiguracje SI, oraz jedna bardzo
ciekawa rzecz. Mianowicie pozwala nam zaladowac program, przez co
bedziemy mogli analizowac go od pierwszej instrukcji. Wystarczy, ze
wybierzemy plik wykonywalny, i przy paru warunkach SoftIce zaladuje
sie na pierwszej instrukcji programu.
Warunki te to: odpowiedni format pliku oraz odpowiednie wartosci sekcji
programu.

-----====== f) system pomocy dolaczony do softice =====-----

Jesli instalowales SoftIce wraz ze wszystkimi skladnikami to bedziesz mial
do dyspozycji calkiem obszerny sytem pomocy ;-) Znajdziesz tam ogolne
informacje o SI, rozpiske wszystkich komend i mase roznych ciekawych rzeczy.
Jak ci sie bedzie kiedys nudzic to zapraszam do lektury.

-----====== g) problemy z uzytkowaniem softice =====-----

SoftIce z racji na wspoldzialanie z systemem Windows ma bardzo duze
sklonnosci do wywalnia bledow i wyjatkow ;-) Trudno jest zebrac
wszystkie problemy jakie moze spowodowac, w skrocie jednak:

- karta grafiki: wbrew pozorom zalezy od niej bardzo wiele ;-) SI ma
bardzo duzo problemow z roznymi nowszymi kartami (jak Riva czy inne).
Azeby cos na to zaradzic najlepiej poeksperymentowac z typami kart.
Mozna takze poszukac na stronie producenta SI, jakis patchy czy poprawek.
W ostatecznosci zmien wersje SI, albo karte ;-)

- mysz: czasami wlaczenie myszy powoduje wywalnie sie SI; takze jesli
przez przypadek ustawisz mysz IntelliMause, a twoja nie bedzie miala
wspomagania tych funkcji, mysz nie bedzie dzialac.

SoftIce moze powodowac jeszcze wiele wyjatkow, gryzc sie z innymi
programami ;-) Czasami moze popsuc jakies pliki, wyswietlac jakies bledy,
zle dane itp.


-----====== h) debugujemy pierwszy program =====-----

No wiec jak sie domyslasz zajmiemy sie test_crackmesem z usmieszkiem...
pierwszym z cyklu... no to do dziela: Mam nadzieje ze pozbyles sie juz
klopotow ze srednikami itp...

Uruchom test_crackme (od Tepe^ - znajdujdziesz je obok tekstu pod nazwa
add2v1.exe ;-)). Masz teraz na ekranie pole w ktorym mozesz wpisac tekst.
No to wpisz cos w pole do tego przeznaczone, ja wpisalem:

muszyn

a ty mozesz wpisac to co ja lub cokolwiek innego, to jest bez roznicy...
klikasz "Sprawdz Wink"... i wyskakuje ci okienko z informacja ze wpisales
zle haslo...
"No i co z tego??" zapytasz...
Otoz to, ze jak wiesz (wiesz?) kazdy program pod windows uzywa do prawie
kazdej operacji funkcji api...
Funkcje api jest to nic innego jak zbior najczesciej uzywanych operacji...
Pozwole sobie zademonstrowac to na przykladzie...
Zalozmy ze piszesz sobie program w asm'ie piszesz i piszesz i piszesz....
az tu nagle potrzebujesz aby wyswietlilo ci sie okienko z tekstem ze jestes
najwiekszym facetem na kuli ziemskiej... i tutaj masz do wyboru dwie opcje:
- albo wywolam funkcje api (jedna linijka tekstu-1 minuta),
- albo napisze to samo co oferuje mi funkcja api w asm'ie recznie (kilkaset
linijek - kilka dni)...

ja osobiscie wybralbym opcje pierwsza... i tak tez robia wszyscy programisci...
Zeby tego bylo malo to nasz kochany debugger (si)... pozwala nam na
"ogladanie", analizowanie i modyfikacje pamieci po jej wywolaniu...
Odbywa sie to mniej wiecej tak ze, najpierw mowisz si po wywolaniu jakiej
funkcji ma "pokazac pamiec"... pewnie powies

z ze lepiej by bylo gdyby nie trzeba mowic si na jakiej funkcji ma sie
zatrzymac. no ale tak musi byc poniewaz ten moj glupi test_crackmes co
zajmuje 5 kb uzywa kilkunastu funkcji api, nie chce tu nawet mowic o
programie co zajmuje kilka mb... ale zszedlem troche z tematu... wiec,
ogladanie pod si odbywa sie (jak juz powiedzielismy wczesniej) po
"powiedzeniu mu" na jakim wywolaniu funkcji ma sie zatrzymac, skladnia
komendy "mowiacej" si na jakiej komendzie ma si

bpx nazwa_funkcji_api

czyli np.:

bpx GetDlgItemTextA (jedna z funkcji na pobranie tekstu)

Oczywiscie pojawia sie problem jakiej funkcji api uzyc do czego... hmm...
do kazdej operacji win posiada kilka funkcji api, rowniez do pobrania
tekstu (bo to nas teraz interesuje)... (patrz. w katalogu extras sa rozne
przydatne rzeczy, jak rowniez spis najczesciej uzywanych funkcji api i ich
zastosowanie) a teraz trzeba wybrac odpowiednia... bo niewiemy przeciez
jakiej uzywa program... mozemy rowniez zrobic sobie macro... ale o tym w
"extras"... wiec zajrzyj jesli cie interesuje "odgadywaniu" jakiej funkcji
api uzywa moj test_crackmes. Musisz wiedziec ze do pobrania tekstu
najczesciej uzywane sa dwie nastepujace funkcje api:

GetDlgItemTextA oraz GetWindowTextA

No to chyba juz sobie wyjasnilismy pewne rzeczy wiec mozemy w zasadzie
przejsc. do dziela, albo nie jeszcze jedno. Popatrz na pulapke ponizej:

bpx GetDlgItemTextA

Nie omowilem skladni tej komendy wiec zrobie to teraz. "bpx" oznacza w
wolnym tlumaczeniu "przerwij na podanym argumencie" a znowu argumentem moze
byc funkcja api jak rowniez adres w pamieci... w powyzszym przykladzie
argumentem jest funkcja api GetDlgItemTextA... rozumiesz?? jesli nie to
przeczytaj do konca ten tekst a potem zadawaj pytania Smile)

------------------------
PRZEJDZMY DO KONKRETOW
------------------------
Jak juz powiedzielismy wczesniej do prawie kazdej operacji w win program
wykorzystuje funkcje api to jesli juz to wiemy to przeanalizujmy co robi
nasz test_crackmes. Po jego uruchomieniu wpisujesz haslo... a haslo jest
niczym innym jak tekstem... no nie?? Ale.. pamietasz?? gdy wpisales haslo
i kliknales "Register Me" pokazalo ci sie okienko o blednie wpisanym hasle...
no wiec tu nasuwa sie pytanie, skad taki program wie ze wpisalem dobre czy
zle haslo?? Musi je chyba gdzies pobrac. Porownuje je w pamieci, a ty po
odpowiednim "szukaniu" znajdziesz miejsce gdzie on to robi i po sprawie...
No to wyniki analizy sa nastepujace:

1. Najpierw program musi pobrac tekst z pola edycyjnego (to tam gdzie
wpisujesz ten tekst),
2. Nastepnie musi porownac wpisany string (ciag znakow) z prawidlowym,
3. Jezeli sa takie same powie ze wpisales prawidlowe haslo a jesli rozne
to wykrzyczy ze podales zle haslo.

-----------------------
CZAS NA POSZUKIWANIA
-----------------------
No to poszukajmy w pamieci miejsca gdzie to porownuje. Wcisnij ctrl-d lub
F5 przy zaladowanym SoftIce. I teraz w polu umieszczonym najnizej okienka
ktore sie pojawilo wpisz ten tekst a jesli nie masz w nim widocznego kursora
wcisnij F6. I teraz wpisz w nim:

bpx GetWindowTextA

i potwierdz te operacje enterem. Wybralem ta funkcje api poniewaz
test_crackmes jej uzywa i tyle. Jesli to zrobiles to teraz ctrl-d, uruchom
test_crackme, wpisz haslo, i kliknij "Sprawdz Wink" i co?? ...teraz pojawilo
ci sie okienko si no to teraz pozwol mu wyjsc z funkcji, wiec nacisnij F11
teraz masz przed oczami ponizszy kod a jesli chcesz dobrze lamac to musisz
rowniez dobrze analizowac kod wiec przeanalizujmy:

015F:0040124F E8D6000000 CALL USER32!GetWindowTextA

tutaj masz wywolanie funkcji api na ktora zastawiles pulapke.
Call - oznacza wywolanie podprogramu, a w tym przypadku jest to wywolanie
funkcji, moglby to byc np. adres w pamieci to wtedy wykonal by sie skok w
okreslone miejsce gdzie zaczyna sie ten wlasnie podprogram, nastepnie:

015F:00401254 56 PUSH ESI
015F:00401255 57 PUSH EDI

Komenda push "kladzie" wartosc argumentu (w tym przypadku rejestru) na stos.
Stos jest to takie miejsce w pamieci ktore mozna porownac do stosu ksiazek,
czyli ostatnia polozona ksiazka na stosie jest zarazem pierwsza na tym stosie,
czyli jest u samej gory. Sprobuj sobie ulozyc kilka ksiazek w kolumnie.
Zalozmy mamy ksiazki A, B, C, D, E i na stos kladziemy je w kolejnosci
alfabetycznej czyli od A do E, wiec na samej gorze stosu ksiazek bedzie
ksiazka E. I zrobmy taka chierarchie, aby zdjac przedostatnia wartosc
polozona na stosie musisz zdjac najpierw ostatnia na nim ulozona, a
przekladajac na ksiazki, aby zdjac i nastepnie manipulowac ksiazka D musisz
najpierw zdjac ksiazke E. Rozumiesz?

015F:00401256 33F6 XOR ESI,ESI
015F:00401258 33FF XOR EDI,EDI

tutaj mamy zastosowana bardzo czesto stosowana instrukcje xor. W tym
przypadku zerowane sa rejestry ESI i EDI ale zeby wiedziec czemu musisz
wiedziec jak dziala ta komenda. A oto zaleznosc:

A xor B = C
A xor C = B
B xor C = A

inaczej:

1 xor 1 = 0
1 xor 0 = 1
0 xor 0 = 0

Teraz przeanalizuj zaleznosc jaka stosuje instrukcja xor... juz masz?? no
to moge tlumaczyc dalej... W kazdym rejestrze jest jedna wartosc, co jest
chyba oczywiste, i wg zaleznosci ukazanej wyzej jezeli xorujemy ze soba
takie same wartosci to wynikiem bedzie zero a jezeli rozne to jakas tam
inna wartosc. Xorowanie jest operacja na bitach, czyli jezeli w esi mam:

1101

to wykonujac operacje: xor esi, esi wykonuje taka operacje:

1101 xor 1101 = 0000

Jesli zas bym wykonal operacje:

xor esi, edi

przy czym esi=1100, a edi=0101 to w wyniku takiej operacji otrzymam:

1100 xor 0101 = 1001

mozna to rowniez ukazac w ten sposob:

1 xor 0 = 1
1 xor 1 = 0
0 xor 0 = 0
0 xor 1 = 1

a wynik takiej operacji bedzie zawieral sie w rejestrze esi, a dlaczego??
zapytasz... otoz dlatego ze jest on po lewej stronie, a jest tak przewaznie
ze do argumentow ktore sa po lewej stronie sa wkladane wyniki poszczegolnych
operacji... Rozumiesz juz??
Mam przynajmniej taka nadzieje...

015F:0040125A BE3B304000 MOV ESI,0040303B

Teraz widzisz najczesciej uzywana instrukcje wiec chyba warto ja objasnic.
Mov jest instrukcja przesylu danych czyli jesli ta instrukcja sie wykona to
wartosc 0040303B (hex) zostanie przeslana do rejestru ESI. 0040303B jest
adresem w pamieci a zeby sprawdzic co znajduje sie pod tym adresem uzywamy
komendy

d adres_ktory_chcemy_sprawdzic_moze_byc_to_rowniez_r ejestr

czyli wpisujemy:

d 0040303B

potwierdzamy enterem i w okienku edycji widzimy wiele mowiaca nazwe "pass".
A teraz powiesz ze "no pewnie, pass jest ale rowniez setki innych liter,
wiec dlaczego dla nas liczy sie tylko slowo pass".. dlatego ze widzisz slowo
pass, jednobajtowa przerwe i dalsze wartosci. Zobacz tam gdzie sa
odpowiedniki hex znakow, odpowiednik tej przerwy... juz masz?? i co teraz
widzisz?? no pewnie.. zero (czyt. NULL), a wiec wniosek nasuwa sie sam. Nas
interesuja bajty od tego na ktory wskazuja, rozumiesz?? To co po NULL nas
juz nie interesuje... Wpisz teraz:

d esi

potwierdz enterem i co?? nie ma nic, a teraz F10 aby ta instrukcja sie
wykonala czyli zebys mial podswietlona nastepna linie kodu. Juz masz?? ...
to dobrze.. wiec teraz jeszcze raz:

d esi

i co?? widzisz teraz to samo co miales pod adresem 0040303B, bo jesli sie
przyjrzysz w okienko rejestrow to w rejestrze esi zobaczysz wlasnie ta
wartosc.... juz chyba nie musze dalej tlumaczyc...

015F:0040125F BF28314000 MOV EDI,00403128

tutaj jest ta sama instrukcja jak wyzej, tylko ze przeznaczenie jest inne
tzn. jest wykonywana na innych rejestrach, adresach itp...
Nie bede tu duzo opisywal, wystarczy ze wpiszesz:

d 00403128

i wszystko sie wyjasni.. juz sie wyjasnilo?? ..no .. to sam widzisz ze pod
tym adresem jest haslo ktore ty wpisales...

015F:00401264 8B3F MOV EDI,[EDI]
015F:00401266 8B36 MOV ESI,[ESI]

nastepnie... jest... znow mov?? ile razy moze byc wykonywana ta sama
instrukcja?? no moze byc bardzo duzo razy wykonywana... tylko ze tutaj ma
inne dzialanie... ktore juz opisuje...

mov esi, jakas_wartosc

dziala w taki sposob ze w rejestrze esi (patrzac na okno rejestrow) widnieje
ta wartosc... natomiast gdy zastosowana zostanie skladnia:

mov esi, [jakas_wartosc]

to jakas_wartosc bedzie potraktowana jako adres w pamieci a do rejestru esi
bedzie przeslana wartosc spod tego adresu... a dokladniej cztery bajty bo
tyle potrafi pomiescic rejestr... czyli w przypadku naszej instrukcji
gdzie w esi jest adres slowa "pass" do rejestru esi sa przesylane pierwsze
cztery bajty spod tego adresu w postaci hex (of course)... czyli dla slowa
pass jest to:

73 73 61 70

sprawdz tablice znakow ascii (extras) w odpowiedzi dlaczego sa to takie
wartosci...

Przy instrukcji

mov edi, [edi]

jest wykonywane to samo tylko ze.... z WPISANYM haslem...
nastepne dwie linijki mowia wszystko:

015F:00401268 3BF7 CMP ESI,EDI
015F:0040126A 7417 JZ 00401283

Instrukcja cmp porownuje ze soba dane podane jako jej argumenty i jesli sa
rowne to ustawia flage Z, a jesli sa rozne to jej nie ustawia...
Flagi a innymi slowy rejestry flagowe sa inaczej rejestrami nawigacyjnymi.
Sa to proste rejestry wskazujace 1 lub 0 (+ lub -, tak lub nie, prawidlowy
lub nieprawidlowy itd...). Flagi w SoftIce umieszczone sa w prawym gornym
rogu jego okna. Mogles potraktowac je jako tekst o niewiadomym znaczeniu w
ktorym czasem zmienia sie wielkosc liter bowiem wszystkie rejestry flagowe
tworza tekst:

O D I T S Z A P C

Flaga ustawiona w softice charakteryzuje sie tym ze jej litera jest wieksza
od pozostalych i zazwyczaj wyroznia sie odmiennym kolorem. Dokladne poznanie
dzialania rejestrow flagowych i ich zastosowania jest niezbednym elementem
przy crackowaniu korzystajac z debuggera. Flagi mozna oczywiscie recznie
ustawic lub nie ale o tym pozniej.

Nas interesuje wynik porownania a wiadomo ze bedzie negatywny czyli ze to
co wpisales jest rozne od slowa pass... ale nic lecmy dalej...
Wszystkie instrukcje zaczynajace sie na "j" sa skokami. Skoki dzielimy na
skoki warunkowe i skoki bezwarunkowe.
Skok bezwarunkowy znany mi jest tylko jeden a jest nim: "jmp".
czyli skok bezwarunkowy charakteryzuje sie tym ze bez wzgledu na wszystko
gdy tylko bedzie mial szanse sie wykonac to sie wykona, innymi slowy jesli
podswietli ci sie instrukcja:

jmp jakis_adres

to skok sie wykona... w zasadzie to instrukcje call i ret sa uznane jako
skoki bezwarunkowe ale ja tak ich nie nazywam... poprostu maja niestandardowe
zastosowanie...
Skokow warunkowych jest ok. 20. Skok warunkowy (jak sama nazwa wskazuje)
aby sie wykonal lub nie musza byc spelnione jakies warunki, czy to ustawiona flaga
Z czy wynik porownania musi byc mniejszy lub wiekszy od okreslonej wartosci...
W zasadzie to instrukcja majaca postac:

jxx lub jx (gdzie x to odpowiednia literka)

wykluczajac jmp jest skokiem warunkowym.
Teraz opisze dzialanie skoku "jz", jest skokiem warunkowym wykonujacym sie
(skaczacym) jesli flaga Z jest ustawiona. Jesli nie jest to po prostu skok
sie nie wykonuje. Wczesniej napisalem ze jesli instrukcja cmp wypadnie
pomyslnie to ustawi flage Z a my przez porownanie ktore wypadlo negatywnie
(flaga Z nie ustawiona)... i najedzmy wlasnie na ten skok

jz xxx

Pamietamy ze wczesniej porownywane byly pierwsze cztery bajty naszego hasla
ze slowem pass... wiec zapisz sobie to slowo..

---
PAMIETAJ!!!
Jesli jakas wartosc jest porownywana, jesli cos robione jest z twoim haslem
podczas rejestracji to jest to napewno bardzo wazne i warto to przeanalizowac...
---

Teraz skok "jz" sie nie wykona... no ale nic lecimy dalej...


015F:0040126C 6A00 PUSH 00 <-------(1)
015F:0040126E 68A4304000 PUSH 004030A4
015F:00401273 6894304000 PUSH 00403094
015F:00401278 6A00 PUSH 00
015F:0040127A E8B3000000 CALL USER32!MessageBoxA
015F:0040127F 5F POP EDI
015F:00401280 5E POP ESI
015F:00401281 EB19 JMP 0040129C
015F:00401283 6A00 PUSH 00 <------(2)
015F:00401285 68A4304000 PUSH 004030A4
015F:0040128A 6844304000 PUSH 00403044
015F:0040128F 6A00 PUSH 00
015F:00401291 E89C000000 CALL USER32!MessageBoxA


Skok "jz" skoczyl by do instrukcji (2) a tam po chwili jest wywolanie
funkcji api: MessageBoxA
ktora jest odpowiedzialna za wyswietlenie jakiegos komunikatu... ale
coz my jestesmy przy instrukcji (1) a wiec zobaczmy co sie stanie...
dochodzisz do wywolania MessageBoxA i przechodzisz przez tego call'a po
czym.... zostajesz "wyrzucony" z si i ukazuje si sie haselko ze wpisales
bledne haslo.. po czym test_crackmes konczy swoje dzialanie... no wiec
musisz robic wszystko od poczatku... tylko ze teraz pojdzie szybciej a ja
tymczasem pozwole sobie przeanalizowac wnioski...

1. Zalozylismy pulapke na GetWindowTextA.
2. Stwierdzilismy ze w edi jest nasze haslo.
3. Stwierdzilismy ze w esi jest slowo "pass".
4. Wykonywane jest porownanie zakonczone negatywnie.
5. Skok do drugiego messagebox'a sie nie wykonuje... natomiast dochodzimy
do pierwszego messagebox'a i otrzymujemy wiadomosc o zle wpisanym hasle...

Czyli tak. Mamy dwa messagebox'y z ktorych pierwsze mowi o zle wpisanym hasle
a drugie to mozna sie domyslic co... Wynik porownania jest negatywny...
skok sie nie wykonuje... otrzymujemy informacje o zle wpisanym hasle...
wiec jakbysmy wpisali jako haslo "pass" to porownanie wyszlo by pomyslnie
(flaga Z bylaby ustawiona) i skok "jz" by sie wykonal. Mamy solidne podstawy
aby przypuszczac ze "pass" jest prawidlowym haslem... bo coz innego moze byc
pod drugim messagebox'em jesli sa tylko dwa a pierwszy mowi o blednie
wpisanym hasle... wiec sprobujmy wpisac to slowo jako haslo. I co?
Wlasnie tak, zarejestrowales po raz pierwszy w zyciu crackme... jesli
widzisz taki tekst "Gratulacje, ten kod jest wlasciwy" to ta rejestracja
jest pomyslna ;-)

To by bylo na tyle ;-)
Odpowiedz

[-]
Szybka odpowiedź

Disable AutoMedia embedding for this link.   MP3 Playlist

Weryfikacja przeciw botom
Zaznacz pole wyboru znajdujące się poniżej. Ten proces pozwala chronić forum przed botami spamującymi.

Podobne wątki
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  IDA - potezne narzedzie w doswiadczonych rekach brunet 0 730 12-01-2010, 17:27
Ostatni post: brunet
  Mniej znane mozliwosci SoftIce brunet 0 604 12-01-2010, 17:27
Ostatni post: brunet
  W32Dasm - konfiguracja i uzytkowanie brunet 0 1,024 12-01-2010, 17:23
Ostatni post: brunet

Użytkownicy przeglądający ten wątek:

1 gości