A、实例演示
B、替换IDT处理函数
C、IDT HOOK 代码书写
//840dFaa1
//-----------全局变量--------------------------------
ULONG int3proc_addr; //用来存放int 3处理函数地址
ULONG jmpaddr_int3proc_9; //用来存放intproc+9处理函数地址
//-----------全局变量 定义结束-----------------------
1、ULONG ReadIdtBase(ULONG CPUNUM)
2、void __declspec(naked) myInt3Proc()
3、ULONG HookInt3Proc()
4、void __declspec(naked) int3UnHookcode()
{
804dfaa1 6a00 push 0
804dfaa3 66c74424020000 mov word ptr [esp+2],0
}
5、ULONG UnHookInt3Proc()
#include <ntddk.h>
#pragma pack(push)
#pragma pack(1) //
typedef struct _IDTR //IDT基址
{
USHORT limit; //范围 占8位
ULONG base; //基地址 占32位 _IDT_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;
#pragma pack(pop) //#pragma pack(pop)
//-----------全局变量--------------------------------
ULONG int3proc_addr; //用来存放int 3处理函数地址
ULONG jmpaddr_int3proc_9; //用来存放intproc+9处理函数地址
//-----------全局变量 定义结束-----------------------
#pragma PAGECODE
ULONG ReadIdtBase(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);
return idtr.base;
}
void __declspec(naked) int3UnHookcode()
{
__asm
{
push 0
mov word ptr [esp+2],0
}
}
#pragma PAGECODE
void __declspec(naked) myInt3Proc()
{
//__asm retn 100;
__asm
{
pushad
pushfd
}
KdPrint(("\n entry my Int3Proc \n"));
//在这里添加自己的条件过滤代码
//获取进程上下文
PEPROCESS EP;
EP=PsGetCurrentProcess();
// (PTSTR)((ULONG)EP+0x174)是否等于 需要反断点的进程
if (strcmp((PTSTR)((ULONG)EP+0x174),"notepad.exe")==0)
{
//需要保护的进程 直接蓝屏
KdPrint(("\n 蓝屏 蓝屏 蓝屏 \n"));
__asm retn 100;
}
__asm
{
popfd
popad
}
__asm
{
push 0
mov word ptr [esp+2], 0
//前2条需要恢复的指令 占9字节
jmp jmpaddr_int3proc_9
}
}
#pragma PAGECODE
ULONG HookInt3Proc()
{
ULONG status=1;
PIDT_ENTRY Pidt_info=(PIDT_ENTRY)ReadIdtBase(0);
ULONG jmpaddr;
Pidt_info+=3;//转到IDT 数组3 里边存放着 int 3 处理函数地址
//Pidt_info=Pidt_info+sizeof(Pidt_info)*3;
//begin计算出int3处理函数地址
int3proc_addr=Pidt_info->offset_high<<16;//makelong 0x804d0000
//MAKELONG(Pidt_info->offset_high,Pidt_info->offset_Slow) //0xfaa1 =804dfaa1
int3proc_addr=int3proc_addr+Pidt_info->offset_low;
KdPrint (("\n int proc addr=%x \n",int3proc_addr));
//end;
//begin inline hook int3Proc write
// E9+jmp地址//jmp地址=myInt3Proc-int3proc_addr-5;
jmpaddr=ULONG(&myInt3Proc)-int3proc_addr-5;
jmpaddr_int3proc_9=int3proc_addr+9;
__asm
{
push ebx
push eax
mov ebx,int3proc_addr
mov byte ptr ds:[ebx],0xE9
mov eax,jmpaddr
mov dword ptr ds:[ebx+1],eax
pop eax
pop ebx
}
//end;inline hook int3proc write
return status;
}
#pragma PAGECODE
ULONG UnHookInt3Proc()
{
ULONG status=1;
KdPrint(("\n 卸载 Idt Hook \n"));
__asm
{
push ebx
push eax
push ecx
mov ebx,int3proc_addr //0x804dfaa1
lea ecx,int3UnHookcode
mov eax,[ecx+0]
mov dword ptr ds:[ebx],eax
mov eax,[ecx+4]
mov dword ptr ds:[ebx+4],eax
mov eax,[ecx+8]
mov byte ptr ds:[ebx+8],al
pop ecx
pop eax
pop ebx
}
//end;inline hook int3proc write
return status;
}