Lekcja nr 8.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 sledzenia.Nie mozesz go wyczyscic sledzac kod z bufora, musisz najpierw wyjsc z symulacji.Jestesmy gotowi logowac instrukcje.Wychodzimy wiec z SI.Nie mozna podgladac bufora do momentu wyskoczenia SI.
Powiedzmy ze chceszz wiedziec jakie operacje wykonal program przed wysietleniem message boxa , zastawiasz wtedy tylko pulapke na wywolanie na MessageBoxA.Z instrukcjami w buforze mozesz zrobic dwie rzeczy, zobaczyc ich historie , lub przejsc do trybu symulacji.Ale najpierw wyjasnie jak sa adresowane instrukcje w buforze.Wiec kazda instukcja ma swoj indeks.Im mniejszy jest numer indeksu(minimalnie rowny 1) tym instukcja jest nowsza lub innymi slowy blizsza ostatniej intrukcji w buforze.Instukcja z indeksem 1 jest ostatnia z przedzialu do logowania w buforze.Wazne jest to ze mozesz podgladac lub sledzic kod nie koniecznie od poczatku bufora ale od dowolnej instrukcji w tym buforze , podajac jej index(nie podajesz ile bajtow od poczatku bufora ma sie przsunac,tylko liczbe intrukcji o jakie sie przesunie).Podgladasz bufor w ten sposob:
:show [ b | start ] [ L length]
start to liczba w hexah od ktorej ma zaczac pokazywac(liczac od jawiekszego inedexu czyli 1) , zamiast tej flagi mozna podac b(rownowazne start=najstarsza instrukcja).Lenght to liczba instrukcji jaka ma byc wyswietlona.Sprobujcie show 0

.Instrukcje w buforze pozostana do momentu kiedy ich nie wyczyscicie poleceniem XRSET , albo zostane nadpisane przez kolejne instrukcje(wtedy intrukcja najbardziej aktualna przesunie sie w dol,zwiekszy sie jej indeks powstanie chaos i zamieszanie , jak nam miejsca w buforze zabraknie to znikna cakowicie :-).Mozna napisac makro do czyscczenia bufora: macro xclear="xrset;x" , zmapowac je pod klawisz? Podgladanie podgladaniem , ale przejdzmy do ciekawszej
instrukcji czyli TRACE , pozwalajacej sledzic instrukcje z bufora.
:trace [ b | off | start ]
b jak wyzej.Off jesli konczymy sledzic , start jak wyzej.Dla przykladu jesli chcemy sledzic od 50 instrukcji(oczywiscie od konca, 50 w dec = 32 w hex) to piszemy:
:trace 32
Do sledzeniu kodu w buforze uzywamy komend:
XT jak T przy normalnym sledzeniu (wykonaj jedna instrukcje)
XP jak P przy pracy krokowej,czyli przeskocz (przejdz jedna instrukcje wywolanie funckji lub intsr. rep)
XG jak G w normalnym trybie (idz do podanego adresu).
W trybie symulacji komendy T/P/G/X/HERE i XRSET nie moga byc uzywane z wiadmomych przyczyn.
Niestety w trybei symulacji nie zmieniaja sie wartosci rejestrow (oprocz EIP), byloby to zbytnim obciazeniem dla systemu aby po kazdej instrukcji przywracac ich wartosci.Jesli w przedziale jest skok poza przedzial do sledzenia , instruckje te nie beda logowane w buforze.
ZAP
Ta komenda zastepuje instruckje INT1 oraz INT3 Nop'ami.
Skladnia: ZAP
WMSG
Po wprowadzeniu tej komendy , zobaczysz dluga liste nazw i numerow.Kazda linia to typ wiadomosc, przesylana przez system do procedury okna ("window procedure").Dla przykladu popatrz na ostatnia linie ,co widzisz? WM_DDE_EXECUTE , a po lewej stronie wartosc 03E8.Wiec ten numer jest wlasciwa wartoscia jaka trafia do procedury okna.Sprawdz to:
:? WM_DDE_EXECUTE
b)
Owa nakladka , zreszta najbardziej rozbudowana jest IceDump ( ja uzywam wersji 6.022 , jest dolaczona do tej lekcji).
Zastanawialem sie czy podawac opis tych komend.Jest on bardzo dobrze wytlumaczony w dokumentacji IceDump'a.Uzycie innych nakladek jest rownie intuicyjne , takze nie ma sie co rozpisyawac jesli i tak nikt nie bedzie tego czytal.Jesli chcecie
miec te sekcje to napiszcie.
W wersji ktorej uzywam ID jest w postaci samoladujacego VxD'ka,mozesz dodac wpis do Autostartu aby z kazdym uruchomieniem komputera miec dostep do tych komend (albo napisac pik wsadowy , do wyboru do koloru).Odladowuejsz ID wywolujac icedump.exe
z argumentem u.
c)
Przy probie lamania jakiegos programu z zabezpieczeniem typu serial , standartem na dzisiaj jest zgadywanie z jakich korzysta funkcji API , lub tez wglad do tablicy importow ( jesli prog nie jest czyms spakowany , zreszta jak jest to czytaj lekcje "xx" -!poprawka!- niech to ktos naprawi ) i wybor tych najbardziej prawdopodobnych , zreszta w ostatecznosci mozesz uzyc hmemcpy.
Po przesledzeniu lekcji 2 wiesz jak zakladac proste pulapki.Czyli mamy np.
:bpx MessageBoxA
Czasem przydaje sie zalozyc pulapke , ktora nie odwoluje sie bezposrednio do jakiegos API.
Zobacz:
:bpx MessageBoxExA-3
Taki wariant gwarantuje zlapanie sie na ostaniej instrukcji MessageBoxA.
Dlaczego zapytasz? Ano dlatego ze MessageBoxExA jest nastepna po MessageBoxA funkcja w user32.dll, a dlaczego odejmujemy watrosc rowna 3 ? bo tyle zajmuje ostatnia instrukcja MessageBoxA ( RET 0010 -> 3 bajty ).Mozesz to sprawdzic:
:u MessageBoxExA-3
A jakby tak dopisac cos jeszcze do naszej pulapki , tak zeby pokazywala nam np. komunikat wyswietlany w oknie ? Nic prostszego:
:bpx MessageBoxExA-3 do "db *(esp+8)"
Dodane wyrazenie do "db *(esp+8)" mowi sice aby pokazal w oknie danych (w formacie db,czyli bajty) to co wskazywane jest pod esp plus 8 bajtow(HWND i LPCTSTR sa typu DWORD , czyli 4+4).Taki zapis zwiazany jest to epilogiem i prologiem funkcji.Prolog funkcji potzrebny jest do zarezerwowania miejsca na stosie dla zmiennych lokalnych, a epilog do zwolnienia tej pamieci i przywrocenia poprzednich wartosci rejestrow.
Prolog:
Push EBP ; zachowuje wartosc EBP
Mov EBP,ESP ; zachowuje wartosc ESP do EBP
Sub ESP,XXX ; rezerwuje pamiec
Po kolei , zachowujemy wartosc EBP , gdyz bedzie on uzywany w nastepnej instrukcji(w dalszej
czesci funkcji zapewne tez).Nastepnie kopiujemy wartosc ESP do EBP.
Pomoze nam zobrazowanie stosu.
nizsza pamiec wyzsza pamiec
------------------wart_ESP_zachowana_do_EBP-------------------------------------------------
zm_lokalne | zm_lokalne | arg_funk | arg_funk | inne_dane | inne_dane
-------------------------------------------------------------------------------------------
wierzcholek stosu dno stosu
Widzimy wiec ze stos rosnie w kolejnosci odwrotnej do kolejnosci adresow w pamieci.Patrzac na obrazek (???) widzimy ze jezeli mamy wieksze ESP to wiecej na stosie zmiescimy(mniej na nim jest).Aby odwolac sie do jakiejs wartosci na stosie , uzywamy dodatnich wartosci w stosunku do ESP.Zachowywanie wartosci ESP do EBP odbywa sie przed tym jak zmienne lokalne sa rezerwowane na stosie, wiec do zmiennych lokalnych mamy dostep odejmujac wartosci od ESP,a do argumentow funkcji dodajac wartosci do ESP.
Epilog:
W miejscu epilogu czyszczony jest stos i przywracane warosci uzywanych w funkcji rejestrow.
Jesli mowa o pulapkach , tzreba wspomniec o tzw. "sticky breakpoints".Taka pulapka jest "uzbrojona" w momencie kiedy nie sledzimy kodu bezposrednio w SI, to jest gdy robisz "step over" (komenda p lub F10), lub gdy wychodzisz z sice wciskajac F5
i kontynuujesz wykonanie programu.Znaczy to ze jezeli jestes w SI pulapki sa nieuzbrojone i jezeli robisz "trace over" (komenda t lub F8) , SI nie zaalarmuje cie.Innymi przypadkami kiedy pulapki widocznie nie dzialaja wsytepuja kiedy restartujesz symbol loader'a i przeladujesz program ktory debugujesz.Zazwyczaj nie powinno sie tak dziac.Istnieja jednak przypadki kiedy SI mysli ze pulapka jest aktywna , ale nie zadziala na niej.Program ktory debugujesz moze intensywnie szukac
wywolania przeerwania int3h (opcode CCh) i zamieniac bajt na orginalny dla danej funkcji.
Z pomoca przychodza nam DR'y(Debug Registers) czyli specjalne rejestry procesora.SI moze uzwac tych rejestrow do zastawiania
wszystkich typow pulapek(na czytanie/pisanie/wywolanie).Te rejestry nigdy nie zawioda, chyba ze program ktory debugujesz szuka wartosci w tych rejestrach i wykorzystuje dziure w SI do zmiany wartosci tychze rejestrow.Aby ustawic BPX'a na wywolanie na rejestrze debugujacym piszesz :
:bpm MessageBoxA x
Aby sprawdzic ktory rejestr jest uzywany napisz bl (jesli chcesz wiedziec jakie wartosci maja wszystkie rejestry procka plus pare innych informacji napisz cpu).
WYRAZENIA.
W poprzedniej czesci wykorzystywalismy bardziej wyrafinowane metody zastawiania pulapek.To jednak nie koniec, poniewaz w SI
mamy do dyspozycji cala game wyrazen,ktorymi to mozemy sobie umilac prace (nie tylko w ustawianiu pulapek :-).Zacznijmy od tych najbardziej znanych/potrzebnych.Osoby programujace w C/C++ dostrzegaja podobienstwa?
INDIRECTION OPERATORS (
-> przyklad: ebp->8 (pobiera DWORD pointed to by ebp+8)
. przyklad: eax.1c (pobiera DWORD pointed to by eax+1c)
* przyklad: *eax (pobiera DWORD pointed to by eax)
@ przyklad: @eax (pobiera DWORD pointed to by eax)
BITOWE OPERATORY
>> (bitowe przesuniecie w prawo) przyklad: bl >> 1
<< (bitowe przesuniecie w lewo) przyklad: bl << 2
& (bitowe AND) przyklad: ax & 0Fh
| (bitowe OR) przyklad: ax | 0FFh (ustawia AL na FF)
^ (bitowe XOR) przyklad: ax ^ ax (zeruje AX)
~ (bitowe NOT) przyklad: ~ax (zmienia wartosci bitow na przeciwne w AX)
LOGICZNE OPERATORY
! (logiczne NOT) przyklad: !eax (NOT'uje wartosc EAX,przydatne przy warunkach 0-falsz wszystko inne prawda)
&& (logiczne AND) przyklad: eax && symbol (symbol jest zmienna)
|| (logiczne OR) przyklad: ax || 0FFFFh (zawsze jest PRAWDA)
== (rowne) przyklad: eax == 0100h
!= (rozne) przyklad: eax != 0
< (mniejsze od)
> (wieksze od)
<= (mniejsze lub rowne)
>= (wieksze lub rowne)
Roznica miedzy BITWISE a LOGICAL OPERATORS jest taka ze przy tych pierwszych wartosc jest rozbijana na liczbe dwojkowa i na kazdym bicie wykonywana jest instrukcja, np.AND (nie bede tu podawal tabeli , zobacz chociazby do tuta gustawkita-asm dla badaczy kodu), a przy LOGICAL OPERATORS cale wyrazenie traktowane jest jako prawda lub falsz,prawda ze logiczne :-).
WBUDOWANE FUNKCJE
Do wykorzystania przy pisaniu wyrazen

)
Byte pobiera mniej znaczacy bajt example: ? Byte(0x1234) = 0x34
Word pobiera mniej znaczace slowo example: ? Word(0x12345678) = 0x5678
Dword pobiera mniej znaczacy podwojne slowo(dword) example: ? Dword(0xFF) = 0x000000FF
HiByte pobiera bardziej znaczacy bajt
HiWord pobiera bardziej znaczace slowo
Sword Konwertuje bajt do slowa ze znakiem example: ? Sword(0x80) = 0xFF80
Long Konwertuje bajt/slowo do ze znakiem example: ? Long(0xFF) = 0xFFFFFFFF
WSTR wyswietl jako lancuch unicode example: ? WSTR(eax)
Flat convert selector relative address to linear (flat) address
CFL wartosc znacznika przeniesieniae (typu boolean czyli 0 lub 1)
PFL wartosc znacznika parzystosci
AFL wartosc znacznika przeniesienia polowkowego
ZFL wartosc znacznika zerowego
SFL wartosc znacznika znaku
OFL wartosc znacznika nadmiaru
RFL wartosc znacznika ponowienia
TFL wartosc znacznika pracy krokowej
DFL wartosc znacznika kierunku
IFL wartosc znacznika zezwolenia na przerwanie
NTFL wartosc znacznika Nested Task
IOPL zwraca poziom uprzywilejowania aktualnego IO
VMFL wartosc znacznika Virtual Machine
IRQL wartosc znacznika Windows NT OS IRQ level (zwraca unsigned char)
DataAddr zwraca adres pierwszego elementu w oknie danych (dd @DataAddr)
CodeAddr zwraca adres pierwszej instrukcji w oknie kodu
Eaddr adres effective aktualnej instrukcji
Evalue wartosc spod adresu effective
Process KPEB (Kernel Process Environment Block)
Thread KTEB
PID ID aktywnego procesu
TID ID aktywnego thread'a
BPcount ile razy pulapka byla wywolana
BPtotal calosciowa ilosc wywolan pulapek z rezultatem PRAWDA
BPmiss calkowita ilosc wywolan pulapek z rezultatem FALSZ
BPlog cichy log pulapki(SI nie wyskakuje)
BPindex index wywolanej pulapki
Statystyki dotyczace pulapek mozesz podgladnac komenda bstat.
Eaddr i Evalue sluza do zwrocenia efektywnego adresu i efektywnej wartosci aktualnie obslugiwanej instukcij (spod EIP).
Dla przykladu jesli EIP wskazuje taka instrukcje : MOV EAX,[ESP+2] , to Eaddr zwroci wartosc spod ESP+2 , a Evalue adres wskazywany przez ESP+2.
BTW. Przy podawaniu nazwy Api , sice tak naprawde korzysta z jej adresu , czyli mozemy naprzyklad zalozyc taka pulapke : bpx MessageBoxA+1(lub bpx MessageBoxA do "t", wtedy SI wykona jedna instrukcje od poczatku MessageBoxA, czyli wyladuje po push'u , dlaczego to pisze? ano chce was wyczulic na to ze w SI mozna naprawde wykonac jakies zadanie na wiele sposobow) , sice wyladuje dokladnie jeden bajt od poczatku MessageBoxA, czyli po jednobajtowej instrukcji push,pamietajcie o tym , bo jesli naprzyklad ustawisz taka pulapke:
:bpx MessageBoxA+2
debugger nie zlapie sie , gdyz mamy tu dwubajtowa instrukcje MOV EBP,ESP bedaca caloscia,czyli jedna instrukcja(juz bardziej lopatologicznie nie da sie wytlumaczyc).
(sprobujcie bpx MessageBox-1 i zobaczcie co sie stanie i dlaczego tak?

).
d)
Dwie nakladki nakladki , IceDump 6.022 oraz SEX 1.15.
IceCLimber'a oraz superBPM ktore naprawia nam sticky breakpoints.
Dodalem tez loader'y SI(w wersji 4.05) dla Windos'a ME, pliki wcldrmeb3.rar oraz si_me.zip
Text o pamieci.
Zobacz sam.