番外:win32k.sys什么情况下会挂上PTE
一、前因
在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;
}
跟我们想象的一样,这个进程的SSDT Shadow PTE肯定是有效的,SSDT Shadow表里也是有值的
非GUI进程如下
#include "stdafx.h"
//运行程序不显示窗口
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"");
int main(int argc, char* argv[])
{
return 0;
}
只有最基本的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里有值都可以访问
通过多次实验,发现确实如上面所说
三、总结
SSDT Shadow能不能访问,取决于你驱动所在的进程SessionId是否为none,只有none是不可访问的!
有错误请指出!
谢谢!
上一篇: 人脸识别
下一篇: msm8953 PWM背光