windows station详解

部分转载自: http://blog.csdn.net/2608/archive/2007/12/04/1916773.aspx
原文1(E文): http://alt.pluralsight.com/wiki/default.aspx/Keith.GuideBook/WhatIsAWindowStation.html
原文2(E文): http://www.cppblog.com/dawnbreak/articles/90278.html
其他原文请参考我在文中添加的链接。
自己修改添加了部分内容,如有错误之处,望指正。

Window station 是一个不为人所熟知但是却是非常重要的安全特性,它被设计成为一个限制操作系统中窗口环境的“沙箱”。为了避免将访问控制列表(ACL)放置到每个窗口中 和对每个窗口消息进行权限检查而导致的性能下降,我们简单地让窗口互相通知而不执行任何安全检查。然而,我们是在一个私有环境中这么做的,这就是 Window station。

Window station 是一个安全核心对象,它包括了剪贴板,一个私有的原子表格,一套桌面以及一套窗口。每一个进程都依赖于一个window station,而且这个关联通常平行于登录会话的分配。也就是说,对于每一个登录会话来说,都有一个相应的window station,就像下图所描述的那样。实际上,window station的名称得自登录会话标识符。例如,用于网络服务的window station 名称是Service-0x0-0x3e4$。偶尔一个internet后台服务程序(例如IIS)会自己管理window station,但这只是一个例外。还有一个“交互式”的window station, 它会一直存在,甚至没有交互式用户存在时也如此。这个特殊的交互式window station 的名字硬编码为WinSta0, 需要我们对它更对关注。

windows station详解_第1张图片

WinSta0是唯一的一个实际绑定到硬件上的window station.也就是说,你可以在这里看到窗口,并且它们可以接收到鼠标和键盘的输入。WinSta0也是高度安全的,它通过一个能够限制登录会话运行 权限的ACL来达到此目的,尽管在上图中你也可以看到一些运行在SYSTEM登录会话中的高度受信的服务程序可能运行在这里,比如说使 winlogon.exe。WinSta0上的ACL在一个非常详细的等级上控制你的GUI可以做些什么,但是实际说来,这个一个要么全有,要么全无的授 权,并且只有在限制哪个进程允许关联到window station时才真正需要。(也可以调用函数SetProcessWindowStation来改变进程所属的window station,或通过在调用CreatProcess时设置STARTUPINFO参数将新启动的程序附着到特定的window station).使用这种方法,windos station上的ACL就可以阻止其他登录会话中的程序入侵到你的窗口中。

拥有window station的一个实际用处就是避免来自交互式用户的守护进程的隐藏攻击。如果进程运行在一个低特权账号中同时台帐号可以发送窗 口消息到一个高特权级别的程序,那么它就控制了这个程序。例如隐藏攻击(Luring Acctack)。因为window station边界通常是与登录会话边界是平行的,这就有助于阻止这类的攻击。

所以,我们有分配给一个绑定硬件的window station的交互登录,那守护进程(daemons)呢?每个守护进程登录都拥有各自的windows station,但它们是非交互的(记住,仅有一个交互的window sstation,它就是WinSta0)。一个非交互的window station不绑定到硬件,所有如果你是守护进程你就能创建正常工作的窗口——但是其它人看不见。这对于一些管道例如COM是非常重要的。但是想象一下,如果作为守护进程,你给出了一个模式对话框然后坐在那等某人按OK按钮吗?你会等极其长的时间。唯一的办法是用编程取消模式对话框中的非交互window station。例如你能够通过给这个对话框发送一个WM_CLOSE或者WM_COMMAND消息模仿按钮被按下。了解了这个,一个智力正常的人都不会再守护进程中放置模式对话框。但如何在编译调试C++应用程序的时候使用ASSERT宏呢?或者如果你购买了一个第三方组件库用于守护进程,并且已经编写代码之后发现它不时弹出模式对话框?处理这个并没有乐趣,所有,作为一个库(libary)开发者,在组件中放置对话框之前一定要仔细考虑。那就是说,如果你对放置用户接口在守护进程中有合法的理由,请阅读:HowToDisplayAUserInterfaceFromADaemon。

如果你来自Win9X技术背景,你可能会奇怪在机器上使用任何原有进程的窗口句柄竟然是错误的。如果你曾使用过用于进程间通信中window消息,那么是该学习其它技术的时候了,例如.NET Remoting 或者 COM

当一个进程又创建了另外一个,那么新的进程就被放置到与旧进程相同的window station中,除非你指明不这么做(但这种情况很少)。所以,就像是令牌和登录会话一样,一个新的进程很自然的继承了它的父进程的窗口环境。注意启动一个服务不同于简单的创建一个新的进程。当一个服务启动时,它就会由操作系统分配一个合适的登录会话和window station,就像我在 WhatIsADaemon中讨论的。

你可能感兴趣的:(windows station详解)