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
    🙂


Log in to reply