-
-
[求助]这样复制中断表是否正确
-
发表于:
2010-8-10 23:06
3651
-
typedef struct
{
//中断执行代码偏移量的底16位;
unsigned short LowOffset;
//选择器,也就是寄存器;
unsigned short selector;
//保留位,始终为零;
unsigned char Reserved;
//IDT中的门的类型:包括中断门,陷阱门和任务门;
unsigned char Type:4; //0x0E是一个中断门
//段标识位;
unsigned char SegmentFlag:1;
//中断门的权限等级,0表示内核级,3表示用户级;
unsigned char DPL:2; // 描述符特权级
//呈现标志位;
unsigned char Present:1;
//中断执行代码偏移量的高16位;
unsigned short HiOffset;
} IDTENTRY,*PIDTENTRY;
typedef struct
{
//定义中断描述符表的限制,长度两字节;
unsigned short IDTLimit;
unsigned short LowIDTbase;
unsigned short HiIDTbase;
} IDTINFO;
//******************************************************************************
//功能:重新构建IDT
//******************************************************************************
VOID GetSaveIDT()
{
IDTINFO idt_Base;
ULONG i=0;
__asm sidt idt_Base
IdtEntry = (PIDTENTRY) MAKELONG(idt_Base.LowIDTbase,idt_Base.HiIDTbase);//原始表地址
DbgPrint("IdtEntry地址: 0x%X",IdtEntry);
IdtEntryVMX = MmAllocateNonCachedMemory(sizeof(IDTENTRY)*256);//分配内存
for(i = 0;i < 256;i++)
{
IdtEntryVMX[i].HiOffset = IdtEntry[i].HiOffset;
IdtEntryVMX[i].LowOffset = IdtEntry[i].LowOffset;
DbgPrint("IDT-ID:%-3d 地址: 0x%X", i, ((unsigned int)IdtEntryVMX[i].HiOffset << 16) | (IdtEntryVMX[i].LowOffset));
}
DbgPrint("IdtEntryVMX: 0x%X",IdtEntryVMX);
}
这样打印显示的也是IDT 各个中断函数地址,我也无法测试是否正确,望大家指点下 多谢
[课程]Linux pwn 探索篇!