windows - Hvad betyder 001b i 'undtagelse i modul kernel32.dll på 001b: 7c812afb'

Indlæg af Hanne Mølgaard Plasc

Problem



For eksempel:



  myapp.exe forårsagede en Microsoft C ++-undtagelse (0xe06d7363) i modulet
  kernel32.dll ved 001b: 7c812afb.



Jeg spørger dette ud af nysgerrighed, fordi jeg har bemærket, at i alle undtagelser og nedbrud forbliver dette nummer (001b) altid det samme, mens sidstnævnte ændrer sig (jeg antager, at det indeholder instruktørpegerens værdi).


Så hvad betyder dette 001b, præcis?

Bedste reference


Du ser en adresse på formularen CS:EIP, hvor din processor CS svarer til 16-bit Code Segment-registret, og EIP er 32-bit instruktionspegeren (det ville være bare IP i en 16-bit mode).


Det er den del, jeg vidste, før jeg kiggede på, hvorfor du ser en CS af 0x001b (0b0000000000011011) i alle de tilfælde, du studerer. Alt andet, jeg er ved at sige, er semi-informed gætte-arbejde og/eller vild spekulation. Jeg er meget af at følge sammen med disse:


http://en.wikipedia.org/wiki/X86\_memory\_segmentation[20]


http://www.cs.cmu.edu/~410/doc/segments/segments.html[21]


Så her går ingenting. Tilføj blot en 'måske' efter hver sætning, jeg er ved at sige, og en, der gør denne slags arbejde for alvorligt, kan komme ind og rette fejlene ...





I beskyttet tilstand er de nederste to bit af CS -registret RPL eller 'Requested Privilege Level'. Beskyttelsesringe er:



  • 0 - Operativsystemkernel

  • 1 og 2 - Operativsystemtjenester

  • 3 - Applikationer



Du er i 3 (0b11), fordi det formodentlig er programmer, der kolliderer, mens du kalder en systemdll. Det er i modsætning til ... sige ... OS'et selv har en fejl - hvilket ville være giver dig en blå skærm af død i stedet for en god Windows dialog. Faktisk, hvis du Google rundt for nogle blå skærme, starter de ofte med 0x0028 (0b0000000000101000), og vi kan se, at der er et kerne-niveau-nedbrud.


Den næste væsentligste bit er TI eller 'Table Indicator' ... som er enten 0 for global deskriptortabel eller 1 for lokal deskriptortabel . (Dette giver en måde at fortolke betydningen af ​​indekset i de resterende øvre 13 bit af CS registret vi har ikke talt om endnu.


I krasjet ser du dig, jeg har 0 i den tredje bit for at angive at bruge en global deskriptortabel. Det skyldes, at hver app ikke indlæser sin egen kopi af den samme DLL, og dit crash sker inde i en DLL (formodentlig at det bliver sendt ukorrekte data fra din app). Hvis dit crash var i kode for en EXE, forventer vi, at dette er 1. En Windows-oplevelse er uklar, men jeg synes at huske, at du får en anden form for besked, når krasjet faktisk er i dit program, og du don ' t Hent CS register output som du gør, når det sker i en DLL.


Nu er vi tilbage med resten af ​​det. Indeks 3 (0b0000000000011) i Global Descriptor Table. Wazzat betyder? Har ikke kildekoden til Windows ved hånden, men jeg fandt nogle referencer i denne kernel tutorial:


http://www.jamesmolloy.co.uk/tutorial\_html/4.-The\%20GDT\%20and\%20IDT.html[22]


Hvis du ser på init\_gdt() fra det, ser du:


gdt\_set\_gate(0, 0, 0, 0, 0);                // Null segment
gdt\_set\_gate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF); // Code segment
gdt\_set\_gate(2, 0, 0xFFFFFFFF, 0x92, 0xCF); // Data segment
gdt\_set\_gate(3, 0, 0xFFFFFFFF, 0xFA, 0xCF); // User mode code segment
gdt\_set\_gate(4, 0, 0xFFFFFFFF, 0xF2, 0xCF); // User mode data segment


Så Windows kan bruge lignende tal (eller endda det samme). Måske kernel32.dll kører brugermoduskodesegmentet fordi det ikke har valideret de ting, du passerede ind i det endnu nok til at skifte over til kodesegment 1.


...måske. :-P