整理下之前过驱动保护的学习,idt hook也是一个经常用到的hook思路。
还是要用到inline hook进入到中断函数地址进行jmp
//获取idt表地址
//修改int3中断函数
#include<ntddk.h>
#include <windef.h>
#ifdef __cplusplus
extern "C"
{
#endif
#include <NTDDK.h> //这里包含需要用C方式编译的头文件
#ifdef __cplusplus
}
#endif
#pragma pack(push)
#pragma pack(1) //
typedef struct _IDTR //IDT基址
{
USHORT limit; //范围 占8位
ULONG base; //基地址 占32位 PIDT_ENTRY类型指针
}IDTR,*PIDTR;
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)
//======================value=============
ULONG jmpaddr_int3proc_9;
//======================value end=============
ULONG GetIDTAddr(){
IDTR idt_info;
__asm sidt idt_info
//KdPrint(("\n idt_info.base %x\n",idt_info.base));
return idt_info.base;
}
//获取Int3的入口函数
ULONG GetInt3Addr(){
IDT_ENTRY *idtInt3 = (PIDT_ENTRY)GetIDTAddr();
//KdPrint(("idtInt3 %x\n",idtInt3));
//KdPrint(("*idtInt3 %x\n",*idtInt3));
idtInt3 += 3; //去Int3入口结构
//KdPrint(("idtInt3 %x\n",idtInt3));
//ULONG int3Addr = (idtInt3->offset_high)<<16+(idtInt3->offset_low);//错误实例 。。。先+在进行<<的
ULONG int3Addr = (idtInt3->offset_high<<16)+idtInt3->offset_low;
//KdPrint(("int3Addr %x\n",int3Addr));