+ All Categories
Home > Documents > 2.5 Windows 核心中的公用管理設施

2.5 Windows 核心中的公用管理設施

Date post: 01-Jan-2016
Category:
Upload: carson-brady
View: 61 times
Download: 2 times
Share this document with a friend
Description:
現代作業系統核心 第二組 分組報告. 2.6 Windows 啟動過程. 指導教授 : 許富皓. 2.5 Windows 核心中的公用管理設施. 組員 : 蔣秉芳 蕭少宇 陳逸軒 張勝豪 羅祐民 陳詩姍 陳映全. 2.5.1 Windows 核心中的 物件管理. 995202010 蔣秉芳. Windows 核心的物件管理. 資源管理方式 物件導向思維 物件管理員-執行體中的元件. 執行體 API. 視窗 圖形介面. ……. 檔案系統. 網路. 物件管理員. ( 微 ) 核心. 硬體抽象層 (HAL). - PowerPoint PPT Presentation
Popular Tags:
105
2.5 WINDOWS 核核核核核核核核核核 2.6 WINDOWS 核核核核 核核核核核核核核 核核核 核核核核 核核核核 : 核核核 核核 : 核核核 核核核 核核核 核核核 核核核 核核核 核核核 1
Transcript
Page 1: 2.5 Windows 核心中的公用管理設施

2.5 WINDOWS 核心中的公用管理設施2.6 WINDOWS 啟動過程

現代作業系統核心 第二組 分組報告

指導教授 : 許富皓組員 : 蔣秉芳 蕭少宇 陳逸軒 張勝豪

羅祐民 陳詩姍 陳映全

1

Page 2: 2.5 Windows 核心中的公用管理設施

2.5.1 WINDOWS 核心中的 物件管理

995202010 蔣秉芳

2

Page 3: 2.5 Windows 核心中的公用管理設施

Windows 核心的物件管理 資源管理方式

物件導向思維 物件管理員-執行體中的元件

硬體抽象層 (HAL)

( 微 ) 核心

物件管理員

……視窗圖形介面

檔案系統

網路

執行體 API

3

Page 4: 2.5 Windows 核心中的公用管理設施

物件管理員 設計目的

提供統一而可擴充的定義和控制機制 提供一致的安全存取機制 自由加入新的物件型別 提供對物件執行操作的標準 API 提供命名機制

4

Page 5: 2.5 Windows 核心中的公用管理設施

物件的內容 物件標頭

typedef struct _OBJECT_HEADER { LONG_PTR PointerCount; … …

POBJECT_TYPE Type; UCHAR NameInfoOffset; UCHAR HandleInfoOffset; UCHAR QuotaInfoOffset; … …

} OBJECT_HEADER, *POBJECT_HEADER;

5

Page 6: 2.5 Windows 核心中的公用管理設施

物件的內容 型別物件

typedef struct _OBJECT_TYPE { … UNICODE_STRING Name; …

ULONG TotalNumberOfObjects; ULONG TotalNumberOfHandles; …

OBJECT_TYPE_INITIALIZER TypeInfo; …

} OBJECT_TYPE, *POBJECT_TYPE;

6

Page 7: 2.5 Windows 核心中的公用管理設施

物件的內容 型別物件的建立:函式呼叫

NTSTATUSObCreateObjectType( __in PUNICODE_STRING TypeName, __in POBJECT_TYPE_INITIALIZER ObjectTypeInitializer, __in_opt PSECURITY_DESCRIPTOR SecurityDescriptor, __out POBJECT_TYPE *ObjectType);

7

Page 8: 2.5 Windows 核心中的公用管理設施

物件的內容 型別物件的建立:初始化

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;

8

Page 9: 2.5 Windows 核心中的公用管理設施

物件的內容 物件主體:函式呼叫

NTSTATUSObCreateObject( … __in POBJECT_TYPE ObjectType,

… __in ULONG ObjectBodySize,

… __out PVOID *Object);

9

Page 10: 2.5 Windows 核心中的公用管理設施

物件的內容 物件主體:實例

行程和執行緒物件:行程Status = ObCreateObject (PreviousMode, PsProcessType,

ObjectAttributes,PreviousMode,NULL,sizeof (EPROCESS),0,0,&Process);

If(!NT_SUCESS (Status)){goto exit_and_deref_parent;

}

10

Page 11: 2.5 Windows 核心中的公用管理設施

物件的內容 物件主體:實例

行程和執行緒物件:執行緒Status = ObCreateObject (PreviousMode, PsThreadType,

ObjectAttributes,PreviousMode,NULL,sizeof (ETHREAD),0,0,&Process);

If(!NT_SUCESS (Status)){ObDereferenceObject (Process);return Status;

}

11

Page 12: 2.5 Windows 核心中的公用管理設施

物件的管理 通用服務

OpenProcedure CloseProcedure DeleteProcedure …

12

Page 13: 2.5 Windows 核心中的公用管理設施

物件的管理 物件層次目錄:系統全域命名空間

ObpDirectoryObjectType ObpRootDirectoryObject ObpLookupDirectoryEntry ( 搜尋 ) ObpInsertDirectoryEntry ( 插入 ) ObpDeleteDirectoryEntry ( 刪除 )

13

Page 14: 2.5 Windows 核心中的公用管理設施

物件的管理 ObpLookupObjectName

ObOpenObjectByName, ObOpenReferenceByName

參數檢查 指定 RootDirectoryHandle ?

yes -> 用它的 Parse 來解析no -> 從 ObpRootDirectoryObject 開始

解析 名稱以 \??\ 開頭 ? -> 拿取 DeviceMap 名稱是 \?? -> 回傳 DeviceMap 呼叫 ObpLookupDirectoryEntry , Recursive

14

Page 15: 2.5 Windows 核心中的公用管理設施

物件的管理 命名空間的操作

自訂全域名稱查詢: Parsing

15

Page 16: 2.5 Windows 核心中的公用管理設施

執行體物件 系統位址空間 行程位址空間

控制代碼

16

Page 17: 2.5 Windows 核心中的公用管理設施

物件的計憶體架構 物件標頭的資料結構: OBJECT_HEADER 物件主體的資料結構:不一定

QuotaInfo HandleInfo NameInfo CreatorInfo

#define OBJECT_TO_OBJECT_HEADER ( o ) \ CONTAINING_RECORE ( (o), OBJECT_HEADER, Body)

17

Page 18: 2.5 Windows 核心中的公用管理設施

物件的生命週期 引用計數

核心中的引用 行程的控制代碼引用

18

Page 19: 2.5 Windows 核心中的公用管理設施

2.5.2 登錄和組態管理員995202102 陳映全

19

Page 20: 2.5 Windows 核心中的公用管理設施

登錄和組態管理員

本節大綱

討論登錄的整體架構

組態管理員的實作機制以及介面

20

Page 21: 2.5 Windows 核心中的公用管理設施

登錄和組態管理員

本節大綱

討論登錄的整體架構

組態管理員的實作機制以及介面

21

Page 22: 2.5 Windows 核心中的公用管理設施

登錄 Windows 作業系統提供了一個稱為”登錄

(registry)” 的中央儲存機制作為系統的組態和管理中心,應用程式和核心透過存取登錄來讀寫各種設置。

在核心中執行體包含一個稱為“組態管理員(configuration manager)” 的元件,它是登錄的真正實作。

22

Page 23: 2.5 Windows 核心中的公用管理設施

登錄的組成 登錄是由一組登錄區 (hive) 的檔案構成,每個

登錄區檔案的內部包含了一個樹狀層次架構。 可將其想像成一檔案系統,類似目錄和檔案架

構。 從這層角度來看,組態管理員就像一個檔案系

統的驅動程式。

23

Page 24: 2.5 Windows 核心中的公用管理設施

登錄的組成 Windows 登錄是一個樹狀架構,每個節點是

一個機碼 (key) 或值 (value) 。 機碼 (key) 可視為一個容器,就像是檔案系統中的

目錄,他可以包含其他的機碼 ( 稱子機碼 ) 和值。 值 (value) 存放的是資料,就像是檔案系統中的檔

案。 登錄的根是一個機碼,稱根機碼。

24

Page 25: 2.5 Windows 核心中的公用管理設施

登錄的組成 : 值 (value)

登錄的值有不同型態大致上有 REG_DWORD(32 位元整數 ) REG_BINARY( 二進位資料 ) REG_SZ( 字串 ) REG_LINK( 符號連結 )

允許一個機碼或直指向另一個機碼或值

25

Page 26: 2.5 Windows 核心中的公用管理設施

存取登錄的介面26

Page 27: 2.5 Windows 核心中的公用管理設施

登錄的根機碼

縮寫 :HKU功能 : 有關該機器上所有使用者帳戶資訊

縮寫 :HKCU功能 : 有關目前使用者的資訊,這是一個符號連結,指向 HKU 中對應的子機碼

縮寫 :HKCR功能 : 有關檔案關聯和 COM的設備資訊,這是 HKLM\SOFTWARE\Classes 和HKCU\SOFTWARE\Classes兩棵子樹經過合併後的一個檢視

縮寫 :HKCC功能 : 有關目前硬體設置的資訊

縮寫 :HKLM功能 : 有關目前系統資訊

登錄的最上層有 8 個根機碼 :其中 5 個如上述,而剩下 3 個為顯示效能的資料在 regedit.exe 中並不顯示。 Ex:HKEY_PERFORMANCE_<XXX>

27

Page 28: 2.5 Windows 核心中的公用管理設施

根機碼 HKLM: 存放目前系統的組態資訊 有關系統全域的資訊其有 5 個子機碼

HARDWARE( 硬體設置 ) SAM( 本機帳戶合群的資訊 ) SECURITY( 系統全域範圍的安全性原則和使用者

權限設置 ) SOFTWARE( 系統中的全域組態資訊,系統啟動

時不需要 ) SYSTEM( 系統中的全域組態資訊,在系統啟動時需要 )

28

Page 29: 2.5 Windows 核心中的公用管理設施

根機碼 HKU: 以系統中的使用者為基礎存放著各個使用

者帳戶的設定資訊。 HKU 和 HKLM 中的架構不隨目前登入帳戶而發

生變化,它們代表系統的全域檢視。 而其他 3 個根機碼 :HKCU、 HKCR、 HKCC

則會利用 HKU 和 HKLM 中的資訊重構出一個特定於目前登入使用者和目前硬體環境檢視 => 每個使用者有自己獨特的設定。

29

Page 30: 2.5 Windows 核心中的公用管理設施

如何建立登錄架構 一個系統的登錄清單存放在 HKLM\SYSTEM\

CurrentControl\hivelist 。 系統初始化時, HKLM\SYSTEM總是會被先載

入進來,然後組態管理員會去找到 hivelist 機碼,相繼載入其他登錄區,並建立登錄根機碼。

將這些登錄區連結起來,從而建立起完整的登錄架構。

30

Page 31: 2.5 Windows 核心中的公用管理設施

Windows 系統中的 hivelist 機碼

31

Page 32: 2.5 Windows 核心中的公用管理設施

登錄區架構 登錄區內部架構類似檔案系統 登錄區就相當於一個磁碟分割

基本分配單元為 block ,大小為 4KB 登錄區的第一個區塊稱為基本區塊

登錄區檔案標示 最新序號 檢查碼 最後操作時間

32

Page 33: 2.5 Windows 核心中的公用管理設施

登錄區架構 登錄區的登錄資料是按照儲存格 (cell) 來組織

的。 儲存格的大小取決於他的型別和資料。 每個儲存格可以存放一個機碼、一個值、 一個安全描述、一個子機碼清單、值清單 每個儲存格在檔案中的偏移稱為該儲存格的索引

(cell index) ,其他儲存格可利用此索引來引用它。

33

Page 34: 2.5 Windows 核心中的公用管理設施

登錄區架構 舉例 :若父機碼要存取它的一個子機碼

1.找到父機碼的子機碼清單儲存格 2. 從子機碼清單儲存格中找到對應的子機碼

子機碼清單依名稱排序過,而值清單的則沒有被排序過。 子機碼可利用 2 元搜尋去尋找想要的項目

34

Page 35: 2.5 Windows 核心中的公用管理設施

儲存箱 (bin)

由於儲存格的大小並非相同,組態管理員根據需要從登錄區中申請特定大小的儲存空間作為一個儲存格。

申請一個特殊的儲存單元稱儲存箱 (bin) 儲存箱以區塊 (block) 為邊界

當一個儲存格擴充登錄區檔案時,實際申請的儲存空間要擴充到下一個邊界區塊。

35

Page 36: 2.5 Windows 核心中的公用管理設施

如何方便存取登錄的 Data

將登錄區檔案讀到記憶體中 其儲存格索引可看成其檔案在記憶體中的起始位置

的偏移。 須使用虛擬位址空間

組態管理員使用以下的分頁對照表來解決儲存格的位置轉換。

儲存類型 儲存格目錄索引 儲存表格索引 區塊內偏移

32位元儲存格

1 位元

10 位元

9 位元 12 位元

0:stable(穩定的 )

1:volatile(揮發的 )

36

Page 37: 2.5 Windows 核心中的公用管理設施

登錄和組態管理員

本節大綱

討論登錄的整體架構

組態管理員的實作機制以及介面

37

Page 38: 2.5 Windows 核心中的公用管理設施

組態管理員的實作 組態管理員是執行體中的元件,它的實作依賴於記憶體管理員和快取管理員 =>必須要初始化。

在系統初始化的初期, windows需要使用登錄中的組態資訊,但此時組態管理員尚未初始化。 在核心初始化前,核心載入器 (ntldr)會將整個

HKLM\SYSTEM 登錄區當作一個唯讀檔載入到記憶體中。

38

Page 39: 2.5 Windows 核心中的公用管理設施

組態管理員的實作 組態管理員和登錄初始化過程

第一階段 可以看作是組態管理員的初始化和登錄的臨時初始化。

第二階段 登錄中系統部分初始化

第三階段 登錄中使用者部分初始化

39

Page 40: 2.5 Windows 核心中的公用管理設施

組態管理員和登錄初始化過程

第一階段 : 組態管理員的初始化 在核心初始化階段,建立起 HKLM\SYSTEM 和 HKLM\

HARDWARE 登錄區。 時間點 : 在物件管理員和快取管理員初始化以後,但是在

I/O 子系統初始化以前。核心在這時間點以前不能存取登錄中任何資訊,而在這時間點後就可以。

執行此一初始化過程會使用到函式 :CmInitSystem1

40

Page 41: 2.5 Windows 核心中的公用管理設施

組態管理員和登錄初始化過程

第二階段 : 系統部分初始化 系統緒程的主常式為 CmpLoadHiveThread 。 由工作階段管理員 (smss.exe 行程 ) 建立起 HKLM\

SAM、 HKLM\SECURITY、 HKLM\SOFTWAER 和HKU\.DEFAULT 登錄區。

CmpLoadHiveThread會呼叫 CmpInitHiveFoemFile將上述尚未載入到登錄區的,作載入和初始化。

41

Page 42: 2.5 Windows 核心中的公用管理設施

組態管理員和登錄初始化過程第三階段 : 使用者部分初始化

當載入是用者設定檔時將建立起 HKU\< 使用者的 SID> 登錄區這個是由登錄行程 (winlogon.exe) 來完成的。

當需要特定於使用者的組態資訊時,登錄的 HKU 子樹下的使用者登錄區也必須建立起來。

這些登錄區是按照個案所載入和初始化,譬如使用者登入到系統中,或者系統以特定身分來啟動,都會不同。

其中 CmLoadKey 函式會完成實際的載入和連結。

42

Page 43: 2.5 Windows 核心中的公用管理設施

組態管理員和登錄區元件 WRK 包含了組態管理員的完整程式碼 登錄區的資料型別為 CMHIVE

其內嵌的 HIVE 成員是他的資料管理架構 在組態管理員的實作中,儲存格的資料結構為

HCELL ,儲存箱的資料結構為 HBIN 。 空閒的儲存箱會形成一個空閒串列。

43

Page 44: 2.5 Windows 核心中的公用管理設施

KEY

組態管理員定義了一個以“ KEY” 命名的物件型別,將該命名空間與物件管理員的全域命名空間整合起來。

對於每個開啟的登錄機碼,組態管理員分配一個機碼控制區塊 (key control block) ,其資料結構為CM_KEY_CONTROL_BLOCK ,它包含了該控制區塊所引用的機碼節點所在的登錄區和儲存格索引。

組態管理員為每個登錄機碼在她的機碼控制區塊中保存了一個值的快取,用於存放它值得清單

44

Page 45: 2.5 Windows 核心中的公用管理設施

存取登錄機碼 (1)

涉及到兩個常用操作 : 使用者模式

NtOpenKey 和 NtQueryValueKey 核心的呼叫

ZwOpenKey 和 ZwQueryValueKey 上述兩組的功能是相同的 NTSTATUS

NtOpenKey(

_out PHANDLE KeyHandle,// 傳回控制代碼 _in ACCESS_MASK DesireAccess,// 存取模式 _in POBJECT_ATTRIBUTES ObjectAttributes,// 指定物件的屬性

45

Page 46: 2.5 Windows 核心中的公用管理設施

存取登錄機碼 (2)

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,// 實際傳回的長度

);

46

Page 47: 2.5 Windows 核心中的公用管理設施

其他一些服務系統 組態管理員除了 NtOpenKey 和 NtQueryValueKey 函式外還提供了 NtCreateKey, NtDeleteValueKey, NtSaveKey, NtSetValueKey…等

關於這些系統服務的定義和實作,參考 base\ntos\config\ntapi.c 的檔案裡。

組態管理員還提供了登錄機碼的變化通知機制。 可以一次監視一個或多個登錄機碼的建立、刪除或修改動作

47

Page 48: 2.5 Windows 核心中的公用管理設施

2.5.3 事件追蹤( ETW)

995202039   陳逸軒

48

Page 49: 2.5 Windows 核心中的公用管理設施

ETW

Windows 提供了統一的追蹤和紀錄事件的機制,稱為 ETW(Event Tracing for Windows)

User mode 和 kernel mode 的驅動程式都可使用它來記錄事件。

49

Page 50: 2.5 Windows 核心中的公用管理設施

ETW

ETW 為直接由 kernel支援的事件紀錄機制,可分成三個部分 控制器:它有啟動、停止和配置事件紀錄的功能

提供者:向 ETW註冊事件類別,並由控制器控制事件紀錄的啟動或停止

消費者:可針對它們想要的事件資料,選擇一個或多個紀錄事件

50

Page 51: 2.5 Windows 核心中的公用管理設施

WMI

Windows 有一個內建的提供者,稱為 kernel logger ,專門用來記錄核心和核心驅動程式的事件,它由 WMI 驅動程式實作 (Windows Management Instrumentation) 。

WMI 除了實作 kernel logger 的功能,也管理User mode ETW 事件的註冊工作。由於它的實作是驅動程式,所以其他核心常式或驅動程式可透過 I/O 介面與它溝通。

51

Page 52: 2.5 Windows 核心中的公用管理設施

WMI

雖然Windows早期提供了一些機制來報告錯誤或顯示效能資料,但這些機制缺乏統一的程式編寫介面,且都不具有良好的擴充能力。

隨著Windows 系統越趨複雜, WMI隨之誕生,它是工業標準 WBEM(Web-Based Enterprise Management) 的一個實作。 WBEM 標準包含了一套針對企業系統的資料獲取和資料管理機制的設計方法,具有很好的靈活性和擴充性。

52

Page 53: 2.5 Windows 核心中的公用管理設施

Kernel logger

它是一個預先定義的核心變數,支援多種事件類別,並採用旗標位元 (flag) 來指示是否記錄某一類型的事件。

旗標位元分成 8 個群組,每個群組使用一個遮罩 (29 位元 ) 來描述旗標位元,以下是相關定義

53

Page 54: 2.5 Windows 核心中的公用管理設施

Kernel logger

#define PERF_MASK_INDEX (0xe0000000) #define PERF_MASK_GROUP (~

PERF_MASK_INDEX)

#define PERF_NUM_MASKS 8 typedef ULONG PERFINFO_MASK;

Typedef struct _PERFINFO_GROUPMASK{ ULONG Masks[PERF_NUM_MASKS]; } PERFINFO_GROUPMASK,

*PERFINFO_GROUPMASK;

54

Page 55: 2.5 Windows 核心中的公用管理設施

Kernel logger

當控制器指示 kernel logger紀錄核心事件時,就會建構一個 PERFINFO_GROUPMASK 物件。

PERFINFO_GROUPMASK 的 Mask陣列包含8 個 ULONG 成員,每個 ULONG 的最高 3 位元是 Index ,低 29 位元即是旗標位元。

55

Page 56: 2.5 Windows 核心中的公用管理設施

Kernel logger

例如 PERF_CONTEXT_SWITCH 的定義: #define PERF_CONTEXT_SWITCH

0x20000004 這說明 Context switch 的旗標位元是第 2 個群組

的低 3 位元

每當 PERF_CONTEXT_SWITCH被設定時,每個Context switch都會記錄一個 CSWITCH事件。

56

Page 57: 2.5 Windows 核心中的公用管理設施

Kernel logger

緩衝區管理是 WMI 的重要職責之一,它為切換事件定義了一個緩衝區陣列,讓每個處理器有它自己的緩衝區。

一旦某個處理器的緩衝區滿了,則 WMI會來更新該緩衝區,下次紀錄新的 CSWITCH事件時重新申請一個新的緩衝區。

接下來我們來看 kernel logger 的控制器和消費者。

57

Page 58: 2.5 Windows 核心中的公用管理設施

xerpf

Microsoft 提供了一個效能工具 xerpf ,它是一個控制器兼消費者,利用 I/O 介面與WMI 進行溝通。

Xerpf 直接在 ETW 介面上工作,不會使用到Windows SDK 的事件追蹤 API 。

58

Page 59: 2.5 Windows 核心中的公用管理設施

Windows Server 2003

雖然我們在 Windows Server 2003 中可以看到ETW 和 WMI 的完整實作程式碼,但因為 Kernel logger只提供了有限的事件類別,且缺乏成熟的分析工具,因此在 Server 2003 及以前的 Windows系統中, ETW 及 WMI 並沒有廣泛的使用。

59

Page 60: 2.5 Windows 核心中的公用管理設施

Windows Server 2003

從 Vista 開始, kernel logger 提供了大量的核心事件資訊,包括緒程、行程、記憶體管理、同步機制、檔案 I/O、磁碟 I/O等各方面,且在許多關鍵事件上都可匯出呼叫堆疊,再配合使用xerpf ,可大幅提升分析能力,使得在新版的Windows 系統中,有希望解決許多原先非常棘手或無從解決的問題。

60

Page 61: 2.5 Windows 核心中的公用管理設施

Windows Server 2003

Xerpf雖然不能直接在 XP 和 Server 2003 上安裝,但它的可執行模組可在這些系統上執行,只不過受限於 kernel logger 的能力,它無法截獲到如 Vista 中那麼多的事件。

WMI 的介面規格和 kernel logger支援的事件類別在不同版的 Windows 中保持一致,因此 xerpf仍可在舊版Windows 上運作,不過 WMI 和kernel logger 的內部實作在新版Windows 中有相關變化及調整。

61

Page 62: 2.5 Windows 核心中的公用管理設施

2.5.4 安全性管理995202096 陳詩姍

62

Page 63: 2.5 Windows 核心中的公用管理設施

Windows 安全模型 作為一個現代作業系統, Windows 有嚴格的安

全模型。 以物件為基礎的任意存取控制( discretionary

access control) 系統級的強制存取控制(mandatory access

control)

63

Page 64: 2.5 Windows 核心中的公用管理設施

任意存取控制模型 物件的所有者授權或拒絕哪些人可以存取該物件。 考慮到了物件擁有者遺失的情形。 不能保護系統中的所有操作。

系統關機 備份檔案和目錄 互動式登入到系統中

64

Page 65: 2.5 Windows 核心中的公用管理設施

Windows 作業系統的簡化安全模型

負責執行物件的安全訪問檢查、管理使用者特權、生成安全稽核消息,並且定義了存取權杖資料結構來表示一個安全環境。

負責回應 SAS(安全注意序列),以及管理互動式登錄工作階段。當使用者登錄到系統中時, winlogon 創建一個初始行程,並進一步由建立外殼( shell)行程。

負責本地系統的安全策略,同時,它也認證用戶的身份,以及將安全稽核訊息發送到系統的事件日誌中。

包含了本機使用者和使用者群組,以及它們的密碼和其他屬性。

包含了有關目前系統的一些資訊, EX:誰被允許存取系統以及如何存取(互動式登錄、網路登入或者以服務方式登錄);分配給誰哪些特權;安全稽核如何進行等。

65

Page 66: 2.5 Windows 核心中的公用管理設施

Windows 作業系統的安全模型 在 Windows 的安全模型中

winlogon 負責系統登入,包括對用戶身份的認證。 lsass 負責管理系統本機安全性原則的管理,並且將這些策略通知到核心中的 SRM 。

在核心中, SRM 負責實現基於物件的存取控制以及系統全域安全性原則的實施。

66

Page 67: 2.5 Windows 核心中的公用管理設施

Windows 作業系統的安全模型 在 Windows 的安全模型中

lsass 和 SRM 對於系統的安全性至關重要,一旦這兩個元件被惡意代碼修改或侵入,則系統的安全防線將不復存在。

Windows 對這兩個元件有特殊的保護,普通應用程式無法與它們打交道,它們相互之間通過 LPC 進行通訊。

它們的 LPC 連接在系統初始化時建立,而且,一旦其雙向 LPC 連接建立起來,它們的 LPC 埠便不再接受任何其他的連接請求,因而其他程式與它們無法建立LPC 連接。

67

Page 68: 2.5 Windows 核心中的公用管理設施

Windows 作業系統的安全模型 Windows 的自主存取模型與物件管理員整合在一起,每

一種物件型別都定義了一個 Security 方法,該方法傳回一個物件的安全資訊。

緒程在存取一個物件以前必須先開啟這個物件,並獲得一個指向該物件的控制碼。

在開啟物件的操作中,物件管理員呼叫 SRM 的函式,根據呼叫緒程的安全憑證、在開啟操作中請求的存取類型( EX: 讀、寫、刪除等),以及該型別物件的 Security 方法提供的物件安全資訊,來決定此開啟操作是否允許。

68

Page 69: 2.5 Windows 核心中的公用管理設施

Windows 作業系統的安全模型 如果可以開啟該物件,那麼,物件管理員在緒程的行程控

制代碼表中建立一個控制碼,記錄下該物件以及它所請求的存取類型。

之後,當該緒程存取此物件時,它傳遞該物件的控制碼,而物件管理員將該緒程所請求的存取操作與該物件被開啟時所獲得的存取類型進行比較,如果目前的存取操作允許,則安全檢查通過,否則此次物件存取失敗。

69

Page 70: 2.5 Windows 核心中的公用管理設施

Windows 作業系統的安全模型 每個緒程都有一個安全環境,其中最重要的資訊是一個存

取權杖( token),代表了該緒程的使用者的一次登錄。

每個物件都有一個任意存取控制清單( ACL),指明了允許誰以何種方式存取該物件,而拒絕哪些用戶以何種方式存取它。

為了存取一個物件,緒程可以不使用它所屬行程的安全環境,而是以其他帳戶身份來運行的安全環境,這稱為模仿( impersonation)。

70

Page 71: 2.5 Windows 核心中的公用管理設施

Windows 作業系統的安全模型 同一個行程中的其他緒程也可以利用已經得到的控制碼來

存取該物件。

同樣地,物件管理員使用呼叫緒程的安全環境和它所請求的存取操作,對照該物件被打開時獲得的存取類型進行檢查,以決定是否允許該操作。

71

Page 72: 2.5 Windows 核心中的公用管理設施

首先檢查呼叫者是否有 SeSecurityPrivilege 特權,然後從物件的安全描述符中獲得DACL

對於每一種類型的物件,系統在建立它的型別物件時,可以指定該類物件的 Security 方法,即SecurityProcedure 函數成員

獲得目標物件的 SD(安全描述項),資料類型為SECURITY_DESCRIPTOR 。

安全描述項包含了物件所有者的 SID、 DACL 、 SACL ,以及其他一些描述物件安全特徵的屬性。

SRM 安全檢查

權杖

檢查

呼叫緒程的安全環境 : SECURITY_SUBJECT_CONTEXT { ClientToken PrimaryToken … }

若模仿

不模仿

呼叫ObCheckObjectAccess

ObGetObjectSecurity

SeAccessCheck

SepAccessCheck SepNormalCheck

傳回

然後呼叫型別物件的 SecurityProcedure 函式成員,由它填充一個自包含的安全描述符緩衝區。

執行安全訪問許可檢查。

SeAccessCheck 是 SRM 的一個核心介面函式,真正執行檢查任務是在 SepAccessCheck 函式中。

描述了一個用戶的一次登錄

由 winlogon 行程在認證了使用者身份以後建立

同一個使用者工作階段中執行的行程都使用同樣的權杖

如果物件沒有 DACL清單,則總是允許存取,傳回成功。

成功

如果 DACL 為空,則拒絕所有存取。否則,調用 SepNormalAccessCheck 函數執行正常的許可檢查。

被存取物件

DACL

SecurityProcedure

SepNormalAccessCheck 函數的實現較為直截了當,對 DACL 中的項逐一檢查是否允許或拒絕此次訪問操作。

拒絕物件管理員開啟一個物件時 SRM 所執行的安全檢查

是物件管理員的函數,它將物件管理員與SRM 的安全監視機制連接起來。

72

Page 73: 2.5 Windows 核心中的公用管理設施

SePrivilegeCheck 函式的特權檢查程序

檢查

逐一匹配

SePrivilegeCheck

SepPrivilegeCheck(Token,RequiredPrivileges,RequirePrivilegeCount,PrivilegeSetControl…)

傳回 TRUE 或 FALSE

請求檢查所有的特權或其中之一

已匹配個數

特權中已賦予的特權集合

請求檢查的特權集合

SRM 的強制存取控制是透過特權檢查來實施的SePrivilegeCheck 函數是 SRM 中用於特權檢查的核心介面函式

執行實際的特權檢查

目前緒程的安全環境

合起來指明了呼叫緒程要請求的一組特權定義了如何請求這些特權。即,請求所有指定的特權或其中之一。

在權杖 TOKEN 資料結構的定義中,有一個 Privileges 成員,代表該權杖帳戶的所有特權因此, SepPrivilegeCheck 函數的實作是,用一個雙重迴圈,對呼叫緒程所請求檢查的每一個特權,遊走 Token 參數中的 Privileges 陣列成員,看是否符合。

SePrivilegeCheck 函式的特權檢查程序

73

Page 74: 2.5 Windows 核心中的公用管理設施

SePrivilegeCheck 函式的特權檢查程序 在 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 (0x00000001L) #define SE_PRIVILEGE_ENABLED (0x00000002L) #define SE_PRIVILEGE_REMOVED (0X00000004L) #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)

74

Page 75: 2.5 Windows 核心中的公用管理設施

SePrivilegeCheck 函式的特權檢查程序 Windows 核心中定義了一組特權,即型別為 LUID 的

Se<Xxx> 全域變數,其定義位於 base\ntos\se\seglobal.c 檔中,它們的初始化由該檔中的SepVariableInitialization 函數來完成。

75

Page 76: 2.5 Windows 核心中的公用管理設施

SePrivilegeCheck 函式的特權檢查程序 對於每一種特權,當相關聯的操作(即需要此特權才能進

行的操作)在核心中被適當的元件觸動時,應透過SePrivilegeCheck 或它的包裝函數SeSinglePrivilegeCheck ,來檢查呼叫緒程是否具有相關的特權。 EX : SepCreateToken 函數在把權杖物件插入到行程的控制碼表之前呼叫 SeSinglePrivilegeCheck 函數來檢查當前緒程是否具有 SeCreateTokenPrivilege特權。

EX : IopParseDevice 函數在打開一個設備物件時透過IopCheckBackupRestorePrivilege 函數(它呼叫SePrivilegeCheck)來檢查呼叫緒程是否具有SeBackupPrivilege 或 SeRestorePrivilege特權。

76

Page 77: 2.5 Windows 核心中的公用管理設施

Conclusion

Windows 安全性管理是一個複雜的話題,其安全模型涉及系統的各個層面,而且模型中的許多元件和擴充架構是在使用者模式下運行的。

本節僅僅討論了 Windows 安全性管理的核心部分,即核心中的安全引用監視器,包括它的物件存取和特權操作的檢查程序。

77

Page 78: 2.5 Windows 核心中的公用管理設施

2.6.1 核心載入995202041 張勝豪

78

Page 79: 2.5 Windows 核心中的公用管理設施

2.6.1 核心載入 Windows setup

寫入 MBR 寫入安裝Windows 的磁碟分割的開機磁區

MBR(Master Boot Record) 開機程式碼

在系統啟動時首先獲得控制 磁碟分割表

指定每個磁碟分割的位置、大小、類型

79

Page 80: 2.5 Windows 核心中的公用管理設施

MBR(Master Boot Record) 開機程式碼

檢查所有磁碟分割找到一個被標示為可啟動的磁碟分割 ( 開機磁碟分割 )載入開機磁碟分割的第一個磁區 ( 開機磁區 )到記憶體中 將控制權交給開機磁區中的程式碼

開機磁區中的程式碼 提供該硬碟上磁碟區的架構和格式資訊給 Windows 從該磁碟區的根目錄讀入 Windows 的載入程式 – ntldr 將控制權交給 ntldr 的入口函式 包含能瞭解檔案系統及讀取檔案的程式碼 讀取其他磁區

80

Page 81: 2.5 Windows 核心中的公用管理設施

ntldr 真實模式程式碼

完成需在 16 位元模式下執行的初始化動作 切換到保護模式 將控制權交給OS loader

保護模式程式碼 ( 為 PE格式 ) ,稱為 OS loader 記憶體描述項 (memory descriptor) 建構分頁目錄、分頁表、分頁目錄暫存器、開啟頁面對應機制 讀取 boot.ini 執行 ntdetect.com 載入核心模組映像檔 : ntoskrnl.exe、HAL映像檔 載入 SYSTEM 登錄區

81

Page 82: 2.5 Windows 核心中的公用管理設施

typedef struct _LOADER_PARAMETER_BLOCK {LIST_ENTRY LoadOrderListHead; // 載入的模組串列LIST_ENTRY MemoryDescriptorListHead; // 記憶體描述串列LIST_ENTRY BootDriverListHead; // 啟動驅動程式串列

ULONG_PTR KernelStack; // 核心堆疊ULONG_PTR Prcb; // 行程環境,指向一個行程控制區塊ULONG_PTR Process; // 初始行程, EPROCESSULONG_PTR Thread; // 初始緒程, ETHREADULONG RegistryLength; // 系統登錄區的長度PVOID RegistryBase; // 系統登錄區的基底位址PCONFIGURATION_COMPONENT_DATA ConfigurationRoot; // 配置樹,包含 ISA、磁碟和ACPI

PCHAR ArcBootDeviceName; // 開機磁碟分割的 ARC 名稱PCHAR ArcHalDeviceName; // 系統磁碟分割的 ARC 名稱PCHAR NtBootPathname; // OS 目錄的路徑名稱,如” \Windows”PCHAR NtHalPathname; // OS載入器的路徑名稱,如” \”PCHAR LoadOptions; // 啟動選項,來自 boot.iniPNLS_DATA_BLOCK NlsData; // 包含 ANSI 內碼表、 OEM 內碼表、和…… // Unicode 內碼表……} LOADER_PARAMETER_BLOCK, *PLOADER_PARAMETER_BLOCK;

82

Page 83: 2.5 Windows 核心中的公用管理設施

BIOS

└ MBR

└ 開機磁區 └ 開機磁區後續磁區 └ ntldr( 真實模式部分 ) : 切換到保護模式 └ ntldr(保護模式部分 : os loader)

建構記憶體描述項陣列 對應頁面,設置分頁目錄暫存器,打開記憶體頁面對應機制 處理 boot.ini

執行 ntdetect.com

載入核心模組 ntoskrnl.exe、 hal.sys 和 SYSTEM 登錄區 載入啟動驅動程式和必要的檔案驅動程式 建構 LOADER_PARAMETER_BLOCK 參數區塊 將控制交給核心模組 ntoskrnl.exe 的入口函式

83

Page 84: 2.5 Windows 核心中的公用管理設施

2.6.2 核心初始化995202027 蕭少宇

84

Page 85: 2.5 Windows 核心中的公用管理設施

核心初始化 LOADER_PARAMETER_BLOCK

由 ntldr 建構 存放與系統初始化相關的參數資訊

核心的初始化從核心模組 ntoskrnl.exe 的入口函式開始 KiSystemStartup

核心的初始化分兩個階段進行 稱為階段 0 和階段 1 為了解決在初始化過程中的相互依賴性問題 可透過檢查全域變數 InitializationPhase 的值來判斷目

前處於哪個階段

85

Page 86: 2.5 Windows 核心中的公用管理設施

核心初始化 階段 0 初始化

將階段 1 初始化所需用到的基本資料結構建立起來 禁止中斷,處理器可依序執行自己的初始化邏輯 KiSystemStartup 函式首先初始化處理器的狀態

調整 IDT表 初始化 TSS(task state segmant) 建構 PCR(Processor Control Region)

然後呼叫 HalInitializeProcessor 函式 為目前處理器初始化其 HAL 中的 PCR 和處理器間中斷向量

接著呼叫 KiInitializeKernel 函式 執行核心初始化

86

Page 87: 2.5 Windows 核心中的公用管理設施

核心初始化 KiInitializeKernel 函式是實際執行核心初始化的函式

初始化核心資料結構 初始化空閒緒程和行程物件 初始化 PCR 呼叫執行體初始化函式 ExpInitializeExecutive

呼叫 HalInitSystem 初始化 HAL 呼叫 ExInitSystem 初始化執行體元件的資料結構 呼叫 MmInitSystem 初始化記憶體管理員和記憶體集區 呼叫 ObInitSystem 初始化物件管理員 呼叫 SeInitSystem 初始化安全子系統 呼叫 PsInitSystem 初始化行程、緒程管理員 呼叫 PpInitSystem 初始化隨插即用管理員 呼叫 DbgkInitSystem 初始化偵錯子系統

87

Page 88: 2.5 Windows 核心中的公用管理設施

核心初始化

行程管理員 在階段 0 除了初始化其內部的狀態變數 也為初始行程建立一個行程物件“ Idle” 還建立了“ System” 行程 以及建立一個系統緒程

開始常式為 Phase1Initialization 函式 不立即被執行,因為在階段 0 過程中禁止中斷

KiInitializeKernel 函式傳回後, KiSystemStartup 啟動中斷,將目前的中斷要求層級降低到DISPATCH_LEVEL ,從而允許緒程排程器選擇新的緒程 所以在階段 0 初始化完成後,階段 1 初始化常式

Phase1Initialization得以執行

88

Page 89: 2.5 Windows 核心中的公用管理設施

核心初始化 階段 1 初始化是在 System 行程的一個系統緒程中執

行 Phase1Initialization 函式呼叫

Phase1InitializationDiscard 執行階段 1 初始化 若是在多處理器或多核系統上的初始化過程,在

Phase1InitializationDiscard 的一個特定點上會呼叫KeStartAllProcessors 函式,以啟動其他的處理器 KeStartAllProcessors依次呼叫 KiInitProcessor 函式來

啟動每個處理器 在 KiInitProcessor 中呼叫 KiInitProcessorState 建構每個處

理器的狀態資訊然後呼叫 HalStartNextProcessor 函式啟動該處理器

89

Page 90: 2.5 Windows 核心中的公用管理設施

核心初始化 非啟動處理器的初始化過程雖然也執行

KiSystemStartup ,但是其執行邏輯相對要簡單很多 同樣地, KiSystemStartup也呼叫

HalInitializeProcessor 和 KiInitializeKernel 來執行 HAL和核心部分的初始化

KiInitializeKernel 函式也呼叫 ExpInitializeExecutive 但是 ExpInitializeExecutive僅呼叫 HalInitSystem 因為有些初始化過程,特別是核心執行體原件的初始化常式,

它們的處理邏輯針對整個系統,而非屬於某個處理器,所以只需在啟動處理器上執行一次即可

而另外有些初始化過程,則是針對單個處理器的初始化,因而需要針對每個處理器都執行一次

90

Page 91: 2.5 Windows 核心中的公用管理設施

核心初始化 階段 1 初始化的主函式為

Phase1InitializationDiscard 呼叫 IoInitSystem 初始化 I/O 子系統

I/O 子系統中的狀態變數初始化 驅動程式物件型別和裝置物件型別的建立等等… 所花時間較長

呼叫 SeRmInitPhase1 執行安全引用監視器 (SRM)初始化 建立安全引用監視器的命令服務緒程

建立工作階段管理員子系統行程 (smss.exe) 呼叫 RtlCreateUserProcess 函式以建立 smss 行程

91

Page 92: 2.5 Windows 核心中的公用管理設施

2.6.3 建立使用者登入工

作階段995202054 羅祐民

92

Page 93: 2.5 Windows 核心中的公用管理設施

工作階段管理員子系統 (smss)

於階段 1 初始化完成的最後階段啟動 為可信任的 建立在 Windows 核心的基礎上 只使用核心提供之系統服務 使用者模式行程

建立系統安全權杖

93

Page 94: 2.5 Windows 核心中的公用管理設施

工作階段管理員子系統 (smss)

啟動 Windows 子系統 載入登錄區 , 建立登錄樹

94

Page 95: 2.5 Windows 核心中的公用管理設施

工作階段管理員子系統 (smss)

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager

指示 smss 在系統初始化必須執行之工作

95

Page 96: 2.5 Windows 核心中的公用管理設施

Smss 主緒程 執行在啟動時執行的程式,這些程式由

BootExecute 值指定。 執行啟動時的檔案刪除或重命名任務,這由

FileRenameOperations 子機碼來指定。 開啟已知的 DLL ,並且在物件管理員命名空間的

\KnownDlls 目錄下創建相應的記憶體區段物件。

這些已知 DLL 的列表位於 KnownDLLs 子鍵中。

96

Page 97: 2.5 Windows 核心中的公用管理設施

Smss 主緒程 建立分頁檔,分頁檔清單由

MemoryManagement 子機碼的 PagingFiles 值指定。

建立系統的全域環境變數,這些環境變數由Environment 機碼下的值指定。

載入 Windows 子系統的內核模式模組( win32k.sys ) 。

經由系統服務 NtSetSystemInformation 來完成的,該函數也會呼叫 win32k.sys 中的初始化常式(即入口函數)。

子系統內核模組的檔案路徑由 SubSytstems 子機碼的Kmode 值指定。

97

Page 98: 2.5 Windows 核心中的公用管理設施

Smss 主緒程 啟動 Windows 子系統進程( csrss.exe)。

子系統進程的命令行字符串由 SubSystems 子機碼的 Windows 值指定。

提供多工作階段和本機登入服務 建立 LPC埠物件( \SmApiPort),以接收“載

入子系統”或“建立工作階段”的請求。 啟動登入行程(winlogon.exe),登入行程將會承擔起與用戶登入有關的事項。

98

Page 99: 2.5 Windows 核心中的公用管理設施

Smss 主緒程 Winlogon 行程

建立初始的窗口站(WinSta0),並且為該窗口站創建一個桌面緒程和 RIT( Raw Input Thread)緒程以便接收標準輸 入。

建立登入桌面和預設桌面。 登錄桌面只有 winlogon 進程才可以存取;而預設桌

面允許其他進程訪問。 當登入桌面活動時,其他行程法存取與該桌面關聯的程式碼或資料。

 Windows 用這種方式來保護與密碼相關的操作,以及鎖定桌面或解除桌面鎖定這樣的安全操作。

99

Page 100: 2.5 Windows 核心中的公用管理設施

Smss 主緒程 Winlogon 行程

啟動服務控制管理器( SCM , Service Control Manager)行程( services.exe)。  SCM 行程載入所有“自動 - 啟動”類型的服務和裝置

驅動程式。 啟動本地安全授權子系統( lsass ) 行程。 然後與它建立一個 LPC 連接( LsaAuthenticationPort 埠),以便在登入、登出和密碼操作過程中交換信息。

100

Page 101: 2.5 Windows 核心中的公用管理設施

Smss 行程

建立” \SmApiPort” LPC 連接埠物件,以接收“建立工作階段”請求載入 Windows 子系統核心模組 win32k.sys啟動 csrss 行程啟動 winlogon 行程

建立視窗工作站建立登錄桌面和預設桌面啟動 SCM 行程

載入”自動 - 啟動”的服務和裝置驅動程式啟動 lsass 行程

使用者按下Ctrl+Alt+Del登錄到系統中

lsass 行程請求認證

認證成功啟動 userinit 行程

啟動 Shell 行程(Explorer.exe)

結束使用者操作機器

Winlogon 透過 GINA獲得使用者名稱密碼,呼叫 lsass 函式

LsaLookupAuthenticationPackage獲得驗證封裝的控制代碼

呼叫 LsaLogonUser 將登入資訊傳送給驗證封裝

認證成功則winlogon繼續該使用者的登入過程 ;否

則失敗登入最後, winlogon 檢查登錄

檔的 Userinit 值。

Userinit載入目前登入使用者的設定檔,檢查登錄檔的 Shell值,並建立行程來執行該值 ;若該值不存在,則執行預設值為Explorer.exe 的登錄檔。

Userinit 行程結束。且 Shell已啟動,使用者可在桌面上操作。

101

Page 102: 2.5 Windows 核心中的公用管理設施

Windows 服務組態 Windows 服務是 Windows 系統中一種重要

的管理機制。 Windows 服務控制管理行程,即 SCM 的職責之一是,在啟動過程的後期,將標記為“自動 -啟動”的服務應用程式或裝置驅動程式啟動或載入到系統中。

 SCM 根據登錄機碼 HKLM\SYSTEM\CurrentControlSet\Services 下的子機碼來確定如何處理每一個已被安裝到系統中的服務。

102

Page 103: 2.5 Windows 核心中的公用管理設施

Windows 服務組態 EventSystem 登錄機碼

103

Page 104: 2.5 Windows 核心中的公用管理設施

Windows 服務組態 Type: 代表服務類型

1、 2、 8 代表裝置驅動程式、檔案系統驅動程式、檔案系統辨識驅動程式

Start: 代表服務或裝置啟動類型 0表示”開機 - 啟動”驅動程式、 1表示”系統 -

啟動”驅動程式 ImagePath: 指定該服務或驅動裝置的可執行

檔路徑 ObjectName: 指定此服務將在哪個帳號下執

行 (只用於windows 服務 )

104

Page 105: 2.5 Windows 核心中的公用管理設施

Group: 指示該服務或驅動程式屬於一個群組 DependOnGruop、 DependOnService: 指

定服務或驅動程式依賴於其他那些服務或群組

105


Recommended