ch2.5~ch2.7 ( p53~p96 ) team 4 指導 教授 : 許富皓

146
Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指指指指 : 指指指 100522039 指指指 100522060 指指指 100522073 指指指 100522078 指指指 100522068 指指指 100552023 指指指 985402018 指指指 100522004 指指指 100522109 100522102 指指指 995202109 指指指 1 Window 指指指指指指指指指

Upload: chelsea-mayer

Post on 02-Jan-2016

118 views

Category:

Documents


5 download

DESCRIPTION

Window 核心原理與實務開發. Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授 : 許富皓. 100522039      曾毓傑 100522060      何儒軒 100522073      歐巡丞 100522078      李佳恆 100522068      陳安琪 100552023      廖緯玲   985402018      左昌國 985402017   許齊顯 100522004 陳威宇 100522109 連 捷 100522102 吳浩維 995202109 關呂叡. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

1

Ch2.5~Ch2.7 ( p53~p96 )TEAM 4

指導教授 : 許富皓100522039      曾毓傑100522060      何儒軒100522073      歐巡丞100522078      李佳恆100522068      陳安琪100552023      廖緯玲

  985402018      左昌國 985402017   許齊顯 100522004      陳威宇 100522109      連 捷 100522102      吳浩維 995202109      關呂叡

Window 核心原理與實務開發

Page 2: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

2

Outline

• 2.5 Windows 核心中的公用管理設施– 2.5.1 Windows 核心中的物件管理– 2.5.2 登錄和組態管理員– 2.5.3 事件追蹤 ( ETW )– 2.5.4 安全性管理

• 2.6 Windows 啟動過程 – 2.6.1 核心載入– 2.6.2 核心初始化– 2.6.3 建立使用者登入工作階段

• 2.7 本章總結

Page 3: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

3

2.5.1 Windows 核心中的物件管理

( 報告者 : 歐巡丞 ) ( 報告者 : 李佳恆 )

Page 4: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

4

物件管理員

子系統 DLL NTDLL.DLL

Windows子系統

視窗管理圖形介面

圖形驅動程式

執行體 API

記憶體管理員

行程和緒程管理員

隨插即用管理員

安全參照監視器

快取管理員

本地程序呼叫(LPC)

組態管理員( 登錄 )

I/O管理員

檔案系統

物件管理員

網路

裝置驅動程式核心 ( 或微核心 )

硬體抽象層 (HAL)

子系統服務 系統服務

使用者模式核心模式

Page 5: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

5

What’s Object? (wiki)

• Each resource, which are surfaced as logical objects

• Resources can be physical devices, files or folders on volumes, Registry entries or even processes and Threads

Page 6: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

6

物件管理員

• Object Manager is a subsystem implemented as part of the Windows Executive which manages Windows resources. (Wiki)

• 在 Windows 核心中,屬於執行體中的元件。• 物件可分成物件標頭和物件主體。

Page 7: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

7

物件標頭

引用計數

物件型別各個資訊的記憶體

偏移

物件的控制代碼數

安全描述項

根據物件型別提供資訊與否

物件主體開始

Page 8: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

8

物件型別 (Object Type)

• WRK 支援 31 種物件,索引 (Index) 不可紀錄超過 48 種物件。

Page 9: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

物件型別 (Object Type)

typedef struct _OBJECT_TYPE { … UNICODE_STRING Name; … ULOGN Index; ULONG TotalNumberOfObjects; ULONG TotalNumberOfHandles; …

OBJECT_TYPE_INITIALIZER TypeInfo; …

} OBJECT_TYPE, *POBJECT_TYPE;

Type Name, 例如 process

記錄在 Type 陣列中的索引

系統變數 :ObpObjectTypes 陣列 : 此陣列紀錄所有已建立的 TYPE

Page 10: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

物件結構

10

Body

物件主體

物件標頭

物件型態物件 1 物件 2

物件 3

型態名稱Access Types

名稱路徑…

Page 11: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

11

建立一個物件

物件型別初始化

建立物件標頭,分配記憶體給物件主體

完成物件主體初始化

Page 12: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

12

ObCreateObjectType

NTSTATUS

ObCreateObjectType(

__in PUNICODE_STRING TypeName,

__in POBJECT_TYPE_INITIALIZER ObjectTypeInitializer,

__in_opt PSECURITY_DESCRIPTOR SecurityDescriptor,

__out POBJECT_TYPE *ObjectType

);

物件型別初始化

建立物件標頭,分配記憶體給物件主體

完成物件主體初始化

Page 13: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

13

_OBJECT_TYPE_INITIALIZER

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;

物件型別初始化

建立物件標頭,分配記憶體給物件主體

完成物件主體初始化

Page 14: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

14

ObCreateObject

NTSTATUS

ObCreateObject(

__in KPROCESSOR_MODE ProbeMode,

__in POBJECT_TYPE ObjectType,

__in POBJECT_ATTRIBUTE ObjectAttributes,

__in ULONG ObjectBodySize,

__out PVOID *Object

);

物件型別初始化

建立物件標頭,分配記憶體給物件主體

完成物件主體初始化

Page 15: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

15

Example: 建立 Process

1. 先初始化 ObjectType 一些欄位

2. 建立 Process 的 ObjectType

物件型別初始化

建立物件標頭,分配記憶體給物件主體

完成物件主體初始化

Page 16: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

16

Example: 建立 Process

3. 建立 Process 的物件

4. 利用 PspCreateProcess 函式建立 Process.

物件型別初始化

建立物件標頭,分配記憶體給物件主體

完成物件主體初始化

Page 17: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

17

物件管理員設計目的

• 提供一種統一而又可擴充的定義和控制機制• 提供一致性的安全存取機制• 無須修改已有系統程式碼,而又可加入新的物

件型別• 有一組標準的 API 來對物件執行各種操作• 提供一種命名機制,與檔案系統的命名機制整

合再一起。

Page 18: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

物件層次目錄 ( 系統全域命名空間 )

• Windows 也提供以’名稱’的方式管理物件

---------------------------------------------------------------• WHY ?

方便找到某個物件 , 分類

Page 19: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

目錄建立過程

ObpRootDirectoryObject

建立子目錄

定義根目錄

NtCreateDirectoryObject()

Winobj 程式

Page 20: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

標準 Object Directories(from book Windows internal 5th)

\arcname\ BaseNamedObjects\callback\device\driver\FileSystem\GLOBAL??\

KnownDlls\ ObjectTypes\ RPC Control\ Windows\ Sessions\ UMDFCommunicationPort \

\Symbolic links mapping ARC-style paths to NT-Style paths.Mutexes,events,semaphores,waitable timers and section objects

for Session 0.Callback Object.Device objects.

Driver objects.File system driver object and file system recognizer divice

objects.

MS-Dos device names.Section names and path for Known DLLs.

Ames of tyes of objects.Port objects use by remote procedure calls.Windows subsystem ports and windows sations.

Per-session namespace directoryALPC ports used by the User-Mode Driver Framwork

Page 21: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

物件管理員如何管理目錄

( 物件管理員所提供的基本操作 )• ObpLookupDirectoryEntry 函式 :

在一個指定的目錄中收尋一個名稱• ObpInsertDirectoryEntry

把一個物件插到一個目錄中• ObpDeleteDirectoryEntry

刪除某個目錄中的物件• ObpLookupObjectName

可以從指定的目錄或根目錄 , 以名稱遞迴的尋找(obOpenObjectByName,ObReferenceObjectByName 也利用此 function)

Page 22: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

name

W indows 相容從 DOS 時代保留的下來的的習慣 ,以磁碟機代號來存取磁碟機或檔案系統的習慣

判別方法 :

當物件管理員在解析名稱時,看到 “ \??\” 開頭或是 “ \??” 它就會利用 process 的 devicemap 來取得相關的目錄,再進一步解析。 例 : ”\??\C:\”

• DeviceMap: 定義一個 Dos 裝置命名空間

詳細第七章

Page 23: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

7 . 3 . 2

根(\)

DosDevices

DosDeviceDirectory

C:

D:

HarddiskVolume1

HarddiskVolume2

例子

\??\C:

DeviceMap

Device

\DosDevices\C:

詳細第七章

Page 24: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

Handle

• 物件管理員中得物件是執行體物件,所以這些物件位於 KERNEL SPACE

• 但是 PROCESS 中執行的 user mode code 不能直接用指標來引用這些物件

• 所以只能透過 Handle (控制代碼)來引用物件

詳細第三章 

Page 25: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

Object 生命週期管理

• 透過引用計數來管理生命週期 引用計數等於零  -> 物件生命週期結束 ( 所占用的記憶體可以回收 )

引用計數某物件被 系統中指標引用 (Reference)

      process 使用 Handle( 控制代碼 ) 引用

Page 26: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

WinoBJ

介紹• WinObj 是 32 位元的 Windows 程式,使用

原生 Windows NT API ( 由 NTDLL.DLL 所提供 ) 來存取和顯示 NT 物件管理員的命名空間資訊。

http://technet.microsoft.com/en-us/sysinternals/bb896657

WinoBJ

Page 27: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

WinoBJ

Page 28: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

WinoBJ

Page 29: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

WinoBJ

Page 30: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

30

2.5.2 登錄和組態管理員

登錄和組態管理員架構 ( 報告者 : 陳安琪 )

組態管理員和登錄的初始化

Page 31: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

31

組態管理員與登錄

• Windows 系統利用登錄檔 ( registry ) 作為系統的組態和管理中心– 提供 API 供應用程式存取登錄

• 例如,我們安裝了 Office Word ,則安裝元件在過程中便會透過API 來向 Registry 註冊檔案關聯。

• 安裝完畢後, *.docx 檔案皆會與相應的程式 ( 即 Office Word ) 關聯

– 由執行體中的組態管理員 (configuration manager) 負責實作

子系統 DLL NTDLL.DLL

Windows子系統

視窗管理圖形介面

圖形驅動程式

執行體 API

記憶體管理員

行程和緒程管理員

隨插即用管理員

安全參照監視器

快取管理員

本地程序呼叫(LPC)

組態管理員( 登錄 )

I/O管理員

檔案系統

物件管理員

網路

裝置驅動程式核心 ( 或微核心 )

硬體抽象層 (HAL)

子系統服務 系統服務

使用者模式核心模式

Page 32: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

32

登錄簡介

Root Key

Sub Key

value

• Value 類型可大致分成– REG_DWORD ( 32 位元整數 )– REG_BINARY ( 二進位資料 )– REG_SZ ( 字串 )– REG_LINK

Page 33: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

33

登錄區 ( hive )

• 登錄檔是由一組稱為登錄區 ( hive ) 的檔案所構成–每個登錄區皆為樹狀結構–包含了機碼 ( key )、值 ( value )• Value 包含了名稱、類型、資料

– 資料可為實際的資料或是索引值指向其他 value

– 實作資料結構為 CMHIVE• 定義在 base\ntos\config\cmp.h

Page 34: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

34

Root Key

HKEY_CLASSES_ROOT [HKCR] 有關檔案關聯和 COM 的設置資訊

HKEY_LOCAL_MACHINE [HKLM] 存放整個系統全域的組態資訊

HKEY_CURRENT_USER [HKCU] 有關目前使用者的資訊,這是一個符號連結,指向 HKU 中對應於目前使用者的子機碼

HKEY_USERS [HKU]

存放系統上所有使用者帳戶的資訊,並包含 一個 .DEFAULT 的預設檔

HKEY_CURRENT_CONFIG [HKCC] 有關目前硬體的設置資訊,指向 HKLM\

SYSTEM\CurrentControlSet\底下的 subkey

Page 35: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

35

Root Key ( cont. )

• HKLM 和 HKU 為真正存放系統設置資訊的子樹,不隨登入帳戶而發生變化– HKCU、 HKCR、 HKCC都是利用 HKLM 和

HKU重新建構出針對目前使用者、硬體環境的檢視

Page 36: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

36

HKEY_LOCAL_MACHINE

• HKLM 存放系統的全域資訊,包含五個 subkey– HARDWARE

• 硬體設置– SAM (Security Account Manager)

• ,安全性帳戶管理員– SECURITY

• 安全性原則及使用者權限– SOFTWARE

• 軟體設置– SYSTEM

• 系統中的全域組態資訊,在系統初始化時會最先被載入, 包括裝置驅動程式和系統服務等

Page 37: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

37

HKLM\SYSTEM

• 組態管理員透過 HKLM\SYSTEM底下的 hivelist建立起完整的登錄– HKLM\SYSTEM\CurrentControlSet\control\hivelist

Page 38: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

38

Invisible Root Key

HKEY_PERFORMANCE_DATA [HKPD]

與效能有關的資料,這是系統的執行狀態資訊

HKEY_PERFORMANCE_TEXT 以美國英語的文字來描述效能計數器HKEY_PERFORMANCE_NLSTEXT 以系統本機語言的文字來描述效能計數器

• HKEY_PERFORMANCE_xxx並不存在登錄檔中, Windows 系統為上層應用程式提供 API

來獲得效能資訊

Page 39: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

39

登錄區

登錄區的登錄機碼 登錄區的檔案路徑HKLM\HARDWARE 揮發登錄區,僅存在記憶體中HKLM\SAM \Windows\System32\Config\samHKLM\SECURITY \Windows\System32\Config\securityHKLM\SOFTWARE \Windows\System32\Config\softwareHKLM\SYSTEM \Windows\System32\Config\systemHKU\.DEFAULT \Windows\System32\Config\default

HKU\< 使用者的 SID> \Document and Settings\< 使用者名稱 >ntuser.dat

HKU\< 使用者的SID>_Classes

\Document and Settings\< 使用者名稱 >\Local Settings\Application Data\Microsoft\Windows\usrclass.dat

Page 40: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

40

登錄區架構 -Block

• Block 為登錄區的基本分配單元–每個 block 大小為 4K– 登錄區的第一個 Block 稱為 Base Block• 儲存所有登錄區的訊息 ( Signature、

TimeStamp 、 RootCell…)• 資料結構為 HBASE_BLOCK

Page 41: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

41

登錄區架構 -Cell 、 Bin

• Cell ( 儲存格 ) 為儲存登錄檔的基本單位– 資料結構為 HCELL–其中 HCELL_INDEX 為該 Cell 在檔案中的偏移量 • 資料型別為 ULONG• 可用來引用其他 Cell ,建立起 Cells之間的關聯

• 儲存箱 ( Bin ) 為擴充既有的登錄區所需申請的儲存單元– 資料結構為 HBIN

Defined in base\ntos\inc\hivedata.h

Page 42: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

42

透過 Cell Index 建立關係

父機碼儲存格

祖父機碼儲存格

安全描述項儲存格

類別名稱串儲存格

值列表儲存格

子機碼列表儲存格

值 1儲存格

值 2儲存格

值 n儲存格

子機碼1儲存格子機碼 2儲存格

……..值 n儲存格

指向父機碼儲存格

箭頭代表透過儲存格索引建立起來的引用關係

Page 43: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

43

Hive Structure [ref ]

• 每個儲存箱可容納一個以上的 Block–第一個 Block 稱為 Base Block–每個儲存箱簽名 ( hbin ) 後即為 Cells區塊

Page 44: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

登錄和組態管理員• 每個登錄區在 kernel address space 中可能會有兩個 Cell 目錄

– 穩定 (stable) 的配置資料 : On-Disk– 揮發 (volatile) 的配置資料 : In Memory

• 每個儲存格目錄,有 1024 項,每一項指向一個儲存格表• 每個儲存格表包含 512 個表項,每一項指向一個區塊 (block)

Stable Directory

0

….

….

1023

Volatile Directory

0

….

….

1023

Table

Entry 0

….

….

Entry 511

區塊(block)

…….

區塊(block)

44

HiveMain Storage

Page 45: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

45

HCELL_INDEX Structure

31 30 21 20 12 11 0

Type Cell Directory Index Cell Table Index Byte Offset in Block

HMAP_ENTRY

Page 46: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

46

組態管理員起始化以前

• 組態管理員的實作仰賴於記憶體管理員、快取管理員、檔案系統…

• 在執行體元件 ( 組態管理員、記憶體管理員、快取管理員… )尚未完全初始化前, Windows已經需要使用登錄中的組態資訊了– 核心載入器 ( ntldr ) 會將整個 HKLM\SYSTEM

登錄區視為 Read-Only 檔案載入記憶體• \Windows\System32\Config\System• 組態管理員透過 Cell Index+HKLM\SYSTEM 基底位址即可取得 Cell 的位址

Page 47: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

47

2.5.2 登錄和組態管理員

登錄和組態管理員架構組態管理員和登錄的初始化

( 報告者 : 何儒軒 )

Page 48: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

48

組態管理員和登錄的初始化

• 分三個步驟初始化– 第一部分:在核心初始化過程中建立 HKLM\

System及 HKLM\Hardware– 第二部分:由工作階段管理員 (smss.exe) 載入

HKLM\Sam、 HKLM\Security、 HKLM\Software、 HKLM\.Default 登錄區

– 第三部分:由登入行程 (winlogon.exe) 載入剩下的一些登錄值

Page 49: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

49

登錄初始化第一部分

• 開機過程中呼叫到 CmInitSystem1()去初始化

• 初始化組態管理員的全域變數,但還沒有產生出組態管理員

• 建立出通用的 CmpKeyObjectType

base/ntos/init/initos.c, line 1437Phase1InitializationDiscard() { ... CmInitSystem1(); ...}

base/ntos/config/cmsysini.c, line 466CmInitSystem1() { ... status = CmpCreateObjectType(); ...}

Page 50: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

50

登錄初始化第一部分 (Cont.)

• 建立主登錄區 (\)

• 建立節點 \Registry

• 使用 CmpLinkHiveToMaster()將建立的Machine及 User節點連結到 \Registry\Machine及 \Registry\User 位置

• 將 ntldr 已經載入至記憶體的 system hive去初始化 \Registry\Machine\System

base/ntos/config/cmsysini.c, line 476status = CmpInitializeHive(...);

base/ntos/config/cmsysini.c, line 506status = CmpCreateRegistryRoot(...);

base/ntos/config/cmsysini.c, line 574CmpInitializeSystemHive(...);

Page 51: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

51

登錄初始化第一部分 (Cont.)

• 建立節點 \Registry\Machine\System\CurrentControlSet

• 建立揮發性 (volatile)節點 \Registry\Machine\Hardware

• 將系統的開機資訊寫進 Registry之中,包含 \Registry\Machine\Hardware 資訊、系統啟動資訊、網路資訊

base/ntos/config/cmsysini.c, line 584status = CmpCreateControlSet(...);

base/ntos/config/cmsysini.c, line 594status = CmpInitializeHive(...);

Page 52: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

52

登錄初始化第一部分 (Cont.)

\\Registry

\Registry\User\Registry\Machine

\Registry\Machine\System\Registry\Machine\System\CurrentControlSet

\Registry\Machine\Hardware

Page 53: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

53

登錄初始化第二部分

• 由 smss.exe呼叫 NtInitializeRegistry()–呼叫 CmpInitializeHiveList• 讀取 HKEY_LOCAL_MACHINE\SYSTEM\

CurrentControlSet\Control\hivelist• 為裡面的機碼分別建立系統 Thread:

CmpLoadHiveThread– 將個別的 hive file去載入到對應的登錄區位置

base/ntos/config/ntapi.c, line 1199NtInitializeRegistry(...) { CmpcmdInit(...);} base/ntos/config/cmworkers.c, line 277CmpcmdInit(...) { CmpInitializeHiveList();}

Page 54: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

54

登錄初始化第二部分 (Cont.)

\\Registry

\Registry\User\Registry\Machine

\Registry\Machine\System\Registry\Machine\System\CurrentControlSet

\Registry\Machine\Hardware\Registry\Machine\Sam\Registry\Machine\Security\Registry\Machine\Software\Registry\Machine\.Default

Page 55: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

55

登錄初始化第三部分

• 當某位使用者登入時,由 winlogon.exe呼叫系統服務 NtLoadKey去載入 \Registry\<User SID>下的登錄值

• NtLoadKey 也使用 CmpInitializeHiveList 來處理要載入的 hive file

Page 56: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

56

登錄檔中的 Key

• Key 的資料結構為 CM_KEY_BODY• 組態管理員為每個開啟的 Key 物件加入一個 Key

Control Block( 由 NtOpenKey()去觸發 )– 資料結構為 CM_KEY_CONTROL_BLOCK– 使用物件管理員的 CmpKeyObjectType

• 這些 Key Control Block 會經由 Hash 存放進CmpCacheTable

• 未來存取 Key時,就從 CmpCacheTable 找出Key Control Block 來操作該組 Key– ObjectType 定義了一些 function去操作 Key– E.g. CmdParseKey

Page 57: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

57

給應用程式使用的 Registry API

• NtOpenKey

–拿到某個機碼的 handle– ObOpenObjectByName– ObLookupObjectName– CmpParseKey– CmpBuildHashStackAndLookupCache

base/ntos/config/ntapi.c, line 2028 NtOpenKey( __out PHANDLE KeyHandle, __in ACCESS_MASK DesiredAccess, __in POBJECT_ATTRIBUTES ObjectAttributes)

Page 58: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

58

給應用程式使用的 Registry API(Cont.)

• NtQueryValueKey

– 由 NtOpenKey拿到 keyHandle之後,就可以拿到該 Key 中某個 value 的 data

– CmQueryValueKey– CmpFindValueByNameFromCache

base/ntos/config/ntapi.c, line 2028 NtQueryValueKey( __in HANDLE KeyHandle, __in PUNICODE_STRING ValueName, __in KEY_VALUE_INFORMATION_CLASS yValueInformationClass, __out_bcount_opt(Length) PVOID KeyValueInformation, __in ULONG Length, __out PULONG ResultLength )

Page 59: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

59

給應用程式使用的 Registry API(Cont.)

• 更多存取 Registry 的 API– NtCreateKey、 NtDeleteKey、 NtDeleteValueKe

y、NtSetValueKey、 NtFlushKey…

• Registry更新時的監聽 API– NtNotifyChangeKey、 NtNotifyChangeMultiple

Key

Page 60: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

60

2.5.3 事件追蹤 ( ETW )

ETW (報告者 : 連捷 )

Page 61: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

61

Event Tracing for Windows ( ETW)

• Windows 提供統一追蹤和紀錄事件的機制,稱為 ETW ( Event Tracing for Windows ) 。使用者模式應用程式和核心模式應用程式都可以使用 ETW 來紀錄事件。

• ETW 是直接由核心支援的事件紀錄機制,有三種元件 :– 控制器 (controller)– 提供者 (provider)– 消費者 (consumer)

Page 62: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

62

ETW ( cont.)

• 事件追蹤對於診斷系統效能問題非常重要, Windows內建了一個核心日誌紀錄器 (kernel logger) ,做為 ETW 提供者,專門紀錄核心和核心驅動程式的事件。

• 此核心日誌記錄器是由 WMI 裝 (Windows Management Instrumentation)置驅動程式實作的,也是核心模組 ntoskrnl.exe 的一部分。

Page 63: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

63

WMI 簡介

• WMI驅動程式的名稱為 “WMIxWDM” ,它是在管理員初始化過程中呼叫WMI 元件的初始化函式(WMIInitialize) 而建立的。

• 由於實作的形式是驅動程式,因此其他的核心常式或裝置驅動程式可以透過 I/O 介面與他通訊。

• WMI 是工業標準 WBEM ( Web-Based Enterprise Management ) 的一個實作。

Page 64: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

64

WMI 簡介 ( cont. )

• 從 Windows NT 4 (SP4) 開始的 Windows版本均支援WMI 。

• ETW 的核心日誌記錄器實際上也是 WMI 機制的一部分。

Page 65: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

65

核心日誌紀錄器• 核心日誌紀錄器是一個事件提供者,他有一個預先定義的

GUID ,即核心變數 SystemTraceControlGuid 。

• 核心日誌紀錄器支援多種事件類別,它採用旗標位元 (flag) 來只是否記錄某一事件的類型。下面是相關定義。

#define PERF_MASK_INDEX (0xe0000000)

#define PERF_MASK_GROUP (~PERF_MASK_INDEX)

#define PERF_NUM_MASKS 8

typedef ULONG PERFINFO_MASK;

Page 66: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

66

PERFINFO_GROUPMASK 物件

• 當控制器程式指示核心日誌記錄器記錄某些類型的核心事件時,它們需要建構一個 PERFINFO_GROUPMASK 物件,將需要紀錄的旗標位置上

typedef struct_PERFINFO_GROUPMASK{

ULONG Masks[PERF_NUM_MASKS];

}PERFINFO_GROUPMASK , *PPERFINFO_GROUPMASK;

• 核心日誌記錄器的旗標位元安排是由 Windows 系統定義的,並且允許擴充。

Page 67: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

67

PERFT_CONTEXT_SWITCH 定義

• Windows Server 2003僅僅使用了一部分旗標位元,例如PERF_CONTEXT_SWITCH 的定義如下 :

• #define PERF_CONTEXT_SWITCH 0x20000004

// Context Switch

• 這說明處理器緒程環境切換的事件旗標位元是第 2 個群組的低 3 位元。

Page 68: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

68

PERFT_CONTEXT_SWITCH

• 在 Windows 中,系統的通用群組遮罩是由全域變數PerfGlobalGroupMask 定義的,以環境切換事件為例,當PERF_CONTEXT_SWITCH旗標位元被設定時,緒程切換時就會記錄一個 CSWITCH 事件。

Page 69: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

69

緩衝區管理

• 緩衝區管理是 WMI驅動程式的重要職責之一,它為環境切換事件定義了一個緩衝區陣列,讓每個處理器使用它自己的緩衝區,而避免緩衝區衝突。

• 一旦屬於某個處理器的目前緩衝區滿了,則交給 WMI更新該緩衝區,下次紀錄新的 CSWITCH 事件時重新申請一個新的緩衝區做為目前緩衝區。

• WMI 為每個紀錄工作階段管理緩衝區,它在建立記錄工作階段時根據控制器的指示,建立合理數量的緩衝區。

Page 70: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

70

xperf

• Microsoft 提供了一個效能工具 xperf ,它既是一個控制器,也是一個消費者。 xperf 利用 I/O 介面與 WMI驅動程式通訊。

• Windows SDK 提供了事件追蹤 API( 位於 advapi32.dll模組中 ) ,因而使用者模式應用程式可以很方便地操縱和控制 WMI驅動程式。 xperf 直接在 ntdll.dll 的 ETW 介面上工作,並沒有使用 advapi32.dll 中的事件追蹤 API 。

Page 71: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

71

• 儘管在 Windows Server 2003 中就有 ETW 和 WMI 的完整實作程式碼,但是限於核心日誌記錄器僅僅提供了有限的事件類別,並卻乏成熟的分析工具,因此,在 Windows Server 2003 及以前的版本 Windows 系統中 ETW 和 WMI並沒有廣泛的使用。

• 從 Windows Vista 開始,核心日誌記錄器提供了大量核心事件資訊,並且在許多關鍵上可以會出相關的呼叫堆疊,且 xperf 工具可以自由下載,其分析功能更架豐富。

xperf ( cont. )

Page 72: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

72

• Microsoft 提供的 xperf 工具不能直接在 Windows XP/server 2003上安裝,但實際上它的可持型模組可以在這些系統上執行,只不過受限於核心日誌記錄器的能力,它並不能截獲到像在 Windows Vista 以後系統中那麼多的事件。

• WMI驅動程式的介面規格以及核心日誌記錄器支援的事件類別再不同的 Windows 系統中保持一致,這是 xperf仍然可以在 Windows XP/Server 2003 上持型的基礎。

xperf ( cont. )

Page 73: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

73

2.5.4 安全性管理

(報告者 :闕呂叡 )

Page 74: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

74

Windows 安全模型

• 作為一個現代作業系統, Windows 有嚴格的安全模型。– 以物件為基礎的任意存取控制( discretionary access

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

Page 75: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

75

任意存取控制模型

• 物件的所有者授權或拒絕哪些人可以存取該物件。• 考慮到了物件擁有者遺失的情形。• 不能保護系統中的所有操作。– 系統關機– 備份檔案和目錄– 互動式登入到系統中

Page 76: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

76

安全性管理的核心元件

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

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

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

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

包含了本機使用者和使用者群組,以及它們的密碼和其他屬性。負責執行物件的安全訪問檢查、

管理使用者特權、生成安全稽核消息,並且定義了存取權杖資料結構來表示一個安全環境。

Page 77: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

77

Windows 作業系統的安全模型

• 在 Windows 的安全模型中– winlogon 負責系統登入,包括對用戶身份的認證。– lsass 負責管理系統本機安全性原則的管理,並且將這

些策略通知到核心中的 SRM 。– 在核心中, SRM 負責實現基於物件的存取控制以及系

統全域安全性原則的實施。

Page 78: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

78

Windows 作業系統的安全模型

• 在 Windows 的安全模型中– lsass 和 SRM 對於系統的安全性至關重要,一旦這兩

個元件被惡意代碼修改或侵入,則系統的安全防線將不復存在。

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

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

Page 79: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

79

Windows 作業系統的安全模型

• Windows 的自主存取模型與物件管理員整合在一起,每一種物件型別都定義了一個 Security 方法,該方法傳回一個物件的安全資訊。

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

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

Page 80: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

80

Windows 作業系統的安全模型

• 如果可以開啟該物件,那麼,物件管理員在緒程的行程控制代碼表中建立一個控制碼,記錄下該物件以及它所請求的存取類型。

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

Page 81: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

81

Windows 作業系統的安全模型

• 在這個模型中有兩點值得提一下• 1. 為了存取一個物件,緒程可以不使用它

所 屬行程的安全環境,而是以其他帳戶身份 來運行的安全環境,這稱為模仿 ( impersonation )。• 2.同一個行程中的其他緒程也可以利用已經 得到的控制碼來存取該物件。

Page 82: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

首先檢查呼叫者是否有 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 的安全監視機制連接起來。

82

Page 83: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

SePrivilegeCheck 函式的特權檢查程序

檢查

逐一匹配

SePrivilegeCheck

SepPrivilegeCheck(Token,RequiredPrivileges,RequirePrivilegeCount,PrivilegeSetControl…)

傳回 TRUE 或 FALSE

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

已匹配個數

特權中已賦予的特權集合

請求檢查的特權集合

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

執行實際的特權檢查

目前緒程的安全環境

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

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

SePrivilegeCheck 函式的特權檢查程序 83

Page 84: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

84

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)

Page 85: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

85

全域特權

• Windows 內核中定義了一組特權,即類型為 LUID 的 Se<Xxx>全域變數,其定義位於 base\ntos\se\seglobal.c 檔中,它們的初始化由該檔中的 SepVariableInitialization 函數來完成。這組全域特權為:

Page 86: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

86

SePrivilegeCheck 函式的特權檢查程序

• 對於每一種特權,當相關聯的操作(即需要此特權才能進行的操作)在核心中被適當的元件觸動時,應透過SePrivilegeCheck 或它的包裝函數SeSinglePrivilegeCheck ,來檢查呼叫緒程是否具有相關的特權。– EX : SepCreateToken 函數在把權杖物件插入到行程的控制碼表之前呼叫 SeSinglePrivilegeCheck 函數來檢查當前緒程是否具有SeCreateTokenPrivilege特權。

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

Page 87: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

87

Conclusion

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

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

Page 88: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

88

2.6 Windows 啟動過程

2.6.1 核心載入 ( 報告者 : 許齊顯 )

2.6.2 核心初始化2.6.3 建立使用者登入工作階段

Page 89: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

89

開機從哪裡執行?

• 剛開機時,作業系統尚未載入, Memory 也沒有資料,於是,什麼都不能執行?

• 為了解決這種問題,硬體製造商與 OS 設計者產生一些 “約定”。

Page 90: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

90

BIOS 與硬體商的約定

• 硬體將直接把 BIOS 的啟動區塊載入到0xFE000~ 0xFFFFF ,並且自 0xFFFF:0x0000 開始執行。

• 因此,開機之後的第一個程式- BIOS 啟動區,可以順利進行硬體檢查等工作。

Page 91: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

91

BIOS 在用硬碟開機時的約定

• 在 BIOS 進行 POST(Power on self test) 結束後,將根據 BIOS 設定自相對應磁碟把第 0磁碟第0磁軌第 1磁區 (512 bytes) 載入 0x07C00 ,然後執行。

• 第 0磁碟第 0磁軌第 1磁區也被稱為MBR(Master Boot Record)

Page 92: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

92

檔案系統設計者之間的約定

• MBR 會包含硬碟上可以拿來開機的磁碟分割。MBR 的任務便是將搜尋到的磁碟分割的第一磁區載入並執行,此磁區稱為開機磁區,此磁碟分割稱為系統磁碟區。

• OS 會在安裝時將可開機的磁碟分割注入 MBR之中。

Page 93: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

93

Windows 對於開機磁區的修改

• Windows 會覆寫開機磁區使其自動載入Windows 的 OS Loader- ntldr ,並將其載入至 0x20000 。

• ntldr 可分為 2部分,– 一部份為 real mode 的 Binary 程式–另一部份為標準的 PE格式執行檔-

osloader.exe

Page 94: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

94

ntldr

Page 95: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

95

ntldr - Real Mode

• Real mode 的程式率先執行,此時, CPU處於真實模式,記憶體存取有著 0xFFFFF(1MB) 的上限,而且 Page 機制未啟動。

• 因此, real mode 的目標為開啟 Paging 機制,並對應好前 16MB 的 Paging Table ,最後切換至 Protected Mode並執行 osloader.exe 。

Page 96: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

96

osloader.exe

• osloader.exe 的任務是載入所有 OS 開機過程中所需的檔案。

• 主要流程1. 讀取 boot.ini並搜尋 Hiberfil.sys 。若存在,進

行休眠回復。2. 若非休眠回復,載入 NTDETECT.COM 以供

利用 BIOS查詢系統裝置資訊。3. 載入 ntosktnl.exe , boot.ini 中指定的 HAL 檔。

Page 97: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

97

osloader.exe(cont.)

• 主要流程 (續 )4. 載入 \Windows\System32\Config\System 為

System 註冊機碼。5. 查詢 System 註冊機碼以載入適當驅動程式。6. 將過程中所有資料蒐集於

LOADER_PARAMETER_BLOCK 結構中,並執行 ntoskrnl.exe 的入口程式 (Entry Point) 。

Page 98: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

98

LOADER_PARAMETER_BLOCK[\public\internal\base\inc\arc.h]

typedef struct _LOADER_PARAMETER_BLOCK { LIST_ENTRY LoadOrderListHead; // 載入模組的串列 LIST_ENTRY MemoryDescriptorListHead; LIST_ENTRY BootDriverListHead; ULONG_PTR KernelStack; // 核心堆疊的位置 ULONG_PTR Prcb; // Prcocessor Control Block ULONG_PTR Process; // EPROCESS ULONG_PTR Thread; // ETHREAD ULONG RegistryLength; PVOID RegistryBase; PCONFIGURATION_COMPONENT_DATA ConfigurationRoot; PCHAR ArcBootDeviceName; PCHAR ArcHalDeviceName; PCHAR NtBootPathName; PCHAR NtHalPathName; PCHAR LoadOptions; // boot.ini裡的選項 PNLS_DATA_BLOCK NlsData; PARC_DISK_INFORMATION ArcDiskInformation; PVOID OemFontFile; struct _SETUP_LOADER_BLOCK *SetupLoaderBlock; PLOADER_PARAMETER_EXTENSION Extension; union { I386_LOADER_BLOCK I386; // ALPHA_LOADER_BLOCK Alpha; // IA64_LOADER_BLOCK Ia64; } u;} LOADER_PARAMETER_BLOCK, *PLOADER_PARAMETER_BLOCK;

Page 99: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

99

開機流程總結

BIOS

MBR

開機磁區

ntldr• 真實模式• osloader.exe

ntoskrnl.exe: Entry Point

Page 100: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

100

2.6 Windows 啟動過程

2.6.1 核心載入2.6.2 核心初始化 ( 報告者 : 許

齊顯 )2.6.3 建立使用者登入工作階段

Page 101: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

101

入口程式 (Entry Point)

• ntoskrnl.exe 執行其入口程式– 設定於 \base\ntos\build\makefile–預設為 KiSystemStartup

!if "$(targ)" == “i386” 。。。 。。。 entrypoint = KiSystemStartup@4 !else 。。。 。。。entrypoint = KiSystemStartup!endif

Page 102: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

102

核心初始化階段

• 核心初始分成 2 個階段: Phase 0 與 Phase 1– 許多系統元件於此 2 階段進行不同的初始化。– KiSystemStartup() 執行時,中斷

(Interrupt) 為禁止狀態。– KiSystemStartup()將在 Phase 0 不受任何

中斷影響地初始化 Phase 1 所需的資料,並為了開啟中斷做準備。

– Phase1Initialization() 則接手初始好的基本資料,並進行 Phase 1 的初始化。

Page 103: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

103

KiSystemStartup[\base\ntos\ke\i386\newsysbg.asm]

• 參數為 OS loader傳入的LOADER_PARAMETER_BLOCK

• 初始化 IDT(Interrupt Descriptor Table)、 TSS(Task State Segment)、 PCR(Processor Control Region)

• 主要流程1. 呼叫 HalInitializeProcessor() 初始化 PCR及中斷向量

2. 呼叫 KiInitializeKernel() 初始化核心相關的資料結構

3. 啟用中斷並降低 Priority 以讓 Phase 1 啟動4. 執行 KiIdleLoop() 使目前執行緒成為 Idle Thread

Page 104: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

104

KiSystemStartup 重點程式cPublicProc _KiSystemStartup ,1 。。。 。。。stdCall _HalInitializeProcessor, <dword ptr KissPbNumber, KissLoaderBlock> 。。。 。。。stdCall _KiInitializeKernel,<offset _KiInitialProcess,ebx,edx,dword ptr PCR[PcPrcb],eax,_KeLoaderBlock> 。。。 。。。Sti ; 啟用中斷LowerIrql DISPATCH_LEVEL ; 降低 Prioritymov byte ptr [ebx]+ThWaitIrql, DISPATCH_LEVEL 。。。 。。。@@: cmp _KiBarrierWait, 0 ; check if barrier set YIELD jnz short @b 。。。 。。。jmp @KiIdleLoop@0 ; enter idle loop 。。。 。。。

stdENDP _KiSystemStartup

Page 105: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

105

KiInitializeKernel[\base\ntos\ke\i386\kernlini.c]

• 根據目前是否為開機核心 (Processor 0)針對PRCB(Processor Control Block) 進行更詳細的設定。

• 主要流程1. 呼叫 KeInitializeThread() 初始化目前

執行緒的 Thread Object ,並初始化排程(Schedule)時所需的資料結構。

2. 設定目前執行緒專屬於當前 Processor 。3. 呼叫 ExpInitializeExecutive() 初始化

執行體。

Page 106: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

106

KiInitializeKernel 重點程式VOID KiInitializeKernel ( IN PKPROCESS Process,IN PKTHREAD Thread,IN PVOID IdleStack, IN PKPRCB Prcb, IN CCHAR Number, PLOADER_PARAMETER_BLOCK LoaderBlock ){ 。。。 。。。 if (Number == 0) { // 判斷是否為開機核心 。。。 。。。 } else { 。。。 。。。 } 。。。 。。。 KeInitializeThread(Thread, (PVOID)((ULONG)IdleStack), (PKSYSTEM_ROUTINE)NULL, (PKSTART_ROUTINE)NULL, (PVOID)NULL, (PCONTEXT)NULL, (PVOID)NULL, Process); 。。。 。。。 Thread->Affinity = (KAFFINITY)(1<<Number); // 設定此執行緒只能在這個 Processor 上執行 。。。 。。。 ExpInitializeExecutive(Number, LoaderBlock); 。。。 。。。}

Page 107: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

107

ExpInitializeExecutive[\base\ntos\init\initos.c]

• 主要執行執行體中各類元件的 Phase 0 初始化。• 除 HAL外元件都只在開機核心才進行初始化。• 主要流程

1. 初始化元件包含 HAL、執行體、記憶體管理員、記憶體集區、物件管理員、安全子系統、行程資料、執行緒管理員、隨插即用管理員。

Page 108: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

108

ExpInitializeExecutive 重點程式VOID ExpInitializeExecutive( IN ULONG Number,IN PLOADER_PARAMETER_BLOCK LoaderBlock ){ 。。。 。。。 if (Number == 0) { // 確認開機核心 。。。 。。。 InitializationPhase = 0L; // 設定指示“ Phase” 的全域變數 。。。 。。。 if (HalInitSystem(InitializationPhase, LoaderBlock) == FALSE) {} 。。。 。。。 if (!ExInitSystem()){} // 初始化執行體相關資料結構 。。。 。。。 if (MmInitSystem (0, LoaderBlock) == FALSE) {} // 初始化記憶體管理員 。。。 。。。 if (!ObInitSystem()){} // 初始化物件管理員 if (!SeInitSystem()){} // 初始化安全子系統 if (PsInitSystem(0, LoaderBlock) == FALSE){} // 初始化行程及緒程 if (!PpInitSystem()) {} // 初始化隨插即用管理員 。。。 。。。 } else{ if (HalInitSystem(InitializationPhase, LoaderBlock) == FALSE) {} }}

Page 109: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

109

PspInitPhase0[\base\ntos\ps\psinit.c]

• 由 PsInitSystem 於 Phase 0呼叫• 負責初始所有行程及執行緒皆須使用的資料結構。

• 並負責將初始目前行程為“ Idle”` ,並產生“System” 行程,並加入進行 Phase 1 的執行緒

Page 110: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

110

PspInitPhase0 重點程式BOOLEAN PspInitPhase0 ( IN PLOADER_PARAMETER_BLOCK LoaderBlock ){ 。。。 。。。 if(!NT_SUCCESS (ObCreateObjectType(&NameString, &ObjectTypeInitializer, (PSECURITY_DESCRIPTOR) NULL,&PsProcessType))) {} 。。。 。。。 if (!NT_SUCCESS (PspCreateProcess (&PspInitialSystemProcessHandle, PROCESS_ALL_ACCESS,&ObjectAttributes, NULL, 0, NULL, NULL, NULL, 0))) {} 。。。 。。。 strcpy((char *) &PsIdleProcess->ImageFileName[0], "Idle"); strcpy((char *) &PsInitialSystemProcess->ImageFileName[0], "System"); 。。。 。。。 if (!NT_SUCCESS (PsCreateSystemThread (&ThreadHandle, THREAD_ALL_ACCESS, &ObjectAttributes, 0L, NULL,

Phase1Initialization, (PVOID)LoaderBlock))) {} 。。。 。。。}

Page 111: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

111

Phase1Initialization[\base\ntos\init\initos.c]

• 執行 Phase1InitilizationDiscard()• 而後結束內部初始流程,轉化執行緒為回收記

憶體用的 MmZeroPageThread()

Page 112: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

112

Phase1InitializationDiscard[\base\ntos\init\initos.c]

• 設定初始階段為 Phase 1 。• 呼叫 KeStartAllProcessors()• 對各項元件進行 Phase 1 的初始化,以正式啟用各項

元件。– 包含物件管理員、記憶體管理員、組態管理員等

• 把啟動時獲得的資料轉換成登錄碼中的 “HKLM\SYSTEM”及 “HKLM\HARDWARE”

• 初始化 SRM ,並開啟 LPC Port 接受 lsass.exe 的請求。• 建立 smss.exe 行程,等待其執行並接手剩餘工作,

於是 Phase 1正式結束。

Page 113: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

113

Phase1InitializationDiscard 重點程式VOID Phase1InitializationDiscard (PVOID Context){ 。。。 。。。 InitializationPhase = 1; 。。。 。。。 KeStartAllProcessors(); 。。。 。。。 RtlCopyMemory(ProcessParameters->ImagePathName.Buffer, // NtInitialUserProcessBuffer==“\SystemRoot\System32\smss.exe” NtInitialUserProcessBuffer, ProcessParameters->ImagePathName.Length); 。。。 。。。 Status = RtlCreateUserProcess(&SessionManager, OBJ_CASE_INSENSITIVE, RtlDeNormalizeProcessParams( ProcessParameters ), NULL, NULL, NULL, FALSE, NULL, NULL, ProcessInformation); 。。。 。。。}

Page 114: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

114

KeStartAllProcessors[\base\ntos\ke\i386\allproc.c]

• 設立全域變數 KiBarrierWait ,使其他Processor最多完成 Phase 0 的初始化。

• 呼叫 KiInitProcessor() 初始化其他 Processor– KiInitProcessor()呼叫 KiInitProcessorState() 建構其他 Processor 的啟動設定。

– KiInitProcessor()呼叫 HalStartNextProcessor() 啟動 Processor

• 等候所有其他 Processor 成功初始 Phase 0 ,解除 KiBarrierWait ,其他 Processor 得以進入Phase 1 。

Page 115: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

115

KeStartAllProcessors 重點程式VOID KeStartAllProcessors (VOID){ 。。。 。。。 KiBarrierWait = 1; // 阻擋非開機 Processor停在 Phase 0

for (NewProcessorNumber = 1; NewProcessorNumber < MAXIMUM_PROCESSORS; NewProcessorNumber++) {

if (! KiInitProcessor(NewProcessorNumber, &NodeNumber, IdtOffset, GdtOffset, ProcessorDataSize) ) {} 。。。 。。。 } 。。。 。。。 KiBarrierWait = 0;}

Page 116: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

116

KiInitProcessorState[\base\ntos\ke\i386\allproc.c]

• 設定 Processor 啟動時應有的啟動設定。• 藉由修改屬於該 Processor 的 PCR ,設定 eip

為 KiSystemStartup

Page 117: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

117

KiInitProcessorState 重點程式PKPRCB KiInitProcessorState( PKPROCESSOR_STATE pProcessorState, PVOID PerProcessorAllocation, ULONG NewProcessorNumber, UCHAR NodeNumber, ULONG IdtOffset, ULONG GdtOffset, PVOID *ppStack, PVOID *ppDpcStack ){ 。。。 。。。 pProcessorState->ContextFrame.Eip = (ULONG) KiSystemStartup;

KiInitializePcr( (ULONG) NewProcessorNumber, (PKPCR) PCRDesc.Base, (PKIDTENTRY) pProcessorState ->SpecialRegisters.Idtr.Base, (PKGDTENTRY) pProcessorState ->SpecialRegisters.Gdtr.Base, (PKTSS) TSSDesc.Base, (PKTHREAD) pThreadObject, (PVOID) *ppDpcStack ); 。。。 。。。}

Page 118: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

118

MmZeroPageThread[\base\ntos\mm\zeropage.c]

• 回收屬於 “ INIT” section 的 Memory 。• 負責將 OS 回收的 Memory Page 的內容重設為

0 。

• 如:#pragma alloc_text(INIT, ExpInitializeExecutive)

Page 119: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

119

MmZeroPageThread 重點程式

VOID MmZeroPageThread (VOID){ 。。。 。。。 MiFindInitializationCode (&StartVa, &EndVa);

if (StartVa != NULL) { MiFreeInitializationCode (StartVa, EndVa); } 。。。 。。。}

Page 120: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

120

核心初始化總結KiSystemStartup

HalInitializeProcessor

KiInitializeKernel

ExpInitializeExecutiveHalInitSystemPsInitSystem

KiIdleLoop

Phase1InitilizationPhase1InitializationDiscard

KeStartAllProcessors

KiInitProcessorState

HalStartNextProcessor

MmZeroPageThread

KiInitProcessor

PspInitPhase0

KiSystemStartup

HalInitializeProcessor

KiInitializeKernel

ExpInitializeExecutiveHalInitSystem

KiIdleLoop

Processor 0Other Processor

Idle Process

System Process

Idle Process

ntldr

KeInitializeThread

KeInitializeThread

Page 121: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

121

2.6 Windows 啟動過程

2.6.1 核心載入 2.6.2 核心初始化

2.6.3 建立使用者登入工作階段 ( 報告者 : 左昌國 )

Page 122: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

122

建立使用者登入工作階段

• 前面所提到的 Phase1 主函式Phase1InitializationDiscard 在最後會建立工作階段管理員子系統行程 (Session Manager Subsystem) smss.exe ,這一節主要就是在講解 smss.exe 在 Windows 系統啟動的過程中,所扮演的角色。

• WRK裡沒有包含 smss.exe 的原始碼,必須要用 run-time debugging 來 trace code

Page 123: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

123

建立使用者登入工作階段

base/ntos/init/initos.c :

01776 SessionManager = ProcessParameters->ImagePathName; 01777 Status = RtlCreateUserProcess( 01778 &SessionManager, 01779 OBJ_CASE_INSENSITIVE, 01780 RtlDeNormalizeProcessParams( ProcessParameters ), 01781 NULL, 01782 NULL, 01783 NULL, 01784 FALSE, 01785 NULL, 01786 NULL, 01787 ProcessInformation); …01818 OldTime.QuadPart = Int32x32To64(5, -(10 * 1000 * 1000)); 01819 Status = ZwWaitForSingleObject( 01820 ProcessInformation->Process, 01821 FALSE, 01822 &OldTime 01823 );

\SystemRoot\System32\smss.exe

這邊會等 5秒鐘

在這邊就已經建好 smss.exe

Page 124: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

124

建立使用者登入工作階段

• smss.exe–Windows 系統啟動時第一個執行的 user-mode

process– 屬於 native application• 建立時,沒有 Windows Subsystem• smss 的其中一個任務就是建立其他的 Subsystem• 使用 native APIs ,無法使用 Win32 APIs• 視為 trusted OS component ,可以做一些需要高權限

的工作

Page 125: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

125

建立使用者登入工作階段

• smss 的工作– 載入除了 SYSTEM ,以及使用者設定檔以外的

registry 到記憶體裡– 執行在 registry裡面所設定的”開機時執行程式”– 執行開機時的檔案刪除或是檔案重新命名– 執行已知的 DLL( 例如一些子系統 DLL)– 建立分頁檔– 載入 win32k.sys ( 子系統的核心模組 )– 執行子系統 csrss.exe– 執行登入行程 winlogon.exe

Page 126: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

126

建立使用者登入工作階段

• 載入 registry– smss呼叫系統服務NtInitializeRegistry( 原始碼位於 base/ntos/config/ntapi.c#1030) 來初始化 registry 以及載入某些 registry

– NtInitializeRegistry呼叫CmpInitializeHiveList 來載入登錄區域 (page39)

Page 127: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

127

建立使用者登入工作階段

Page 128: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

128

建立使用者登入工作階段

Page 129: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

129

建立使用者登入工作階段

Page 130: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

130

建立使用者登入工作階段

• 系統啟動時要執行的程式– smss 的主要函式SmpLoadDataFromRegistry 會讀取在registry裡 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\BootExecute 所記錄的值,並且視為開機階段要執行的程式,並透過SmpExecuteCommand去執行

– 基本上會有 autochk.exe

Page 131: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

131

建立使用者登入工作階段

Page 132: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

132

建立使用者登入工作階段

• 開機時刪除檔案或更改檔案名稱–呼叫 SmpProcessFileRenames ,根據存在

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\FileRenameOperations 的機碼,視為檔案名稱來做這項動作

Page 133: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

133

建立使用者登入工作階段

• 執行已知的 DLL–呼叫 SmpInitializeKnownDlls ,根據 HKLM\

SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs裡面紀錄的機碼來找到需要被載入的 DLL file

Page 134: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

134

建立使用者登入工作階段HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

Page 135: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

135

建立使用者登入工作階段

• 建立分頁檔 (Paging Files)–呼叫 SmpCreatePagingFiles ,分頁檔列表在

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PagingFiles

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management

Page 136: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

136

建立使用者登入工作階段

• 載入 win32k.sys– 透過系統服務 NtSetSystemInformation 來達成在 kernel 中

載入 win32k.sys

base/ntos/ex/sysinfo.c

03452 Image = *(PUNICODE_STRING)SystemInformation; 03453 Status = MmLoadSystemImage(&Image, 03454 NULL, 03455 NULL, 03456 MM_LOAD_IMAGE_IN_SESSION, 03457 &SectionPointer, 03458 (PVOID *)&ImageBaseAddress);

“\SystemRoot\System32\win32k.sys”

Page 137: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

137

建立使用者登入工作階段

Page 138: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

138

建立使用者登入工作階段

• 執行子系統 csrss.exe–呼叫 SmpLoadSubSystem 來載入

csrss , csrss.exe 的路徑紀錄在 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems裡的 Windows 機碼

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems

Page 139: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

139

建立使用者登入工作階段

Page 140: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

140

建立使用者登入工作階段

• 執行登入行程 winlogon.exe• smss做完上述的初始化工作之後,就會執行

winlogon.exe ,並且等待 (WaitForSingleObject)csrss 和winlogon 的結束,一旦 smss 發現其中有一個結束,就代表Windows出現問題,就會跳到 CheckBug 程序並且當機

• winlogon.exe 也會做很多事情– 建立初始視窗工作站Winsta0– 建立登入桌面– 啟動服務控制管理員 (SCM, Service Control Manager)– 啟動子系統 lsass– 啟動 userinit

Page 141: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

141

建立使用者登入工作階段

• 建立 Winsta0– 建立桌面 Thread 以及 RIT(Raw Input Thread)

• 建立登入桌面 (winlogon desktop)– 只有 winlogon.exe 可以存取登入桌面,因此與密碼相

關的操作以及鎖定 /解除桌面的操作,只能透過winlogon.exe ,用來當作保護措施

• 啟動服務控制管理員 (SCM, Service Control Manager)– SCM 即為 services.exe– SCM 用來控制所有的服務與裝置驅動程式– SCM 在載入時會啟動 auto-start 類型的服務以及驅動

程式

Page 142: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

142

建立使用者登入工作階段

• 啟動子系統 lsass– 本機安全性授權子系統 (Local Security Authority

subsystem)– Lsass 啟動後, winlogon 和 lsass之間會建立一

個 LPC(LsaAuthenticationPort) ,在使用者登入和登出的時候用來在兩個程序當中通訊

Page 143: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

143

建立使用者登入工作階段

• 啟動 userinit–Winlogon 會透過 HKLM\SOFTWARE\Microsoft\

WindowsNT\Current Version\Winlogon\Userinit來取得 userinit.exe 的路徑

– 執行 userinit.exe之後,會載入使用者設定檔–並且執行 shell(explorer.exe) ,預設的 shell路徑

在 HKLM\SOFTWARE\Microsoft\WindowsNT\Current Version\Winlogon\Shell

– 登入完成後, userinit.exe 會自動結束

Page 144: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

144

建立使用者登入工作階段

HKLM\SOFTWARE\Microsoft\WindowsNT\Current Version\Winlogon

Page 145: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

145

建立使用者登入工作階段smss.exe

載入 registry

載入 win32k.sys

執行 csrss.exe

執行 winlogon.exe建立視窗工作站建立登入桌面執行 SCM(services.exe)

執行 lsass.exe載入 auto-start services 和 drivers

使用者登入lsass.exe

執行 userinit.exe

執行 shell explorer.exe

認證

結束

Page 146: Ch2.5~Ch2.7 ( p53~p96 ) TEAM 4 指導 教授  :  許富皓

146

END

Q & A