Win32子系统
Win32子系统是Windows操作系统必须的一部分,伴随这Windows启动时运行,它包含:
- win32子系统进程 csrss.exe
- win32子系统驱动 win32k.sys
- win32子系统DLL kernel32.dll,user32.dll,advapi32.dll,gdi32.dll
- 设备相关的显示和打印驱动程序等。
Windows的启动过程
windows操作系统在启动时会进行一系列的初始化操作:
- 自检阶段
- 初始化启动阶段
- Boot加载阶段
- 检测和配置硬件阶段
- 内核加载阶段
- 启动会话管理器smss.exe,它是Windows创建的第一个用户进程。
smss.exe运行后,会加载和初始化win32k.sys,然后紧接着调用win32k.sys的DriverEntry,然后启动Win32子系统进程csrss.exe和登录进程WinLogon.exe。
csrss.exe
csrss.exe(Client/Server Runtime Server Subsystem,即客户端/服务器运行时子系统),负责维护Windows子系统的日常事务,为子系统的各个进程提供服务。例如维护进程和线程、管理控制台窗口、管理DOS程序虚拟机(VDM)进程等。
win32k.sys
win32k.sys是内核模块但是不用于处理I/O请求,主要是为应用层提供服务。实现窗口管理(收集、分发消息,控制窗口显示)和图形设备接口(各种图形绘制、文本输出)。
win32k.sys主要是user32.dll和gdi32.dll的内核实现。
ntoskrnl.exe主要是kernel32.dll的内核实现。
user32.dll、gdi32.dll和kernel32.dll中的API通过ntdll.dll实现过渡,最终调用的都是win32k.sys(Shadow SSDT)和ntoskrnl.exe(SSDT)中的系统服务。
SSDT(System Service Descriptor Table,系统服务描述表),由ntoskrnl.exe导出(x64下不导出),在内核中的名称是KeServiceDescriptorTable。在代码中声明一下即可使用。
extern PSYSTEM_SERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;
typedef struct _SYSTEM_SERVICE_DESCRIPTOR_TABLE
{
PVOID ServiceTableBase; //SSDT表的基地址
PVOID ServiceCounterTableBase;
ULONG_PTR NumberOfServices; //SSDT表中服务函数的个数
PVOID ParameterTableBase;
}SYSTEM_SERVICE_DESCRIPTOR_TABLE, *PSYSTEM_SERVICE_DESCRIPTOR_TABLE;
Shadow SSDT,在内核中的名称是KeServiceDescriptorTableShadow,不过它是未导出的,不能在自己的模块中导入和引用。
kernel32.dll
kernel32.dll包含如下的API:
- 进程/线程管理
- 文件操作(创建、打开、读写、搜索等)
- 内存管理(Local开头、Global开头、Heap开头)
- 调试(Debug开头)等
user32.dll
user32.dll是用户界面相关的,包含窗口管理、消息处理、用户输入的API,如EndDialog()、BeginPaint()、SetWindowPos()、MessageBox()、EnumWindows()等。
gdi32.dll
gdi32.dll是GDI图形用户界面相关的,包含各种图形文字绘制的API,如BltBlt()、CreateDC()、CreateCompatibleDC()、SetBitmapBits()、SetTextColor()、TextOut()等。
advapi32.dll
advapi32.dll包含如下的API:
- 数据加密(Crypt开头)
- 用户和账号管理(Lsa开头)
- 注册表操作(Reg开头)
- WMI(Wmi开头)
- 终端服务(Wts开头)等
其他用户进程
- WinLogon.exe,登录进程,负责用户登录和安全有关的事务。它启动后,会创建 lsass.exe 和Services.exe。Windows XP的文件保护功能(Windows File Protection,简称WFP)也是在这个进程中实现的。
- lsass.exe,Local Security Authority Subsystem Service,本地安全和认证进程,负责用户身份验证。
- services.exe,服务管理进程,负责启动和管理系统服务程序。系统服务程序是按照NT系统服务规范编写的exe程序,通常没有用户界面,只在后台运行。例如:SvcHost.exe是一个通用的服务宿主程序。
- Shell,默认是explorer.exe,负责显示开始菜单、任务栏和桌面图标等。
其他环境子系统
Windows操作系统的环境子系统有三个:
- POSIX子系统,Portable Operating System Interface based on UniX,用于运行符合POSIX标准的程序。其核心文件是psxss.exe和psxdll.dll。
- OS/2子系统,支持16位的OS/2程序,其核心文件是os2.exe、os2srv.exe和os2ss.exe。
- Win32子系统(上面介绍的)