LEKCJA_1(9).TXT

(24 KB) Pobierz
Lekcja nr 10.Mniej znane mozliwosci SoftIce.



Witam kursantow.Wiec ten tut moglby ograniczyc sie do przeczytania "SoftIce Command Reference" :).
Ale ze mam dobre serducho podam wam kawe na lawe.
Podzielilem go na cztery czesci :
a) komendy integralne softice'a
b) komendy dostepne po zainstalowaniu odpowiedniej "nakladki"
c) tips&tricks
d) spis dodatkow


a)

MACRO  

Definiuje nowe makro lub pokazuje liste aktualnie dostepnych.Potezna komenda :) Pozwala nam tworzyc nowe komendy,automatyzuje zadania.

Skladnia:     MACRO [nazwa-makra] [*]|[="tresc makra"]

Nazwa makra ma sie skladac z 3 do 8 znakow.SIce interpretujac nazwe makra nie zwracajac uwagi na male i duze litery,takze jesli masz makro o nazwie BPMBA, na linii polecen mozesz rownie dobrze napisac BpMbA, a makro zostanie wykonane.Nie musze dodawac ze nazwy makr nie moga sie pokrywac z nazwami komend SI? W tresci makra moze znajdowac sie wiecej niz jedno polecenie, odzielamy je od siebie srednikiem(;).Maksymalna ilosc makr do zdefiniwania to 256(standardowo jest ustawione na 32).Makra mozna dodawac w symbol loaderze menu Edit/SoftIce Initialization Settings/Macro Definitions.
Przykladowe makro szukajace stringa w pamieci: 
:macro sserialB="s 00400000 l 7FFFFFFF \"1234321\""
Zeby zagniezdzic w makrze tekst w cudzyslowie robisz to uzywajac backslash'a jak w przykladzie.
Do makra mozna przekazywac argumenty:
:macro pulapki="bpx %1;bpx %2"
a uzywasz tego makra w sposob nastepujacy:
:pulapki GetWindowTextA GetDlgItemTextA
z pomoca makra z argumentami mozesz stworzyc jednorazowo wywolana pulapke na jakikolwiek adres zazadasz.Mozna to zadanie oczywiscie wykonac komenda G adres, ale my chcemy zalozyc pulapke korzystajaca z DR ( czytaj c) ).
:macro jedenraz="bpm %1 x do \"bc bpindex\""      
Przejdzmy do edytowania i kasowania makr.
macro [nazwa_makra] *         kasuje makro o nazwie <nazwa_makra> 
macro *                       kasuje wszystkie makra
macro [nazwa_makra]           edytuj makro 
macro                         pokaz wszystkie makra 


WATCH 

Ta komenda daje Ci mozliwosc ciaglego monitorowania jakiegos wyrazenia.Dla przykladu ustawiasz watch'a na wartosc EAX w kodzie rozpakowujacym.Ten ciagly podglad moze dac Ci wieksze szanse na znalezienie OEP (Original Entry Point).
Skladnia:	WATCH wyrazenie
W wyrazeniu moga znajdowac sie symbole,nazwy rejestrow,adresy pamieci.Komenda WW wlaczasz/wylaczasz okno Watch'a ,kombinacja ALT+W pzrenosisz sie do okna watch i teraz mozesz sie poruszac strzalkami po jej elementach (delete kasuje element z listy).W kazdej linii znajduje sie opis wyrazenia ,typ wyrazenia(jesli SI nie moze okreslic ,wyswietla DWORD), oraz aktualna wartosc.Plus przed typem swiadczy o tym ze mozesz rozwinac menu w poszukiwaniu wiekszej ilosci informacji.
przyklad:
:watch zfl
Od tej chwili w oknie watcha masz staly podglad flagi zerowej procesora, przydatne :)


DATA

SIce obsluguje do 4 okien danych.Komenda DATA sluzy do wyboru okna. 
Skladnia jest nastepujaca:

data [numer_okna]

Wywolanie bez parametru spowoduje ukazanie nastepnego okna.Do wyboru mamy cztery okna ponumerowane od 0 do 3.


FORMAT

Tym poleceniem zmieniamy sposob prezentownia danych w aktualnym oknie danych.
Skladnia :   format 
Zmiana jest cykliczna ,w porzadku od byte ,word,dword,short real,long real,do 10 bajtowy real.Po ukazaniu ostatniej pozycji nastepne wywolanie format ukazuje dane w bajtach.
Szczegolnie przydatna zmiana moze sie okazac z dwrd'a na bajty przy konwertowaniu adresu w pamieci na adres w pliku.


DEX

Komenda laczaca okno z jakims wyrazeniem.

Skladnia: dex [ numer_okna_danych [wyrazenie] ]

Polecenie przydatne jesli wiesz ze pod jakims adresem lub w rejetrze jest wskaznik ciagle zmieniajacego sie adresu, a ty chcesz miec reke na pulsie i wiedziec o kazdej zmianie wartosci i miec podglad warosci spod tego wskaznika.
Przyklad:
dex 3 ss:esp
Stos w trzecim oknie :)
dex                       ukazanie wszystkich wyrazen zwiazanych z okami danych 
dex [numer_okna_danych]   kasuje przypisanie wyrazenia do okna


DO

Ta komenda bedzie mocno wykorzystywana w czesci c).Wystepuje w polaczeniu z pulapkami , jesli pulapka sie zlapie wykonywane sa czynnosci wskazane w cudzyslowie
....do "wyrazenie wykonane po zlapaniu pulapki"
Kropki zastepujesz definicja pulapki.


OPERATOR PODKRESLENIA 

Operator podreslenia(_) jest uzywany do okreslenia wartosci rejestru lub wyrazenia w definicji pulapki, wiec dla przykladu 
_eax
bedzie aktualna wartoscia rejestru eax.

ADDR

Windows jest systemem wielozadaniowym , wiele zadan(programow) dziala w tym samym czasie a kazdy ma swoje miejsce w pamieci.Znaczy to ze kazdy proces ma wlasny kod umieszczony we wlasnym obszarze zadania, to samo tyczy sie danych, wiec jezeli zlapiesz SI moze sie okazac ze jestes w zadaniu ktore Cie wogole nie interesuje.W takim wypadku nie dostaniesz sie do kodu ktorego szukasz, tylko do kodu zadania na ktorym wlasnie zlapales SI.Z pomoca przychodzi ADDR , pozwala przelaczyc sie do obszaru zadania do ktorego chcesz.

Skladnia:
:addr  [uchwyt_kontextu | nazwa_procesu]

Wywolanie ADDR bez parametru wyswietli liste wszystkich dostepnych kontekstow,zaczynajac od aktualnie aktywnego kontextu.
Kontekst procesu jest struktura w ktorej zapisane sa najpotrzebniejsze informacje do dzialania procesu, jak informacje o rejestrach, wskaznik do memory context(opisuje mapowanie pamieci), zawiera rowniez liste modulow uzywanych przez proces(w tej chwili chce podziekowac coxoc'owi za pomoc w zrozumieniu tych pojec).Jednak informacje o aktualnie aktywnym kontexie 
zapewne nas nie interesuja.Dlatego chcelibysmy miec dostep do adresu jakiegokolwiek uruchomionego procesu, poprostu zmienic 
strone.To wlasnie czynimy wywolujac ADDR z nazwa procesu nas interesujacego.
Zobaczmy co sie wyswietla bez podawania argumentu:
- adres uchwytu kontextu 
- adres private page table entry array (PGTPTR) kontextu 
- liczba wpisow tablicy PGTPTR 
- poczatkowy i koncowy linearny adres reprezentowany przez kontext
- adres obiektu mutex uzywanego do kontroli dostepu do tablic stron kontextu 
- nazwa procesu ktorego jest kontext 
Ciekawym zjawiskiem jest to , kiedy nastepuje zmiana kontextu windows kopiuje informacje z tablicy PGTPTR do swojego katalogu stron wskazywanego w rejestrze CR3.To powoduje adresowanie obszaru virtualnej pamieci ponizej 2GB, to jest wszystkie adresy z zakresu 0 do 7FFFFFFFh sa przemapowane zgodnie z nowym kontextem a dane procesu sa do wgladu.
Ciekawymi informacjami sa rowniez pola minAddr i maxAddr, ktore reprezentuja minimalny adres liniowy adresu kontextu oraz maxymalny adres liniowy adresu kontextu.

QUERY

Skoro przelaczyles sie do obszaru adresowania jakiegs procesu, QUERY da ci informacje o stronach pamieci tego kontextu.

Skladnia:

query  [ [-x]  adres ] | [ typ_procesu ] 

-x              Pokazuje mapowanie wyszczegolnionego adresu linearnego wewnatrz kazdego kontextu w ktorym jest spelniony

adres  		Adres linearny do sprawdzenia
typ_procesu     wyrazenie ktore moze byc traktwane jako nazwa procesu.

Bez parametrow wyswietli sie wirtualna mapa adresow aktualnego procesu(lub innego procesu wyszczegolnionego przez ADDR).
Jesli uzyjesz parametrow , mozliwe jest ujrzenie informacji o mapowaniu konkretnego adresu linearnego.Po co to?Przypuscmy ze masz plik PE i cos jest w nim namieszane, mozesz sie dowiedziec gdzie w pamieci sa lokowane sekcje.Jesli wiesz jaki jest wirtualny rozmiar sekcji PE (rozmiar jaki powinny miec po zaladowaniu do pamieci), mozesz zdobyc wazne info o procesie.

STACK

Ta komenda uzywana jest do pokazania stosu wywolan procesu.Jest to lista ostatnio wykonanych call'i w obrebie procesu.
Powodem dlaczego nazywa sie to stosem nie jest to ze informacje sa sciagane ze stosu , tylko dlatego ze podobny jest mechanizm kolejkowania call'i ,czyli LIFO (Last In First Out).Z technicznego punktu widzenia, komenda ta przeszukuje stos rozpoczynajac od aktualnej ramki stosu (SS:EBP), znajduje aktualna ramke funkcji i szuka adresu powrotu funkcji,kiedy to zrobi wraca do wywolujacego i powtarza cala serie krokow.W skrocie dostajesz liste wywolan wszystkich funkcji , ktore doprowadzily Cie do miejsca w kodzie przed wywolaniem komendy.


SHOW/TRACE/XRSET/XT/XP/XG 

Grupa rozkazow uzwana do tzw. backtrace buffer'a (bufora sledzenia wstecz, dalej zwanego poprostu buforem).Czasami chcielibysmy wiedziec jak wygladalo wykonywanie programu przed tym jak SI zlapalo sie na jakiejs pulapce(albo z zuplenie innego powodu).Backtrace buffer moze nam w tym pomoc, jest jednak jeden warunek , trzeba wszystko dobrze poustawiac.Powodem tego jest ograniczony wielkoscia bufor do przechowywania instrukcji, dlatego tez musimy ograniczyc zakres logowania do ustalonego obszaru(im mniejszy tym lepiej,ze zwiekszeniem obszaru logowania zmniejsza sie szybkosc pracy komputera, niezaleznie od jego mocy obliczeniowej oraz pamieci).
Gdy bedziemy juz mieli w buforze instrukcje , mozemy je podgladac, sledzic , uzywajac komend sledzenia w trybie symulacji.
Zaczynamy wiec.Najpierw ustawiamy zakres logowania:
:bpr xxxxxxxx yyyyyyyy T [W]
x'sy to poczatek y'ki koniec naszego przedzialu pamieci.Parametr T daje nam mozliwosc pisania w tym obszarze.Flagi W uzywamy jesli chcemy aby do bufora trafialy wszystkie instrukcje powodujace wywolanie pulapki.
Mamy juz bufor teraz chcemy nim w jakis sposob manipulowac.Wyczyscmy najpierw bufor, dla pewnosci zeby nie bylo w nim zadnych smieci, czyszczenie wazne jest rowniez przy wielokrotnym uzywaniu bufora.Pomysl , ustawiamy sobie jakis przedzial do logowania , chwile pozniej nastepny ale troche mniejszy, i teraz w buforze beda znajdowaly sie instrukcje z aktualnego przedzialu jak i tego wczesniejszego.Pamietaj zeby zawsze przed rozpoczeciem logowania wyczyscic bufor.Wiec czyscimy:
:XRSET
Czyszczenie mozliwe jest jesli nie korzystasz z symulacji wstecznego s...
Zgłoś jeśli naruszono regulamin