A、反断点的一些原理
B、认识IDT表
C、IDT表相关结构
D、读出IDT表-sidt指令
E、测试
一、反断点的一些原理
1、让他不能正常下断点 (0xCC断点int 3)
2、正常下断点后,让他不能断下(IDT HOOK)
二、IDT表
大小 00-0xFF ,0-255
返回 iretd ;
中断INT n
举个简单的例子
我们常会在驱动代码里写一行_asm int 3
这样我们就手动设置了一个断点,当代码执行到这里 就会使CPU的执行暂停,并跳到中断处理函数中去执行。
同样的和SSDT与SSDT Shadow一样 IDT也有一张IDT表(俗称中断描述符表)
1、怎么样获取IDT表基址?
2、怎么样读取IDT表 中的中断函数地址?
__asm sidt idt_info
#pragma pack(push)
#pragma pack(1) //
typedef struct _IDTR //IDT基址
{
USHORT limit; //范围 占8位
ULONG base; //基地址 占32位 PIDT_ENTRY类型指针
}IDTR,*PIDTR;
256*8
typedef struct _IDT_ENTRY
{
USHORT offset_low; //中断处理函数地址低16位
USHORT selector;
UCHAR reserved;
UCHAR type:4;
UCHAR always0:1;
UCHAR dpl:2;
UCHAR present:1;
USHORT offset_high;//中断处理函数地址低16位
}IDT_ENTRY,*PIDT_ENTRY;//+3.offset_high<<16+offset_low //int 3 中断处理函数地址
#pragma pack(pop) //#pragma pack(pop)
ULONG ReadIdt(ULONG CPUNUM)
{
IDTR idtr;//获取表基址
PIDT_ENTRY Aidt;
KdPrint(("IDT_ENTRY size=%d \n",sizeof(IDT_ENTRY)));
__asm sidt idtr;//获取表基址信息
KdPrint(("IDT BASE=%x \n",idtr.base));
Aidt=PIDT_ENTRY(idtr.base);
for (int i=0;i<0xff;i++)
{
ULONG cur_idt= Aidt->offset_high;
cur_idt=cur_idt<<16;//得到高位地址
cur_idt=cur_idt+ULONG(Aidt->offset_low);//合成 中断处理函数地址
// if ( Aidt->offset_high==0) {__asm int 3};
// if ( Aidt->offset_low==0) {__asm int 3};
KdPrint(("high=%x,low=%x,IDT %d=%0000x \n",Aidt->offset_high,Aidt->offset_low,i,cur_idt));
// if ( Aidt->offset_high==0)
// { KdPrint(("high=%x,low=%x,IDT %d=%x \n",Aidt->offset_high,Aidt->offset_low,i,cur_idt));}
// else{ KdPrint(("high=%x,low=%x,IDT %d=0000%x \n",Aidt->offset_high,Aidt->offset_low,i,cur_idt));}
Aidt++;
}
return idtr.base;
}