剖析Windows系統(tǒng)服務(wù)調(diào)用機(jī)制(上)

字號(hào):

剖析Windows系統(tǒng)服務(wù)調(diào)用機(jī)制
    Author: Brief
    E-Mail: Brief#fz5fz.org
    Homepage: http://www.fz5fz.org/ && http://www.safechina.net/
    Date: 07-18-2003
    一> 序言
    Windows系統(tǒng)服務(wù)調(diào)用是存在于Windows系統(tǒng)中的一個(gè)關(guān)鍵接口,常常稱作System Call ,Sysem Service Call 或 System Service Dispatching等,在此我們就權(quán)且稱之為Windows系統(tǒng)服務(wù)調(diào)用,它提供了操作系統(tǒng)環(huán)境由用戶態(tài)切換到內(nèi)核態(tài)的功能。雖然在國(guó)外關(guān)于Windows系統(tǒng)服務(wù)調(diào)用的討論比較多,但卻很少看到比較詳細(xì)的中文資料,希望本文能夠?yàn)楹妥髡咭粯訉?duì)Windows底層感興趣并且是剛剛接觸的朋友提供一些幫助。文章中將以一個(gè)內(nèi)核級(jí)的進(jìn)程監(jiān)視/隱藏工具T-ProcMon為例來(lái)詳細(xì)討論Windows系統(tǒng)服務(wù)調(diào)用的相關(guān)技術(shù)細(xì)節(jié)。另需注意本文討論的技術(shù)僅適用于基于Windows NT內(nèi)核的操作系統(tǒng),并以Windows 2000為例。
    二> Windows 2000系統(tǒng)體系結(jié)構(gòu)
    微軟Windows 2000是一個(gè)主要面向網(wǎng)絡(luò)服務(wù)器的操作系統(tǒng),因此它和以前大家比較熟悉的Windows 9x有很大的區(qū)別。但是對(duì)于討論一個(gè)因商業(yè)策略而出現(xiàn)的個(gè)人桌面操作系統(tǒng)的確沒(méi)有太大的價(jià)值。所以我們將主要介紹一些關(guān)于NT系統(tǒng)內(nèi)部結(jié)構(gòu)的細(xì)節(jié)。Windows 2000在實(shí)現(xiàn)其自身目標(biāo)的過(guò)程中,我們有必要講解一些它的特性。
    1. 可擴(kuò)展性(Extensibility)
    Windows 2000操作系統(tǒng)是一個(gè)面向未來(lái)的系統(tǒng),所以它非常注重自身的擴(kuò)展性,因?yàn)樵趯?lái)可能有許多市場(chǎng)等方面的原因?qū)е挛覀儽仨毺砑踊騽h除目前操作系統(tǒng)的一些組件,這就必須要求操作系統(tǒng)有較強(qiáng)的可擴(kuò)展性。為了滿足擴(kuò)充/刪除的各種需求,Windows 2000提供了一個(gè)重要的設(shè)計(jì)思想就是子系統(tǒng)(Subsystem)。我們可以將一些需要擴(kuò)展的操作系統(tǒng)功能作為一個(gè)子系統(tǒng)添加到Windows 2000內(nèi),就像OS/2,POSIX等一樣。當(dāng)然還有一個(gè)特性就是,我們可以通過(guò)為系統(tǒng)服務(wù)調(diào)用添加鉤子來(lái)修改系統(tǒng)的各項(xiàng)行為,這就為我們提供了一個(gè)了解系統(tǒng)內(nèi)部并擴(kuò)展系統(tǒng)功能的機(jī)會(huì)。
    2. 可靠性和健壯性(Reliability and Robust)
    一個(gè)系統(tǒng)存在的最基本的要求就是它的穩(wěn)定性,沒(méi)有穩(wěn)定的環(huán)境就做不出任何滿意的產(chǎn)品。為了滿足這項(xiàng)要求,Windows 2000提出了基于對(duì)象的訪問(wèn)控制權(quán)限的措施?,F(xiàn)代的大多數(shù)微處理器都支持兩種模式:用戶模式(User/Normal)和內(nèi)核模式(Kernel/Privileged)。操作系統(tǒng)組件和關(guān)鍵的系統(tǒng)組件處于內(nèi)核模式,而一般用戶模式的程序只能訪問(wèn)私有地址空間和執(zhí)行非特權(quán)等級(jí)的指令。如果用戶要調(diào)用一些內(nèi)核組件的功能,就得通過(guò)系統(tǒng)服務(wù)調(diào)用來(lái)實(shí)現(xiàn)。
    3. 兼容性(Compatibility)
    Intel和Microsoft能夠做到今天的一個(gè)很重要的因素就是他們支持對(duì)過(guò)去存在系統(tǒng)的兼容。這一點(diǎn)非常的關(guān)鍵,沒(méi)有人愿意三天兩頭的更換系統(tǒng),當(dāng)然也很少有人有這個(gè)經(jīng)濟(jì)實(shí)力。Windows 2000為了實(shí)現(xiàn)對(duì)其他系統(tǒng)的兼容,如Dos,16位Windows等,出現(xiàn)了環(huán)境子系統(tǒng)。而在Windows 2000中必須存在的環(huán)境子系統(tǒng)是Win32,它是其他子系統(tǒng)的基礎(chǔ),其他子系統(tǒng)都是一些表面的接口,而實(shí)際上是調(diào)用了Win32提供的接口,而Win32最終也是通過(guò)系統(tǒng)服務(wù)調(diào)用來(lái)與內(nèi)核聯(lián)系的。雖然操作系統(tǒng)為各種環(huán)境子系統(tǒng)提供了不同的動(dòng)態(tài)鏈接庫(kù),而且其中的API函數(shù)名稱往往也是不同的,不過(guò)這個(gè)函數(shù)的最終都是通過(guò)相同的系統(tǒng)服務(wù)調(diào)用進(jìn)入內(nèi)核來(lái)實(shí)現(xiàn)的。
    4. 易維護(hù)性(Maintainability)
    作為一個(gè)大型的項(xiàng)目,Windows 2000的維護(hù)也成為了一個(gè)大型的工程。而如此巨大的項(xiàng)目沒(méi)有很好的維護(hù)性是無(wú)法發(fā)展下去的。為此,Windows 2000使用了分層的思想,這也是一種操作系統(tǒng)體系結(jié)構(gòu)模型。其中,系統(tǒng)服務(wù)調(diào)用將系統(tǒng)的內(nèi)核模式代碼和用戶模式代碼隔離開來(lái),子系統(tǒng)使用系統(tǒng)服務(wù)調(diào)用為用戶提供應(yīng)用程序編程接口(API),而系統(tǒng)服務(wù)調(diào)用向下調(diào)用執(zhí)行體實(shí)現(xiàn)各項(xiàng)功能。
    就像在上文我們提到的操作系統(tǒng)存在的兩種模式,這是建立在處理器的基礎(chǔ)之上的。按理說(shuō),一般處理器可以提供從Ring0到Ring3的四種處理器模式,但是它們必須提供至少兩種,那就是Ring0和Ring3。而一些特殊處理器指令只能在內(nèi)核模式執(zhí)行,而一些地址空間必須在內(nèi)核模式才可以被訪問(wèn)。Windows 2000就利用了這個(gè)特點(diǎn),將操作系統(tǒng)和其他關(guān)鍵組件保護(hù)起來(lái),只有在內(nèi)核模式才可以訪問(wèn)執(zhí)行,而一般的用戶程序就只能在用戶態(tài)執(zhí)行咯,這樣就可以避免一些用戶程序?qū)Σ僮飨到y(tǒng)代碼的破壞,也就是大家看到的Windows 2000明顯比Windows 9x穩(wěn)定得多的主要原因。下面我們給出了Windows 2000的體系結(jié)構(gòu)簡(jiǎn)圖:
    系統(tǒng)支持進(jìn)程,服務(wù)進(jìn)程,應(yīng)用程序,環(huán)境子系統(tǒng)
    應(yīng)用程序編程接口
    基于NTDLL.dll的本地系統(tǒng)服務(wù) (用戶模式)
    -----------------------------------------
    系統(tǒng)服務(wù)調(diào)用 (內(nèi)核模式)
    執(zhí)行體
    系統(tǒng)內(nèi)核,設(shè)備驅(qū)動(dòng)程序
    硬件抽象層
    三> Windows 2000本機(jī)系統(tǒng)服務(wù)(Native API)
    Windows 2000本機(jī)系統(tǒng)服務(wù)又稱為Windows本機(jī)應(yīng)用程序編程接口,它是由執(zhí)行體(Executive)為用戶模式和內(nèi)核模式的程序提供的系統(tǒng)服務(wù)集。它包含兩種類型的函數(shù):Windows 執(zhí)行系統(tǒng)服務(wù)的系統(tǒng)服務(wù)調(diào)度占位程序;子系統(tǒng),子系統(tǒng)DLL和其他本機(jī)映像使用的內(nèi)部支持函數(shù)。
    從用戶模式調(diào)用本機(jī)系統(tǒng)服務(wù)是通過(guò)NTDLL.dll來(lái)實(shí)現(xiàn)的。表面上,Win32函數(shù)為編程人員提供了很多接口來(lái)實(shí)現(xiàn)我們想要的功能,但是這些Win32函數(shù)只不過(guò)是本機(jī)應(yīng)用程序編程接口的一個(gè)包裝器而已,它們將本機(jī)API包裝起來(lái),調(diào)用本機(jī)系統(tǒng)服務(wù)來(lái)實(shí)現(xiàn)用戶期望的功能。也就是說(shuō)NTDLL.dll只是系統(tǒng)服務(wù)調(diào)用接口在用戶模式下的一個(gè)外殼。關(guān)于用戶模式下的Windows本機(jī)系統(tǒng)服務(wù)的相關(guān)信息,請(qǐng)參見(jiàn)我以前寫的一篇文章《探測(cè)Windows2K/XP/2003本機(jī)系統(tǒng)信息》。
    我們?cè)僬務(wù)剰膬?nèi)核模式調(diào)用系統(tǒng)服務(wù)吧,這時(shí)就不是由NTDLL.dll導(dǎo)出系統(tǒng)服務(wù)調(diào)用的函數(shù)接口了,而是由ntoskrnl.exe來(lái)實(shí)現(xiàn)的,它會(huì)提供兩種形式的函數(shù):ZwXxx和NtXxx,在此我們就不多說(shuō)了。大家應(yīng)該注意到了,在上面我們介紹的Windows 2000系統(tǒng)體系結(jié)構(gòu)中的系統(tǒng)服務(wù)調(diào)用,執(zhí)行體和內(nèi)核都是存在于ntoskrnl.exe(在多處理器中為ntkrnlmp.exe)之中,并且是分層的。