標籤:windows核心
前言
對於每天都要在windows平台上進行逆向工程任務的我們而言,稍微瞭解一些系統底層的機制與實現原理,用這些背景知識來武裝自己總是好的。
調試器,反組譯碼器,加包,解包器,虛擬機器,等等,無一不是運行在windows系統上,
甚至對核心調試器如SoftICE,WinDbg等工具的使用,也要求瞭解一些系統的內幕。
最近抽空在閱讀《深入解析windows作業系統第6版上冊》這本書,因此將其中與軟體逆向有關的重點總結出來,部分內容加上了個人的理解進行潤色,並非斷章取義,而是去蕪存菁。
筆記會不定期更新,對於某些作者的觀點,嘗試加入自己的實驗過程來驗證。
********************************
在windows系統架構中,運行在使用者模式下的進程有4種基本類型,各自有其私人的進程地址空間:
1。固定的(或者硬性指定的)“系統支援進程“,比如登入(logon)進程,會話管理器(session manager)進程,它們並不是windows服務,也就是說,它們不是由“服務控制管理員”
來啟動的。登入進程名為winlogon.exe,即“windows登入應用程式”,由此可見它是運行在使用者模式下。會話管理器進程名為smss.exe,所有使用者模式進程在sysinternal的進程瀏覽器
中,其“private bytes”列都會顯示出使用的位元組數;相反,核心模式組件或服務,其private bytes列中沒有資料;服務控制管理員也是使用者模式進程之一,其進程名為services.exe
2。服務進程,服務進程宿納的是各種windows服務,這些服務可以通過運行services.msc來查看。windows服務往往要求獨立於使用者登入而運行(在使用者登入前,以及使用者不登入時,都
必須運行)svchost.exe就是服務進程,運行在使用者模式下
3。使用者應用程式
4。環境子系統服務進程
注意,服務進程與使用者應用程式,並不直接調用原生的windows作業系統服務,而是先調用一個或者多個子系統DLL(動態連結程式庫)中的A函數,
由A調用ntdll.dll中的相應B函數,B再調用原生的windows作業系統服務,後者運行在核心模式。
由此可見,子系統DLL運行在使用者模式,它扮演的角色即是,通過子系統DLL中一個已經文檔化的windows API函數,最終調用原生的系統服務,這些服務通常是未文檔化的。
(注意這裡的系統服務與前面提到的windows服務是兩個不同的事物)
補充說明,關於“子系統DLL的支援DLL”:ntdll.dll
ntdll.dll是一個特殊的系統支援庫,主要被其它的子系統DLL使用。應用程式調用某個子系統DLL中的windows API 函數,後者再調用ntdll.dll中的相應函數,例如NtCreateFile,
NtSetEvent等。雖然這些以Nt開頭的函數仍舊是運行在使用者模式,但是這些函數內部的程式碼封裝含了與處理器體繫結構相關的“處理器特權模式”切換指令,通過該指令可以切換到核心模式,
從而調用核心模式下的“系統服務分發(調度)器”。系統服務分發器在檢查某些參數的合法性以後,再由它調用真正的核心模式系統服務,其中包括Ntoskrnl.exe內部的實際代碼。
也就是說,從使用者模式到核心模式的轉換點位於ntdll.dll中的函數內部。
********************************
本文出自 “自由,平等,共用,互助” 部落格,請務必保留此出處http://shayi1983.blog.51cto.com/4681835/1617979
windows系統背景知識學習筆記