欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

番外:win32k.sys什么情况下会挂上PTE

程序员文章站 2022-07-14 15:33:09
...

一、前因

在HOOK SSDT Shadow的时候老师说,必须要调用一个界面函数使自己成为GUI进程(线程),才会给这个进程挂上PTE,我对此表示怀疑,于是有了以下探讨

二、探究

1、首先来看一下system进程

查询所有进程

kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS 867b5830  SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
    DirBase: 06d40020  ObjectTable: e1002e40  HandleCount: 248.
    Image: System

切换到System进程

kd> .process 867b5830  
Implicit process is now 867b5830
WARNING: .cache forcedecodeuser is not enabled

查看SSDT Shadow

kd> dd KeServiceDescriptorTableShadow
8055d6c0  80505450 00000000 0000011c 805058c4
8055d6d0  bf999b80 00000000 0000029b bf99a890
8055d6e0  00000000 00000000 00000000 00000000
8055d6f0  00000000 00000000 00000000 00000000
8055d700  80505450 00000000 0000011c 805058c4
8055d710  00000000 00000000 00000000 00000000
8055d720  00000000 00000000 00000000 00000000
8055d730  00000000 00000000 00000000 00000000

W32pServiceTable地址为bf999b80,查看一下有没有函数地址

kd> dd bf999b80
bf999b80  ???????? ???????? ???????? ????????
bf999b90  ???????? ???????? ???????? ????????
bf999ba0  ???????? ???????? ???????? ????????
bf999bb0  ???????? ???????? ???????? ????????
bf999bc0  ???????? ???????? ???????? ????????
bf999bd0  ???????? ???????? ???????? ????????
bf999be0  ???????? ???????? ???????? ????????
bf999bf0  ???????? ???????? ???????? ????????
kd> !pte bf999b80
                    VA bf999b80
PDE at C0602FE0            PTE at C05FCCC8
contains 0000000000000000
not valid

可以看到这块地址完全没有分配,具体原因是因为它的PTE是无效的,而System进程确实不是一个GUI进程!这能否说明只有GUI进程才能访问win32k.sys?

2、思考

GUI进程要调用GUI服务,而这些服务函数都在win32k.sys中,就必然会访问win32k.sys,所以win32k.sys的地址范围在GUI进程中必然是可以访问的。这个逻辑没有错误。按照这个逻辑来推断,一个没有任何GUI的进程空间里,是无法访问win32k.sys的。事实当真如此吗?

3、验证

下面我们写2个小例子来验证

GUI进程如下

#include "stdafx.h"
#include <windows.h>
int main(int argc, char* argv[])
{
	MessageBox(0,0,0,0);
	return 0;
}

番外:win32k.sys什么情况下会挂上PTE
跟我们想象的一样,这个进程的SSDT Shadow PTE肯定是有效的,SSDT Shadow表里也是有值的

非GUI进程如下

#include "stdafx.h"
//运行程序不显示窗口
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"");

int main(int argc, char* argv[])
{
	return 0;
}

番外:win32k.sys什么情况下会挂上PTE
只有最基本的2个Dll,这个应该算是非GUI进程了吧!我没有写任何代码,也没有包含任何头文件。

让我们来看看这个进程的SSDT shadow是否挂了PTE

PROCESS 862d7c88  SessionId: 0  Cid: 0684    Peb: 7ffde000  ParentCid: 01a8
    DirBase: 06d40340  ObjectTable: e2834c30  HandleCount:  12.
    Image: Test.exe

kd> .process 862d7c88  
Implicit process is now 862d7c88
WARNING: .cache forcedecodeuser is not enabled
kd> dd KeServiceDescriptorTableShadow
8055d6c0  80505450 00000000 0000011c 805058c4
8055d6d0  bf999b80 00000000 0000029b bf99a890
8055d6e0  00000000 00000000 00000000 00000000
8055d6f0  00000000 00000000 00000000 00000000
8055d700  80505450 00000000 0000011c 805058c4
8055d710  00000000 00000000 00000000 00000000
8055d720  00000000 00000000 00000000 00000000
8055d730  00000000 00000000 00000000 00000000
kd> dd bf999b80
bf999b80  bf935f7e bf947b29 bf88ca52 bf93f6f0
bf999b90  bf949140 bf936212 bf9362b7 bf83b4cd
bf999ba0  bf948a67 bf934a17 bf94905f bf90f2f4
bf999bb0  bf902318 bf809fdf bf948f31 bf94a72d
bf999bc0  bf900c15 bf893b44 bf94900f bf94a860
bf999bd0  bf820f34 bf8dcb55 bf87a2e4 bf8c29a0
bf999be0  bf91052f bf80e2c5 bf8dc7fd bf94a525
bf999bf0  bf94b430 bf813a71 bf80cf90 bf8d14e4

显然SSDT Shadow表里是有值的,也就是说尽管不是GUI线程依旧能够挂上PTE

4、猜想

只有SessionId为none才不可访问
只要SessionId里有值都可以访问
番外:win32k.sys什么情况下会挂上PTE
通过多次实验,发现确实如上面所说

三、总结

SSDT Shadow能不能访问,取决于你驱动所在的进程SessionId是否为none,只有none是不可访问的!

有错误请指出!
谢谢!

参考资料

上一篇: 人脸识别

下一篇: msm8953 PWM背光