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模块的服务表索引为0x1A4(可通过逆向用户层GetDC函数程序得),内核层调用的函数为NtUserGetDC。<

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

被折叠的 条评论
为什么被折叠?



