整理下自己的驱动编程。
ssdt是系统服务表,每个window系统都会维护自己的系统服务表。我们可以使用kernel detective看下ssdt表。
以openProcess为例子:
开windbg
kd> u nt!ZwOpenProcess
nt!ZwOpenProcess:
804ff720 b87a000000 mov eax,7Ah //7A
804ff725 8d542404 lea edx,[esp+4]
804ff729 9c pushfd
804ff72a 6a08 push 8
804ff72c e850ed0300 call nt!KiSystemService (8053e481)
804ff731 c21000 ret 10h
nt!ZwOpenProcessToken:
804ff734 b87b000000 mov eax,7Bh
804ff739 8d542404 lea edx,[esp+4]
ZwOpenPeocess的开头
mov eax,7Ah
7A的十进制就是190对应的ssdt表的第190个。
现在来说下openProcess的hook方法
分为两种:
修改ssdt表:
修改ssdt表的第190地址,在修改之前先保存原来的ssdt地址,然后跳到自己定义的MyopenProcess,在MyOpenProcess结束跳回原来保存的地址。这种修改方法容易被检测出来。
inline hook:
第二种修改openProcess函数的入口使用jmp跳转到自己的函数上,据我所知,大部分保护驱动都是这样的。
代码献上:
miniddk.cpp
#include "miniDDK.h"
#include "SSDT.h"
#include "IDThook.h"
#pragma INITCODE
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING b){
//=================Init============================
//分开注册 派遣函数
KdPrint(("\n\n驱动被加载----------\n"));
pDriverObject->MajorFunction[IRP_MJ_CREATE]=ddk_DispatchRoutine_CREATE;
pDriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine_CLOSE;
pDriverObject->MajorFunction[IRP_MJ_READ]=ddk_DispatchRoutine_READ;
pDriverObject->MajorFunction[IRP_MJ_WRITE]=ddk_DispatchRoutine_WRITE;
pDriverObject->MajorFunction[ IRP_MJ_DEVICE_CONTROL]=ddk_DispatchRoutine_CONTROL;
CreateMyDriver(pDriverObject);
pDriverObject->DriverUnload = DDK_Unload;
//=================Init============================
//============