FS-Register?
-
Ich habe hier eine Zeile, die ich nicht verstehe:
0045979D |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
Der MOV-Operator ist mir soweit klar, jedoch wird dort das FS-Register angesprochen. Im Ollydbg kann kan FS-Register finden. Was heißt das nun?
-
Es gibt mehrere Segmentregister: cs, ds, ss (Code, Daten, Stack)
Zusätzlich gibt es noch extra Segmentregister ohne speziellen Zweck: es (extra segment), fs, gs
-
Und wo und wie kann ich mir die Segmentregister ansehen und ändern?
-
AFAIK im ollydbg gar nicht. Sollte dich normalerweise aber auch nicht weiter kuemmern: In Windows hast du im normalen Betrieb nichts an den Segmentregistern herum zu werken.
-
In Windows hast du im normalen Betrieb nichts an den Segmentregistern herum zu werken.
Genauer:
Im Protected-Mode enthalten die "Segment"-Register (im Gegensatz zum Real-Mode) einen Index zu einer Deskriptoren-Tabelle.
Um deren Eintraege hat die Speicherverwaltungen Deines Betriebssystems bereits gekuemmert.
Mit Einfuehrung von 32Bit-Registern im 386er kann der gesamte verfuegbare Speicher per Adress-Register adressiert werden, sodass die Notwendigkeit unterschiedlicher Deskriptoren (zur Adressierung) nicht mehr gegeben ist und dementsprechend selten im Code zu finden ist.
-
Und noch genauer:
Segment Register sind nur die Spitze eines "Eisbergs": Die sichtbare Komponente ist für den Programmierer als CS, SS, DS usw. bekannt, die unsichtbare Komponente besteht aus dem Access Byte, 32 Bit Basis Adresse und dem 32 Bit Limit...
-
GDT Darstellung: http://www.henkessoft.de/OS_Dev/Bilder/Deskriptor386.JPG
GDT Assembler Sourcecode: http://www.henkessoft.de/OS_Dev/OS_Dev1.htm#mozTocId14234
GDT C Sourcecode:void gdt_install() { /* Setup the GDT pointer and limit */ gdt_register.limit = (sizeof(struct gdt_entry) * NUMBER_GDT_GATES)-1; gdt_register.base = (ULONG) &gdt; /* GDT GATES - desriptors with pointers to the linear memory address */ gdt_set_gate(0, 0, 0, 0, 0); // NULL descriptor gdt_set_gate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF); // CODE, privilege level 0 for kernel code gdt_set_gate(2, 0, 0xFFFFFFFF, 0x92, 0xCF); // DATA, privilege level 0 for kernel code //... gdt_set_gate(3, 0, 0xFFFFFFFF, 0xFA, 0xCF); // User mode code segment gdt_set_gate(4, 0, 0xFFFFFFFF, 0xF2, 0xCF); // User mode data segment //... write_tss(5, 0x10, 0x0); // num, ss0, esp0 //... } /* Setup a descriptor in the Global Descriptor Table */ void gdt_set_gate(int num, ULONG base, ULONG limit, UCHAR access, UCHAR gran) { /* Setup the descriptor base address */ gdt[num].base_low = (base & 0xFFFF); gdt[num].base_middle = (base >> 16) & 0xFF; gdt[num].base_high = (base >> 24) & 0xFF; /* Setup the descriptor limits */ gdt[num].limit_low = (limit & 0xFFFF); gdt[num].granularity = ((limit >> 16) & 0x0F); /* Finally, set up the granularity and access flags */ gdt[num].granularity |= (gran & 0xF0); gdt[num].access = access; }
-
Dummkopf schrieb:
Ich habe hier eine Zeile, die ich nicht verstehe:
0045979D |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
Was FS ist, wurde bereits erläutert. Die Zeile, die du siehst, entsteht üblicherweise bei der Implementierung von Exception-Handling mittels SEH unter 32-Bit-Windows; FS[0] verweist dort auf den aktuellen Exception-Frame. Jeder try-finally-Block erzeugt einen neuen Frame und paßt daher FS:[0] an.
Details kannst du hier nachlesen.
-
Dummkopf schrieb:
...jedoch wird dort das FS-Register angesprochen. Im Ollydbg kann kan FS-Register finden. Was heißt das nun?
unter windoof zeigt es darauf: http://en.wikipedia.org/wiki/Win32_Thread_Information_Block