-
-
[求助]关于ring3无驱进ring0的问题
-
发表于:
2007-10-20 22:16
10379
-
EnterRing0(PXDT_GATE_DESCRIPTOR gdt)
{
DWORD CodeIndex, GateIndex;
WORD CallGate[3];
//
// Find and initialize GDT descriptors for code segment and call gate
//
CodeIndex = 10;
while (gdt[CodeIndex].Attributes & 0xf000)
CodeIndex++;
gdt[CodeIndex] = gdt[1];
GateIndex = CodeIndex + 1;
while (gdt[GateIndex].Attributes & 0xf000)
GateIndex++;
gdt[GateIndex].OffsetLo = (WORD) ((DWORD) &Ring0Startup);
gdt[GateIndex].Selector = CodeIndex << 3;
gdt[GateIndex].Attributes = 0xec00;
gdt[GateIndex].OffsetHi = (WORD) ((DWORD) &Ring0Startup >> 16);
UnmapViewOfFile(gdt);
CallGate[2] = (GateIndex << 3) | 3;
asm("lcall *%0" : : "m" (CallGate[0]), "c" (GateIndex));
}
以上函数为取得gdt中的空表项,然后构造调用门,大致作用知道,但一些细节问题还搞不清楚。
搜索gdt的空表项为什么要用两个索引项CodeIndex,GateIndex,他们有什么作用?
还有就是CallGate[3]中的CallGate[0]和CallGate[1]都没有附值,他们是怎么与调用门联系的?
请各位高手给予解答,小弟先谢了。
[课程]FART 脱壳王!加量不加价!FART作者讲授!