SESSION会话机制解析
Windows Session(会话)的概念
会话 session 是由代表单个用户登录会话的所有进程和系统对象组成的。其中的对象包括所有的窗口,桌面和windows stations。桌面是特定session页的内存池并且被加载到内核存储区。这个区域正是session私有的GUI对象的存储区域。windows station基本上可以被描述为包含桌面和进程的安全边界。因此,一个session可以包含多个windows station,而每个windows station又可拥有多个桌面。
只有被称为 winsta0(交互工作站) 的 windows station 才被允许与用户交互。在winsta0下共被载入三个桌面:winlogon(登陆界面),缺省桌面(用户桌面),和Disconnect( ? )。它们三个都有各自的显存,这就是为什么当你锁定工作站时你的主桌面会消失。当你锁定工作站时,屏幕由用户桌面切换到登录界面,并且两者之间并没有交 互。在windows vista(微软最新发布的操作系统)这一点更是体现的淋漓尽致。例如当你看到UAC弹出时,系统会将用户桌面的快照降低灰度,而在前端显示UAC窗口,UAC窗口是安全桌面 (vista系统的新特性类似登录桌面)并且在你给予权限之前禁止你与用户桌面的交互。
Windows Session(会话)的组成
内存页是被所有用户所共享的,但是每个用户会将其各自的session空间映射到虚拟内存。session空间被划分到四个不同的区域:
session结构存储区 - 内存控制器结构,其中包含session工作集
session映像存储区 - 保留一块私有的win32k.sys修改过的数据,一个sin32k,sys代码副本和原始数据副本,还有各种驱动
session视图存储区 - 包括桌面堆在内的session映射视图
session分页存储区 - 用于这个session被分页了的内存池
Session 0 与 Session 1
(1)在Windows XP、Windows Server 2003,以及更老版本的Windows操作系统中,服务和应用程序使用相同的会话(Session)运行,而这个会话是由第一个登录到控制台的用户启动的。该会话就叫做Session 0,如下图所示,在Windows Vista之前,Session 0不仅包含服务,也包含标准用户应用程序。
Session 0 in Windows XP / Windows Server 2003:
(2)将服务和用户应用程序一起在Session 0中运行会导致安全风险,因为服务会使用提升后的权限运行,而用户应用程序使用用户特权(大部分都是非管理员用户)运行,这会使得恶意软件以某个服务为攻击目标,通过“劫持”该服务,达到提升自己权限级别的目的。
在Windows Vista(微软最新发布的操作系统)上,也就是Win7之后,只有服务可以托管到Session 0中。用户应用程序和服务之间会被隔离,用户应用程序需要运行在用户登录到系统时创建的后续会话中。例如第一个登录的用户创建 Session 1,第二个登录的用户创建Session 2,以此类推,如下图所示。
Session 0 / Session 1 in Windows Vista:
Win7之后,windows又引入了session隔离用来保证各个用户之间的安全。特别是session0,是为第一个用户创建的,也就是系统服务,自己创建的服务程序也在这个 system 用户下,session 默认也在0。不过 session0 创建的子进程可以是其他 session 的,这个就是通过SetTokenInformation修改token中的sessionid来做到。也就是说我们可以创建一个 system 权限,又工作在 session1 下面的进程。
当用户登陆到系统中之后,用户下所有的进程都属于这个会话空间。在每个进程的PEB当中就有SessionID,该结构最后一个成员就是SessionID。
typedef struct _PEB { BYTE Reserved1[2]; BYTE BeingDebugged; BYTE Reserved2[1]; PVOID Reserved3[2]; PPEB_LDR_DATA Ldr; PRTL_USER_PROCESS_PARAMETERS ProcessParameters; BYTE Reserved4[104]; PVOID Reserved5[52]; PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine; BYTE Reserved6[128]; PVOID Reserved7[1]; ULONG SessionId; } PEB, *PPEB;
MSDN链接:http://technet.microsoft.com/zh-cn/ee791007.aspx/
参考链接:https://blog.csdn.net/linfengmove/article/details/90640131/
http://www.cppblog.com/dawnbreak/
https://blog.csdn.net/zacklin/article/details/7579217
英文原文移步这里查看: http://www.cppblog.com/dawnbreak/articles/90278.html/