

用戶態
用戶態有四類組件,這四類組件都是以進程形式存在的,也就是說,它們都有自己的進程地址空間(其實就是一套頁表)。
1. System Support Processes
這些是固化的進程,也就是說是操作系統結合在一起的進程。
比如logon process(winlogon.exe),Session manager(smss.exe)。
Session Manager [smss.exe] Local Session Manager [lsm.exe] Service Control Manager [services.exe] Local Security Authority [lsass.exe] Winlogon [winlogon.exe] Wininit [wininit.exe]
它們都不屬於service,因為它們都不是由SCM(Service Control Manager)啟動的。
lsass.exe和lsm.exe就是service。
2. Service Processes
Service進程是由SCM啟動的,它們與user logon是獨立的,因為有些service的啟動時機比winlogon.exe還早。
Task Scheduler和Print Spooler都是services。
Service Host [svchost.exe]
3. User Applications
就是常說的應用程序。
4. Environment Subsystem Server Processes
就是常說的“環境子系統”,也就是“Win32子系統”。
[csrss.exe]
Subsystem Dynamic Libraries
由四個dll組成:
Kernel32.dll Advapi32.dll User32.dll Gdi32.dll
它們實際上是Service Processes和User Applications的一部分,以dll的形式加載到它們的進程地址空間中去的。
它們的作用是向Service Processes和User Applications提供Win32 API接口。
Win32 API在實現上分為三類:
1. 完全在這四個dll的內部實現。
2. 通過這四個dll,調用更加底層的(內核態,比如內核或者驅動)實現。
3. 這四個dll與Environment Subsystem Server Processes建立C/S通信模型,dll作為client請求Win32子系統的server進程(用戶態進程)來提供相應的實現。
內核態
內核態組件分為以下幾類:
1. Windows Executive
可以理解為內核態的管理程序,其實就是各個模塊子系統。
比如內存管理模塊,進程與線程管理模塊,安全模塊,IO模塊,網絡模塊,以及進程間通信模塊。
2. Windows Kernel
狹義上的內核,提供內核態中的核心操作,比如線程調度與切換,中斷和異常的分發與處理,以及多處理的同步等等。
它其實就是一組函數的集合。
3. Device Driver
內核態驅動。
4. HAL
Hardware Abstract Layer
用來隱藏與平台相關的細節,並且向上提供統一的API接口。
5. Windowing and Graphics System
窗口與繪圖系統。用來提供GUI相關功能。
這5個組件大部分都存在於一個Ntoskrnl.exe中,當然一些第三方的driver除外。
Windows Subsystem
Windows子系統包含兩部分:
即上面所描述的用戶態的Environment Subsystem Service Processes和內核態的Windowing and Graphics System。
用戶態的Win32子系統服務進程
[csrss.exe] Basesrv.dll Winsrv.dll Csrsrv.dll
向Win32 Subsystem dll代表的client提供以下功能支持:
1. Console Windows(命令行窗口,即不帶GUI功能,不涉及到Win32k.sys)
2. 創建和刪除Process/Thread
3. Side-by-Side(Sxs)支持
等等。
內核態的Win32k.sys驅動
提供以下功能:
1. 窗口管理器,以及與GUI相關的輸入輸出設備,消息傳遞等機制。
2. 提供GDI繪圖庫。
3. DirectX的支持(在另一個驅動Dxgkrnl.sys中實現)
Ntdll
與Subsystem dll不同,Ntdll是所有用戶態進程與內核態進行交互的必經之路。
ntdll包含兩類函數:
1. System Service Stub
這些函數是調用內核Executive組件提供的系統服務的入口函數。
函數內部包含與平台相關的代碼,使代碼的執行由用戶態轉入內核態執行,比如int 80H或者sysenter等等。
在內核中與Stub對應的是SSDT,System Service Dispatch Table,根據ntdll的stub函數傳入的系統調用號,從SSDT表中選擇對應的service routine執行。
2. Operating System Internal Support Functions
這部分不是給應用程序使用的,而是給用戶態的操作系統組件,比如System Support Processes和Environment Subsystem Service Processes來使用。
包括下面幾類:
- Image Loader functions, Ldr[XXXX]
- Heap Manager
- Windows Subsystem Process Communication functions, Csr[XXXX]
- Runtime Library Routines, Rtl[XXXX]
- User-mode Debugging, DbgUi[XXXX]
- Event Tracing for Windows, Etw[XXXX]
- User-mode Asynchronous Procedure Call(APC) Dispatcher
- Exception Dispatcher
- subset of C Run-time(CRT)
Executive
executive,可以理解為內核的表現層
包含以下幾類函數集合:
1. System Services
導出給用戶態進程使用的函數,其中大部分通過API向普通應用程序開放,而少部分則只能給用戶態的操作系統組件使用。
2. Device Driver
3. WDK Interface Functions
可以被內核態的驅動調用的函數,比如Zw[XXXX]
4. WDK未導出的函數
內核態的驅動也不能夠調用
比如Inbv[XXXX]
5. 未導出的全局變量
Internal IO manager support functions, Iop[XXXX]
Internal Memory management support functions, Mi[XXXX]
6. 各個模塊內部的函數,沒有被定義為全局符號
Kernel
Kernel里面實現的是操作系統最基本的功能,比如線程調度和同步等等。
Kernel的代碼是平台相關的,用來處理與平台相關的一些功能,比如中斷和異常分發。
Kernel也會通過WDK接口向驅動導出一些函數,比如Ke[XXXX]
kernel與executive的區別在於,kernel幾乎不做任何決策,只是提供基礎的支持功能。
kernel唯一自己做決策的是線程的調度與分發。
kernel objects
kernel提供的object是最基本的對象,方便進行創建和管理。
而executive用到的objects大都是特化的object,里面包含不同的overhead,因此往往一個executive object,包含幾個的kernel objects.
kernel objects分為幾類:
1. Control Objects
APC objects, DPC objects, Interrupt objects
2. Dispatcher Objects
kernel thread, mutex, event, kernel event pair, semaphore, timer, waitable timer
Kernel Processor Control Region(KPCR)
用來保存與processor相關的信息,也可以理解為與平台相關的信息。
比如:
- Interrupt Dispatcher Table(IDT)
- Task-State Segment(TSS)
- Global Descriptor Table(GDT)
在32位Windows操作系統中,fs:[0]可以索引到KPCR;
在x64 Windows操作系統中, gs:[0]可以索引到KPCR;
在IA64 Windows操作系統中, 0xE0000000FFFF0000可以索引到KPCR;
在KPCR中有一個內嵌的結構體叫KPRCB(Kernel Processor Control Block)
里面保存的是不公開的內容,主要是與Processor相關的信息,比如Nonpaged pool和paged pool的lookaside list就保存在KPRCB中。
HAL
Device Driver
System Processes
系統進程
1. Idle Processes
Idle 和 System是兩個比較特殊的進程,因為這們不是完整意義的進程,沒有實際的映像文件。
Idle Process是0號進程。
2. Interrupts and DPCs
這兩個不是進程,而是中斷發生時,內核提供的異步處理機制。
但是這兩種全程會消耗CPU,因此為了提供更多的關於CPU使用情況的細節,許多系統監視器都會將二者列出來。
3. System Process and System Threads
4號進程。
提供了一個供內核線程運行的進程空間,但是注意,這個進程只包含內核地址空間,而不包含用戶地址空間。
內核和驅動可以調用PsCreateSystemThread來創建System Thread,通常只在需要Thread Context的情況下才會創建System Thread,比如
ISR和DPC就不是System Thread。
4. Session Manager (Smss.exe)
負責初始化最后階段的內核態進程創建了smss.exe這個進程,這是用戶態的第一個進程。
Session Manager還有很多特殊的任務,比如完成delayed rename/delete file operation。
Session Manager會創建Subsystem server processes(csrss.exe),csrss.exe進程會創建剩余的system processes。
對於Session 0,smss.exe會創建wininit.exe進程,除此之外,smss.exe會為每個session創建一個Winlogon.exe進程。
5. Winlogon, LogonUI, LSASS和Userinit
SAS(Control + Alt + Delete), Secure Attention Sequence,是用來保證用戶會調用到正確的Winlogon進程,因為這三個鍵的組合是不允許在用戶態被攔截的。
Winlogon進程會在需要的情況下,創建LogonUI,用來提供用戶登陸界面。
LSASS服務進程會提供認證的功能,認證成功后,lsass會創建一個access token,對於UAC情況下,對於擁有管理員權限的用戶,還會創建一個權限受限的access token,並且讓用戶在正常情況下使用這個受限的access token。
6. Service Control Manager (SCM)
services,也就是用戶態的無界面進程,和Linux的Daemon Process一樣。
service進程通常不與logon user產生任何互動。
services也是正常的進程,只是它們的生命周期是通過特殊的API與SCM通信來控制的。
services可以擁有自己的執行映像,比如lsass.exe,也可以只提供一個dll,而借用通用的svchost.exe來啟動進程。
