ShadowSSDT的hook

本文介绍了在Windows X86系统中,如何针对Shadow SSDT进行Hook,以hook GetDC函数为例。首先,文章解释了KeServiceDescriptorTable和KeServiceDescriptorTableShadow的区别,并指出在hook时需要利用KeStackAttachProcess挂靠到GUI进程。接着,详细阐述了hook的步骤,包括关闭内存写保护、查找Shadow SSDT地址、判断线程类型、替换函数、解除挂靠和恢复原状。最后,给出了Win7 X86环境下驱动程序的源代码实现。
摘要由CSDN通过智能技术生成

Windows X86下系统中一共有2个系统服务描述符表,保存在如下的结构体中:

typedef struct _KSYSTEM_SERVICE_TABLE
{
	PULONG ServiceTableBase;           //服务表的基址
	PULONG ServiceCounterTableBase;    
	ULONG  NumberService;              //服务表函数的数量
	ULONG  ParamTableBase;             //服务表函数参数表
}KSYSTEM_SERVICE_TABLE, *PKSYSTEM_SERVICE_TABLE;

而每个系统描述符表中有四个服务表:

typedef struct _KSERVICE_DESCRIPTOR_TABLE
{
	KSYSTEM_SERVICE_TABLE ntoskrnl;  //ntoskrnl.exe的服务表,在KeServiceDesriptorTable和KeServiceDescriptorTableShadow均有值
	KSYSTEM_SERVICE_TABLE win32k;    //win32k.sys的服务表,仅在KeServiceDescriptorTableShadow中有值
	KSYSTEM_SERVICE_TABLE notUsed1;
	KSYSTEM_SERVICE_TABLE notUsed2;
}KSERVICE_DESCRIPTOR_TABLE, *PKSERVICE_DESCRIPTOR_TABLE;

内核中有两个系统服务描述符表,一个是KeServiceDescriptorTable(由ntoskrnl.exe导出),一个是KeServieDescriptorTableShadow(没有导出)。两者的区别是,KeServiceDescriptorTable仅有ntoskrnel一项有值,而KeServieDescriptorTableShadow包含了ntoskrnel以及win32k。一般的Native API的服务地址由KeServiceDescriptorTable分派,gdi.dll/user.dll的内核API调用服务地址由KeServieDescriptorTableShadow分派。

而win32k.sys只有在GUI进程中才加载,非GUI进程中无法查看,所以我们在hook的时候可以使用KeStackAttachProcess来挂靠到一个GUI进程。

下面我来说一下具体的步骤吧,这次hook的函数是GetDC,在Win32k模块的服

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值