1:volatile(揮發的)

Download Report

Transcript 1:volatile(揮發的)

1
現代作業系統核心 第二組 分組報告
2.5 WINDOWS核心中的公用管理設施
2.6 WINDOWS啟動過程
指導教授 : 許富皓
組員 : 蔣秉芳 蕭少宇 陳逸軒 張勝豪
羅祐民 陳詩姍 陳映全
2
2.5.1 WINDOWS核心中的
物件管理
995202010 蔣秉芳
Windows 核心的物件管理
3

資源管理方式
 物件導向思維
 物件管理員-執行體中的元件
執行體API
視窗
圖形介面
……
物件管理員
(微)核心
硬體抽象層 (HAL)
檔
案
系
統
網
路
物件管理員
4

設計目的
 提供統一而可擴充的定義和控制機制
 提供一致的安全存取機制
 自由加入新的物件型別
 提供對物件執行操作的標準
 提供命名機制
API
物件的內容
5

物件標頭
typedef struct _OBJECT_HEADER {
LONG_PTR PointerCount;
…
…
POBJECT_TYPE Type;
UCHAR NameInfoOffset;
UCHAR HandleInfoOffset;
UCHAR QuotaInfoOffset;
…
…
} OBJECT_HEADER, *POBJECT_HEADER;
物件的內容
6

型別物件
typedef struct _OBJECT_TYPE {
…
UNICODE_STRING Name;
…
ULONG TotalNumberOfObjects;
ULONG TotalNumberOfHandles;
…
OBJECT_TYPE_INITIALIZER TypeInfo;
…
} OBJECT_TYPE, *POBJECT_TYPE;
物件的內容
7

型別物件的建立:函式呼叫
NTSTATUS
ObCreateObjectType(
__in PUNICODE_STRING TypeName,
__in POBJECT_TYPE_INITIALIZER ObjectTypeInitializer,
__in_opt PSECURITY_DESCRIPTOR SecurityDescriptor,
__out POBJECT_TYPE *ObjectType
);
物件的內容
8

型別物件的建立:初始化
typedef struct _OBJECT_TYPE_INITIALIZER {
USHORT Length;
…
OB_DUMP_METHOD DumpProcedure;
OB_OPEN_METHOD OpenProcedure;
OB_CLOSE_METHOD CloseProcedure;
OB_DELETE_METHOD DeleteProcedure;
OB_PARSE_METHOD ParseProcedure;
…
} OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
物件的內容
9

物件主體:函式呼叫
NTSTATUS
ObCreateObject(
…
__in POBJECT_TYPE ObjectType,
…
__in ULONG ObjectBodySize,
…
__out PVOID *Object
);
物件的內容
10

物件主體:實例
 行程和執行緒物件:行程
Status = ObCreateObject (PreviousMode,
PsProcessType,
ObjectAttributes,
PreviousMode,
NULL,
sizeof (EPROCESS),
0,
0,
&Process);
If(!NT_SUCESS (Status)){
goto exit_and_deref_parent;
}
物件的內容
11

物件主體:實例
 行程和執行緒物件:執行緒
Status = ObCreateObject (PreviousMode,
PsThreadType,
ObjectAttributes,
PreviousMode,
NULL,
sizeof (ETHREAD),
0,
0,
&Process);
If(!NT_SUCESS (Status)){
ObDereferenceObject (Process);
return Status;
}
物件的管理
12

通用服務
 OpenProcedure
 CloseProcedure
 DeleteProcedure
…
物件的管理
13

物件層次目錄:系統全域命名空間
 ObpDirectoryObjectType
 ObpRootDirectoryObject
 ObpLookupDirectoryEntry
(搜尋)
 ObpInsertDirectoryEntry (插入)
 ObpDeleteDirectoryEntry (刪除)
物件的管理
14

ObpLookupObjectName
 ObOpenObjectByName,
ObOpenReferenceByName
 參數檢查
 指定
RootDirectoryHandle ?
yes -> 用它的 Parse 來解析
no -> 從 ObpRootDirectoryObject 開始解析
 名稱以 \??\ 開頭 ? -> 拿取 DeviceMap
 名稱是 \?? -> 回傳 DeviceMap
 呼叫 ObpLookupDirectoryEntry,Recursive
物件的管理
15

命名空間的操作
 自訂全域名稱查詢:Parsing
執行體物件
16


系統位址空間
行程位址空間
 控制代碼
物件的計憶體架構
17


物件標頭的資料結構:OBJECT_HEADER
物件主體的資料結構:不一定
 QuotaInfo
 HandleInfo
 NameInfo
 CreatorInfo
#define OBJECT_TO_OBJECT_HEADER ( o ) \
CONTAINING_RECORE ( (o), OBJECT_HEADER, Body)
物件的生命週期
18

引用計數
 核心中的引用
 行程的控制代碼引用
19
2.5.2 登錄和組態管理員
995202102 陳映全
登錄和組態管理員
20

本節大綱
 討論登錄的整體架構
 組態管理員的實作機制以及介面
登錄和組態管理員
21

本節大綱
 討論登錄的整體架構
 組態管理員的實作機制以及介面
登錄
22


Windows作業系統提供了一個稱為”登錄(registry)”
的中央儲存機制作為系統的組態和管理中心,
應用程式和核心透過存取登錄來讀寫各種設置。
在核心中執行體包含一個稱為“組態管理員
(configuration manager)”的元件,它是登錄的真
正實作。
登錄的組成
23



登錄是由一組登錄區(hive)的檔案構成,每個登
錄區檔案的內部包含了一個樹狀層次架構。
可將其想像成一檔案系統,類似目錄和檔案架
構。
從這層角度來看,組態管理員就像一個檔案系
統的驅動程式。
登錄的組成
24

Windows 登錄是一個樹狀架構,每個節點是一
個機碼(key)或值(value)。
 機碼(key)可視為一個容器,就像是檔案系統中的目
錄,他可以包含其他的機碼(稱子機碼)和值。
 值(value)存放的是資料,就像是檔案系統中的檔案。

登錄的根是一個機碼,稱根機碼。
登錄的組成:值(value)
25

登錄的值有不同型態大致上有
 REG_DWORD(32位元整數)
 REG_BINARY(二進位資料)
 REG_SZ(字串)
 REG_LINK(符號連結)
 允許一個機碼或直指向另一個機碼或值
存取登錄的介面
26
登錄的根機碼
27
縮寫:HKLM
縮寫:HKU
縮寫:HKCU
縮寫:HKCR
縮寫:HKCC
功能:有關該機器上所
功能:有關目前使用者的資
功能:有關檔案關聯和COM的設
功能:有關目前硬體設
功能:有關目前系統資
有使用者帳戶資訊
置的資訊
訊
訊,這是一個符號連結,
備資訊,這是
指向HKU中對應的子機碼
HKLM\SOFTWARE\Classes和
HKCU\SOFTWARE\Classes兩棵
子樹經過合併後的一個檢視
登錄的最上層有8個根機碼:
其中5個如上述,而剩下3個為顯示
效能的資料在regedit.exe中並不顯示。
Ex:HKEY_PERFORMANCE_<XXX>
根機碼
28


HKLM:存放目前系統的組態資訊
有關系統全域的資訊其有5個子機碼
 HARDWARE(硬體設置)
 SAM(本機帳戶合群的資訊)
 SECURITY(系統全域範圍的安全性原則和使用者權限
設置)
 SOFTWARE(系統中的全域組態資訊,系統啟動時不
需要)
 SYSTEM(系統中的全域組態資訊,在系統啟動時需
要)
根機碼
29



HKU:以系統中的使用者為基礎存放著各個使用
者帳戶的設定資訊。
HKU和HKLM中的架構不隨目前登入帳戶而發生
變化,它們代表系統的全域檢視。
而其他3個根機碼:HKCU、HKCR、HKCC則會利用
HKU和HKLM中的資訊重構出一個特定於目前登
入使用者和目前硬體環境檢視 => 每個使用者
有自己獨特的設定。
如何建立登錄架構
30



一個系統的登錄清單存放在
HKLM\SYSTEM\CurrentControl\hivelist。
系統初始化時,HKLM\SYSTEM總是會被先載入
進來,然後組態管理員會去找到hivelist機碼,相
繼載入其他登錄區,並建立登錄根機碼。
將這些登錄區連結起來,從而建立起完整的登
錄架構。
Windows 系統中的hivelist機碼
31
登錄區架構
32


登錄區內部架構類似檔案系統
登錄區就相當於一個磁碟分割
 基本分配單元為block,大小為4KB

登錄區的第一個區塊稱為基本區塊
 登錄區檔案標示
 最新序號
 檢查碼
 最後操作時間
登錄區架構
33

登錄區的登錄資料是按照儲存格(cell)來組織的。
 儲存格的大小取決於他的型別和資料。
 每個儲存格可以存放一個機碼、一個值、
一個安全描述、一個子機碼清單、值清單
 每個儲存格在檔案中的偏移稱為該儲存格的索引
(cell index),其他儲存格可利用此索引來引用它。
登錄區架構
34

舉例:若父機碼要存取它的一個子機碼
 1.找到父機碼的子機碼清單儲存格
 2.從子機碼清單儲存格中找到對應的子機碼

子機碼清單依名稱排序過,而值清單的則沒有
被排序過。
 子機碼可利用2元搜尋去尋找想要的項目
儲存箱(bin)
35


由於儲存格的大小並非相同,組態管理員根據
需要從登錄區中申請特定大小的儲存空間作為
一個儲存格。
申請一個特殊的儲存單元稱儲存箱(bin)
 儲存箱以區塊(block)為邊界

當一個儲存格擴充登錄區檔案時,實際申請的
儲存空間要擴充到下一個邊界區塊。
如何方便存取登錄的Data
36

將登錄區檔案讀到記憶體中
 其儲存格索引可看成其檔案在記憶體中的起始位置
的偏移。
 須使用虛擬位址空間

組態管理員使用以下的分頁對照表來解決儲存
格的位置轉換。
儲存
類型
儲存格目錄索引
1位元
10位元
1:volatile(揮發的)
0:stable(穩定的)
儲存表格索引
9位元
32位元儲存格
區塊內偏移
12位元
登錄和組態管理員
37

本節大綱
 討論登錄的整體架構
 組態管理員的實作機制以及介面
組態管理員的實作
38


組態管理員是執行體中的元件,它的實作依賴
於記憶體管理員和快取管理員=>必須要初始化。
在系統初始化的初期,windows需要使用登錄中
的組態資訊,但此時組態管理員尚未初始化。
 在核心初始化前,核心載入器(ntldr)會將整個
HKLM\SYSTEM登錄區當作一個唯讀檔載入到記憶體
中。
組態管理員的實作
39

組態管理員和登錄初始化過程
 第一階段
 可以看作是組態管理員的初始化和登錄的臨時初始化。
 第二階段
 登錄中系統部分初始化
 第三階段
 登錄中使用者部分初始化
組態管理員和登錄初始化過程
40

第一階段:組態管理員的初始化



在核心初始化階段,建立起HKLM\SYSTEM和
HKLM\HARDWARE登錄區。
時間點:在物件管理員和快取管理員初始化以後,但是在
I/O子系統初始化以前。核心在這時間點以前不能存取登
錄中任何資訊,而在這時間點後就可以。
執行此一初始化過程會使用到函式:CmInitSystem1
組態管理員和登錄初始化過程
41

第二階段:系統部分初始化



系統緒程的主常式為CmpLoadHiveThread。
由工作階段管理員(smss.exe 行程)建立起HKLM\SAM、
HKLM\SECURITY、 HKLM\SOFTWAER和HKU\.DEFAULT登錄
區。
CmpLoadHiveThread會呼叫CmpInitHiveFoemFile將上述尚未
載入到登錄區的,作載入和初始化。
組態管理員和登錄初始化過程
42

第三階段:使用者部分初始化




當載入是用者設定檔時將建立起HKU\<使用者的SID> 登
錄區這個是由登錄行程(winlogon.exe)來完成的。
當需要特定於使用者的組態資訊時,登錄的HKU子樹下的
使用者登錄區也必須建立起來。
這些登錄區是按照個案所載入和初始化,譬如使用者登入
到系統中,或者系統以特定身分來啟動,都會不同。
其中CmLoadKey函式會完成實際的載入和連結。
組態管理員和登錄區元件
43


WRK包含了組態管理員的完整程式碼
登錄區的資料型別為CMHIVE
 其內嵌的HIVE成員是他的資料管理架構


在組態管理員的實作中,儲存格的資料結構為
HCELL,儲存箱的資料結構為HBIN。
空閒的儲存箱會形成一個空閒串列。
KEY
44



組態管理員定義了一個以“KEY”命名的物件型別,
將該命名空間與物件管理員的全域命名空間整合起
來。
對於每個開啟的登錄機碼,組態管理員分配一個機
碼控制區塊(key control block),其資料結構為
CM_KEY_CONTROL_BLOCK,它包含了該控制區塊
所引用的機碼節點所在的登錄區和儲存格索引。
組態管理員為每個登錄機碼在她的機碼控制區塊中
保存了一個值的快取,用於存放它值得清單
存取登錄機碼(1)
45

涉及到兩個常用操作:




使用者模式

NtOpenKey和NtQueryValueKey

ZwOpenKey和ZwQueryValueKey
核心的呼叫
上述兩組的功能是相同的
NTSTATUS
NtOpenKey(
_out PHANDLE KeyHandle,//傳回控制代碼
_in ACCESS_MASK DesireAccess,//存取模式
_in POBJECT_ATTRIBUTES ObjectAttributes,//指定物件的屬
性
存取登錄機碼(2)
46
NTSTATUS
NtQueryValueKey(
_in HANDLE KeyHandle, //要操作的登入機碼
(指示要查詢的登錄機碼)
_in PUNICODE_STRING ValueName,//登錄機碼下值的名稱
_in KEY_VALUE_INFORMANTION_CLASS KeyValueInformationClass,//
指定了待獲取的資訊型別
_out_bcount_opt(Length) PVOID KeyValueInformation,//接收資料的
緩衝區
_in ULONG Length,//緩衝區的長度
_out PULONG ResultLength,//實際傳回的長度
);
其他一些服務系統
47



組態管理員除了NtOpenKey和NtQueryValueKey函式外還提供
了NtCreateKey, NtDeleteValueKey, NtSaveKey,
NtSetValueKey…等
關於這些系統服務的定義和實作,參考
base\ntos\config\ntapi.c的檔案裡。
組態管理員還提供了登錄機碼的變化通知機制。

可以一次監視一個或多個登錄機碼的建立、刪除或修改動作
48
2.5.3 事件追蹤(ETW)
995202039 陳逸軒
ETW
49


Windows提供了統一的追蹤和紀錄事件的機制,
稱為ETW(Event Tracing for Windows)
User mode和kernel mode的驅動程式都可使用它
來記錄事件。
ETW
50

ETW為直接由kernel支援的事件紀錄機制,可分成三
個部分
 控制器:它有啟動、停止和配置事件紀錄的功能
 提供者:向ETW註冊事件類別,並由控制器控制事件紀
錄的啟動或停止
 消費者:可針對它們想要的事件資料,選擇一個或多個
紀錄事件
WMI
51


Windows有一個內建的提供者,稱為kernel logger,
專門用來記錄核心和核心驅動程式的事件,它由
WMI驅動程式實作(Windows Management
Instrumentation)。
WMI除了實作kernel logger的功能,也管理User
mode ETW 事件的註冊工作。由於它的實作是驅動
程式,所以其他核心常式或驅動程式可透過I/O介
面與它溝通。
WMI
52

雖然Windows早期提供了一些機制來報告錯誤或顯
示效能資料,但這些機制缺乏統一的程式編寫介
面,且都不具有良好的擴充能力。

隨著Windows系統越趨複雜,WMI隨之誕生,它是
工業標準WBEM(Web-Based Enterprise Management)
的一個實作。WBEM標準包含了一套針對企業系統
的資料獲取和資料管理機制的設計方法,具有很
好的靈活性和擴充性。
Kernel logger
53

它是一個預先定義的核心變數,支援多種事件
類別,並採用旗標位元(flag)來指示是否記錄某
一類型的事件。

旗標位元分成8個群組,每個群組使用一個遮罩
(29位元)來描述旗標位元,以下是相關定義
Kernel logger
54







#define PERF_MASK_INDEX
#define PERF_MASK_GROUP
PERF_MASK_INDEX)
(0xe0000000)
(~
#define PERF_NUM_MASKS 8
typedef ULONG PERFINFO_MASK;
Typedef struct _PERFINFO_GROUPMASK{
ULONG Masks[PERF_NUM_MASKS];
} PERFINFO_GROUPMASK, *PERFINFO_GROUPMASK;
Kernel logger
55


當控制器指示kernel logger紀錄核心事件時,就
會建構一個PERFINFO_GROUPMASK物件。
PERFINFO_GROUPMASK的Mask陣列包含8個
ULONG成員,每個ULONG的最高3位元是Index,
低29位元即是旗標位元。
Kernel logger
56




例如PERF_CONTEXT_SWITCH的定義:
#define PERF_CONTEXT_SWITCH 0x20000004
這說明Context switch的旗標位元是第2個群組的低3
位元
每當PERF_CONTEXT_SWITCH被設定時,每個Context
switch都會記錄一個CSWITCH事件。
Kernel logger
57

緩衝區管理是WMI的重要職責之一,它為切換
事件定義了一個緩衝區陣列,讓每個處理器有
它自己的緩衝區。

一旦某個處理器的緩衝區滿了,則WMI會來更
新該緩衝區,下次紀錄新的CSWITCH事件時重新
申請一個新的緩衝區。

接下來我們來看kernel logger的控制器和消費者。
xerpf
58


Microsoft提供了一個效能工具xerpf,它是一個
控制器兼消費者,利用I/O介面與WMI進行溝通。
Xerpf直接在ETW介面上工作,不會使用到
Windows SDK的事件追蹤API。
Windows Server 2003
59

雖然我們在Windows Server 2003中可以看到ETW和
WMI的完整實作程式碼,但因為Kernel logger只提供
了有限的事件類別,且缺乏成熟的分析工具,因此在
Server 2003及以前的Windows系統中,ETW及WMI並
沒有廣泛的使用。
Windows Server 2003
60

從Vista開始,kernel logger提供了大量的核心事件
資訊,包括緒程、行程、記憶體管理、同步機制、
檔案I/O、磁碟I/O等各方面,且在許多關鍵事件
上都可匯出呼叫堆疊,再配合使用xerpf,可大幅
提升分析能力,使得在新版的Windows系統中,有
希望解決許多原先非常棘手或無從解決的問題。
Windows Server 2003
61


Xerpf雖然不能直接在XP和Server 2003上安裝,但
它的可執行模組可在這些系統上執行,只不過受
限於kernel logger的能力,它無法截獲到如Vista中
那麼多的事件。
WMI的介面規格和kernel logger支援的事件類別在
不同版的Windows中保持一致,因此xerpf仍可在舊
版Windows上運作,不過WMI和kernel logger的內
部實作在新版Windows中有相關變化及調整。
62
2.5.4 安全性管理
995202096 陳詩姍
Windows 安全模型
63

作為一個現代作業系統,Windows 有嚴格的安全
模型。
以物件為基礎的任意存取控制(discretionary access
control)
 系統級的強制存取控制(mandatory access control)

任意存取控制模型
64



物件的所有者授權或拒絕哪些人可以存取該物件。
考慮到了物件擁有者遺失的情形。
不能保護系統中的所有操作。
系統關機
 備份檔案和目錄
 互動式登入到系統中

Windows作業系統的簡化安全模型
65
負責回應SAS(安全注意序列),
以及管理互動式登錄工作階段。
當使用者登錄到系統中時,
winlogon 創建一個初始行程,並
進一步由建立外殼(shell)行程。
負責本地系統的安全策略,
同時,它也認證用戶的身份,
以及將安全稽核訊息發送到
系統的事件日誌中。
包含了有關目前系統的一些資
訊,EX:誰被允許存取系統以及
如何存取(互動式登錄、網路
登入或者以服務方式登錄);
分配給誰哪些特權;安全稽核
如何進行等。
包含了本機使用者和使
用者群組,以及它們的
密碼和其他屬性。
負責執行物件的安全訪問檢查、
管理使用者特權、生成安全稽
核消息,並且定義了存取權杖
資料結構來表示一個安全環境。
Windows作業系統的安全模型
66

在Windows 的安全模型中
winlogon 負責系統登入,包括對用戶身份的認證。
 lsass 負責管理系統本機安全性原則的管理,並且將這
些策略通知到核心中的SRM。
 在核心中,SRM 負責實現基於物件的存取控制以及系
統全域安全性原則的實施。

Windows作業系統的安全模型
67

在Windows 的安全模型中
lsass 和SRM 對於系統的安全性至關重要,一旦這兩個
元件被惡意代碼修改或侵入,則系統的安全防線將不復
存在。
 Windows對這兩個元件有特殊的保護,普通應用程式無
法與它們打交道,它們相互之間通過LPC進行通訊。
 它們的LPC 連接在系統初始化時建立,而且,一旦其雙
向LPC 連接建立起來,它們的LPC 埠便不再接受任何其
他的連接請求,因而其他程式與它們無法建立LPC 連接。

Windows作業系統的安全模型
68



Windows 的自主存取模型與物件管理員整合在一起,每一
種物件型別都定義了一個Security 方法,該方法傳回一個
物件的安全資訊。
緒程在存取一個物件以前必須先開啟這個物件,並獲得一
個指向該物件的控制碼。
在開啟物件的操作中,物件管理員呼叫SRM的函式,根據
呼叫緒程的安全憑證、在開啟操作中請求的存取類型(EX:
讀、寫、刪除等),以及該型別物件的Security 方法提供
的物件安全資訊,來決定此開啟操作是否允許。
Windows作業系統的安全模型
69


如果可以開啟該物件,那麼,物件管理員在緒程的行程控
制代碼表中建立一個控制碼,記錄下該物件以及它所請求
的存取類型。
之後,當該緒程存取此物件時,它傳遞該物件的控制碼,
而物件管理員將該緒程所請求的存取操作與該物件被開啟
時所獲得的存取類型進行比較,如果目前的存取操作允許,
則安全檢查通過,否則此次物件存取失敗。
Windows作業系統的安全模型
70



每個緒程都有一個安全環境,其中最重要的資訊是一個存
取權杖(token),代表了該緒程的使用者的一次登錄。
每個物件都有一個任意存取控制清單(ACL),指明了允
許誰以何種方式存取該物件,而拒絕哪些用戶以何種方式
存取它。
為了存取一個物件,緒程可以不使用它所屬行程的安全環
境,而是以其他帳戶身份來運行的安全環境,這稱為模仿
(impersonation)。
Windows作業系統的安全模型
71


同一個行程中的其他緒程也可以利用已經得到的控制碼來
存取該物件。
同樣地,物件管理員使用呼叫緒程的安全環境和它所請求
的存取操作,對照該物件被打開時獲得的存取類型進行檢
查,以決定是否允許該操作。
SRM安全檢查
72
呼叫緒程的安全環境:
SECURITY_SUBJECT_CONTEXT
{
若模仿
ClientToken
權杖
PrimaryToken
…
不模仿
}
是物件管理員的函數,它將物件管理員與
SRM 的安全監視機制連接起來。
描述了一個用戶的一次登錄
由winlogon行程在認證了使用者身份以後建立
同一個使用者工作階段中執行的行程都使用同樣的權杖
呼叫ObCheckObjectAccess
然後呼叫型別物件的SecurityProcedure 函式成員,
獲得目標物件的SD(安全描述項),資料類型為
被存取物件
由它填充一個自包含的安全描述符緩衝區。
SECURITY_DESCRIPTOR。
執行安全訪問許可檢查。
ObGetObjectSecurity
SecurityProcedure
DACL
對於每一種類型的物件,系統在建立它的型別物
安全描述項包含了物件所有者的SID、DACL
、
件時,可以指定該類物件的Security方法,即
SACL,以及其他一些描述物件安全特徵的屬性。
SeAccessCheck 是SRM 的一個核心介面函式,真正
SeAccessCheck
SecurityProcedure 函數成員
執行檢查任務是在SepAccessCheck 函式中。
SepNormalAccessCheck 函數的實現較為
SepAccessCheck
SepNormalCheck
直截了當,對DACL 中的項逐一檢查是否
首先檢查呼叫者是否有SeSecurityPrivilege 特權,然後從物件的安全描述符中獲得DACL
允許或拒絕此次訪問操作。
否則,調用SepNormalAccessCheck
如果物件沒有DACL清單,則總是允許存取,傳回成功。
函數執行正常的許可檢查。
如果DACL 為空,則拒絕所有存取。
檢查
傳回
成功
拒絕
物件管理員開啟一個物件時SRM所執行的安全檢查
SePrivilegeCheck 函式的特權檢查程序
73
在權杖TOKEN 資料結構的定義中,有一個Privileges 成員,代表該權杖帳戶的所有特權
因此,SepPrivilegeCheck 函數的實作是,用一個雙重迴圈,對呼叫緒程所請求檢查的
SRM 的強制存取控制是透過特權檢查來實施的
每一個特權,遊走Token 參數中的Privileges 陣列成員,看是否符合。
SePrivilegeCheck 函數是SRM 中用於特權檢查的核心介面函式
SePrivilegeCheck
執行實際的特權檢查
SepPrivilegeCheck(Token,RequiredPrivileges,RequirePrivilegeCount,PrivilegeSetControl…)
目前緒程的安全環境
特權中已賦予
的特權集合
請求檢查的
合起來指明了呼叫緒程要請求的一組特權
特權集合
逐一匹配
定義了如何請求這些特權。
即,請求所有指定的特權或其中之一。
已匹配個數
檢查
傳回TRUE或FALSE
SePrivilegeCheck 函式的特權檢查程序
請求檢查所有的
特權或其中之一
SePrivilegeCheck 函式的特權檢查程序
74

在Windows 中,特權是由LUID 物件來標識的




LUID 代表一個本地唯一識別字(Locally Unique Identifier)
由兩個LONG 成員構成
每一個特權都附帶一些屬性,兩者結合起來構成了
LUID_AND_ATTRIBUTES 資料結構,而屬性是一個無符號長整數
類型。
以下是LUID_AND_ATTRIBUTES 及一組屬性的定義:
typedef struct _LUID_AND_ATTRIBUTES {
LUID Luid;
ULONG Attributes;
} LUID_AND_ATTRIBUTES, * PLUID_AND_ATTRIBUTES;
#define SE_PRIVILEGE_ENABLED_BY_DEFAULT
#define SE_PRIVILEGE_ENABLED
#define SE_PRIVILEGE_REMOVED
#define SE_PRIVILEGE_USED_FOR_ACCESS
(0x00000001L)
(0x00000002L)
(0X00000004L)
(0x80000000L)
SePrivilegeCheck 函式的特權檢查程序
75

Windows 核心中定義了一組特權,即型別為LUID 的
Se<Xxx>全域變數,其定義位於base\ntos\se\seglobal.c 檔
中,它們的初始化由該檔中的SepVariableInitialization 函數
來完成。
SePrivilegeCheck 函式的特權檢查程序
76

對於每一種特權,當相關聯的操作(即需要此特權才能進
行的操作)在核心中被適當的元件觸動時,應透過
SePrivilegeCheck 或它的包裝函數SeSinglePrivilegeCheck,
來檢查呼叫緒程是否具有相關的特權。


EX : SepCreateToken 函數在把權杖物件插入到行程的控制碼表之前
呼叫SeSinglePrivilegeCheck 函數來檢查當前緒程是否具有
SeCreateTokenPrivilege特權。
EX : IopParseDevice函數在打開一個設備物件時透過
IopCheckBackupRestorePrivilege函數(它呼叫SePrivilegeCheck)來檢
查呼叫緒程是否具有SeBackupPrivilege 或SeRestorePrivilege特權。
Conclusion
77


Windows 安全性管理是一個複雜的話題,其安全
模型涉及系統的各個層面,而且模型中的許多元
件和擴充架構是在使用者模式下運行的。
本節僅僅討論了Windows 安全性管理的核心部分,
即核心中的安全引用監視器,包括它的物件存取
和特權操作的檢查程序。
78
2.6.1 核心載入
995202041 張勝豪
2.6.1 核心載入
79

Windows setup
 寫入MBR
 寫入安裝Windows的磁碟分割的開機磁區

MBR(Master Boot Record)
 開機程式碼
 在系統啟動時首先獲得控制
 磁碟分割表
 指定每個磁碟分割的位置、大小、類型
80

MBR(Master Boot Record)
 開機程式碼
 檢查所有磁碟分割
 找到一個被標示為可啟動的磁碟分割(開機磁碟分割)
 載入開機磁碟分割的第一個磁區(開機磁區)到記憶體中
 將控制權交給開機磁區中的程式碼

開機磁區中的程式碼





提供該硬碟上磁碟區的架構和格式資訊給 Windows
從該磁碟區的根目錄讀入Windows的載入程式 – ntldr
將控制權交給 ntldr 的入口函式
包含能瞭解檔案系統及讀取檔案的程式碼
讀取其他磁區
81

ntldr

真實模式程式碼




完成需在16位元模式下執行的初始化動作
切換到保護模式
將控制權交給OS loader
保護模式程式碼(為PE格式),稱為OS loader






記憶體描述項(memory descriptor)
建構分頁目錄、分頁表、分頁目錄暫存器、開啟頁面對應機制
讀取boot.ini
執行ntdetect.com
載入核心模組映像檔 : ntoskrnl.exe、HAL映像檔
載入SYSTEM登錄區
82
typedef struct _LOADER_PARAMETER_BLOCK {
LIST_ENTRY LoadOrderListHead;
LIST_ENTRY MemoryDescriptorListHead;
LIST_ENTRY BootDriverListHead;
ULONG_PTR KernelStack;
ULONG_PTR Prcb;
ULONG_PTR Process;
ULONG_PTR Thread;
ULONG RegistryLength;
PVOID RegistryBase;
PCONFIGURATION_COMPONENT_DATA ConfigurationRoot;
PCHAR ArcBootDeviceName;
PCHAR ArcHalDeviceName;
PCHAR NtBootPathname;
PCHAR NtHalPathname;
PCHAR LoadOptions;
PNLS_DATA_BLOCK NlsData;
……
……
} LOADER_PARAMETER_BLOCK, *PLOADER_PARAMETER_BLOCK;
// 載入的模組串列
// 記憶體描述串列
// 啟動驅動程式串列
// 核心堆疊
// 行程環境,指向一個行程控制區塊
// 初始行程,EPROCESS
// 初始緒程,ETHREAD
// 系統登錄區的長度
// 系統登錄區的基底位址
// 配置樹,包含ISA、磁碟和ACPI
// 開機磁碟分割的ARC名稱
// 系統磁碟分割的ARC名稱
// OS目錄的路徑名稱,如”\Windows”
// OS載入器的路徑名稱,如”\”
// 啟動選項,來自boot.ini
// 包含ANSI內碼表、OEM內碼表、和
// Unicode內碼表
83
BIOS
└ MBR
└ 開機磁區
└ 開機磁區後續磁區
└ ntldr(真實模式部分) : 切換到保護模式
└ ntldr(保護模式部分 : os loader)
建構記憶體描述項陣列
對應頁面,設置分頁目錄暫存器,打開記憶體頁面對應機制
處理boot.ini
執行ntdetect.com
載入核心模組ntoskrnl.exe、hal.sys和SYSTEM登錄區
載入啟動驅動程式和必要的檔案驅動程式
建構LOADER_PARAMETER_BLOCK參數區塊
將控制交給核心模組ntoskrnl.exe的入口函式
84
2.6.2 核心初始化
995202027 蕭少宇
核心初始化
85

LOADER_PARAMETER_BLOCK
由ntldr建構
 存放與系統初始化相關的參數資訊


核心的初始化從核心模組ntoskrnl.exe的入口函式開
始


KiSystemStartup
核心的初始化分兩個階段進行
稱為階段0和階段1
 為了解決在初始化過程中的相互依賴性問題
 可透過檢查全域變數InitializationPhase的值來判斷目前
處於哪個階段

核心初始化
86

階段0初始化
將階段1初始化所需用到的基本資料結構建立起來
 禁止中斷,處理器可依序執行自己的初始化邏輯
 KiSystemStartup函式首先初始化處理器的狀態

調整IDT表
 初始化TSS(task state segmant)
 建構PCR(Processor Control Region)


然後呼叫HalInitializeProcessor函式


為目前處理器初始化其HAL中的PCR和處理器間中斷向量
接著呼叫KiInitializeKernel函式

執行核心初始化
核心初始化
87

KiInitializeKernel函式是實際執行核心初始化的函式
初始化核心資料結構
 初始化空閒緒程和行程物件
 初始化PCR
 呼叫執行體初始化函式ExpInitializeExecutive

呼叫HalInitSystem初始化HAL
 呼叫ExInitSystem初始化執行體元件的資料結構
 呼叫MmInitSystem初始化記憶體管理員和記憶體集區
 呼叫ObInitSystem初始化物件管理員
 呼叫SeInitSystem初始化安全子系統
 呼叫PsInitSystem初始化行程、緒程管理員
 呼叫PpInitSystem初始化隨插即用管理員
 呼叫DbgkInitSystem初始化偵錯子系統

核心初始化
88

行程管理員
在階段0除了初始化其內部的狀態變數
 也為初始行程建立一個行程物件“Idle”
 還建立了“System”行程
 以及建立一個系統緒程

開始常式為Phase1Initialization函式
 不立即被執行,因為在階段0過程中禁止中斷


KiInitializeKernel函式傳回後,KiSystemStartup啟動中
斷,將目前的中斷要求層級降低到DISPATCH_LEVEL,
從而允許緒程排程器選擇新的緒程

所以在階段0初始化完成後,階段1初始化常式
Phase1Initialization得以執行
核心初始化
89

階段1初始化是在System行程的一個系統緒程中執
行


Phase1Initialization函式呼叫Phase1InitializationDiscard執
行階段1初始化
若是在多處理器或多核系統上的初始化過程,在
Phase1InitializationDiscard的一個特定點上會呼叫
KeStartAllProcessors函式,以啟動其他的處理器

KeStartAllProcessors依次呼叫KiInitProcessor函式來啟動每
個處理器
在KiInitProcessor中呼叫KiInitProcessorState建構每個處理器的狀
態資訊
 然後呼叫HalStartNextProcessor函式啟動該處理器

核心初始化
90

非啟動處理器的初始化過程雖然也執行
KiSystemStartup,但是其執行邏輯相對要簡單很多
同樣地,KiSystemStartup也呼叫HalInitializeProcessor和
KiInitializeKernel來執行HAL和核心部分的初始化
 KiInitializeKernel函式也呼叫ExpInitializeExecutive
 但是ExpInitializeExecutive僅呼叫HalInitSystem
 因為有些初始化過程,特別是核心執行體原件的初始化
常式,它們的處理邏輯針對整個系統,而非屬於某個處
理器,所以只需在啟動處理器上執行一次即可
 而另外有些初始化過程,則是針對單個處理器的初始化,
因而需要針對每個處理器都執行一次

核心初始化
91

階段1初始化的主函式為
Phase1InitializationDiscard
 呼叫IoInitSystem初始化I/O子系統
 I/O子系統中的狀態變數初始化
 驅動程式物件型別和裝置物件型別的建立等等…
 所花時間較長
 呼叫SeRmInitPhase1執行安全引用監視器(SRM)初始
化
 建立安全引用監視器的命令服務緒程
 建立工作階段管理員子系統行程(smss.exe)
 呼叫RtlCreateUserProcess函式以建立smss行程
92
2.6.3 建立使用者登入工
作階段
995202054 羅祐民
工作階段管理員子系統(smss)
93

於階段1初始化完成的最後階段啟動
 為可信任的
 建立在Windows核心的基礎上
 只使用核心提供之系統服務
 使用者模式行程
 建立系統安全權杖
工作階段管理員子系統(smss)
94


啟動Windows子系統
載入登錄區,建立登錄樹
工作階段管理員子系統(smss)
95


HKLM\SYSTEM\CurrentControlSet\Control\Session
Manager
指示smss在系統初始化必須執行之工作
Smss主緒程
96



執行在啟動時執行的程式,這些程式由
BootExecute 值指定。
執行啟動時的檔案刪除或重命名任務,這由
FileRenameOperations 子機碼來指定。
開啟已知的DLL,並且在物件管理員命名空間的
\KnownDlls 目錄下創建相應的記憶體區段物件。

這些已知DLL 的列表位於KnownDLLs 子鍵中。
Smss主緒程
97



建立分頁檔,分頁檔清單由MemoryManagement
子機碼的PagingFiles 值指定。
建立系統的全域環境變數,這些環境變數由
Environment 機碼下的值指定。
載入Windows 子系統的內核模式模組( win32k.sys
)。
經由系統服務NtSetSystemInformation 來完成的,該函數也
會呼叫win32k.sys 中的初始化常式(即入口函數)。
 子系統內核模組的檔案路徑由SubSytstems 子機碼的Kmode
值指定。

Smss主緒程
98
啟動Windows 子系統進程(csrss.exe)。 子系統
進程的命令行字符串由SubSystems子機碼的
Windows 值指定。
提供多工作階段和本機登入服務
 建立LPC埠物件(\SmApiPort),以接收“載入子
系統”或“建立工作階段”的請求。
 啟動登入行程(winlogon.exe),登入行程將會承
擔起與用戶登入有關的事項。

Smss主緒程
99

Winlogon行程
 建立初始的窗口站(WinSta0),並且為該窗口站
創建一個桌面緒程和RIT(Raw Input Thread)緒程以
便接收標準輸入。
 建立登入桌面和預設桌面。
 登錄桌面只有winlogon
進程才可以存取;而預設桌面允
許其他進程訪問。 當登入桌面活動時,其他行程法存
取與該桌面關聯的程式碼或資料。
 Windows 用這種方式來保護與密碼相關的操作,以及
鎖定桌面或解除桌面鎖定這樣的安全操作。
Smss主緒程
100

Winlogon行程
 啟動服務控制管理器(SCM,Service
Control
Manager)行程(services.exe)。

SCM 行程載入所有“自動-啟動”類型的服務和裝置驅
動程式。
 啟動本地安全授權子系統(
lsass ) 行程。 然後與
它建立一個LPC 連接(LsaAuthenticationPort 埠),
以便在登入、登出和密碼操作過程中交換信息。
Smss行程
101
Winlogon透過GINA獲得使用者名稱密碼,
建立”\SmApiPort” 呼叫lsass函式
LPC連接埠物件,以接收“建立工作階段”請求
載入Windows子系統核心模組 win32k.sys
啟動csrss行程
啟動winlogon行程
認證成功則winlogon
建立視窗工作站
登入最後,winlogon檢查登錄檔的 建立登錄桌面和預設桌面繼續該使用者的登入
過程;否則失敗
Userinit值。
啟動SCM行程
載入”自動-啟動”的服務和裝置驅
動程式
啟動lsass行程
使用者按下Ctrl+Alt+Del
Userinit載入目前登入使用者的設
LsaLookupAuthenticationPackage獲
登錄到系統中
定檔,檢查登錄檔的Shell值,並
請求認證
得驗證封裝的控制代碼
建立行程來執行該值;若該值不存
lsass行程
在,則執行預設值為Explorer.exe
認證成功
呼叫LsaLogonUser將登入資訊傳
的登錄檔。
送給驗證封裝
啟動userinit行程
Userinit行程結束。且Shell已啟動,
使用者可在桌面上操作。
啟動Shell行程(Explorer.exe)
結束
使用者操作機器
Windows服務組態
102



Windows 服務是Windows 系統中一種重要的管
理機制。
Windows 服務控制管理行程,即SCM 的職責之
一是,在啟動過程的後期,將標記為“自動-啟
動”的服務應用程式或裝置驅動程式啟動或載
入到系統中。
SCM 根據登錄機碼
HKLM\SYSTEM\CurrentControlSet\Services 下的子
機碼來確定如何處理每一個已被安裝到系統中
的服務。
Windows服務組態
103

EventSystem登錄機碼
Windows服務組態
104

Type:代表服務類型
 1、2、8代表裝置驅動程式、檔案系統驅動程式、
檔案系統辨識驅動程式

Start:代表服務或裝置啟動類型
 0表示”開機-啟動”驅動程式、1表示”系統-啟動”驅
動程式


ImagePath:指定該服務或驅動裝置的可執行檔路
徑
ObjectName:指定此服務將在哪個帳號下執行(只
用於windows服務)
105


Group:指示該服務或驅動程式屬於一個群組
DependOnGruop、DependOnService:指定服務或
驅動程式依賴於其他那些服務或群組