頻道欄目
首頁 > 資訊 > win7激活工具 > 正文

談談WIN2k的服務

04-10-03        來源:[db:作者]  
收藏   我要投稿

I、 摘要
II、 關于WIN2K的服務
III、 服務的啟動和關閉基本過程
IV、 服務的編程
V、 關于服務的安全
VI、 服務的管理
VII、 結尾


I、 摘要
WIN NT下的服務就類似*NIX下面的守護進程一樣,而且現在越來越多的軟件開始設計成服務的形式,從XP推出之后,通過服務來實現多用戶切換等就顯得很有作用了。
從安全角度來看待WIN的服務的話,也就因此有很多的話題,比如運行的權限、運行的時間等等。
本文就從一些方面來介紹并談談WIN服務的一些東西,受水平限制,內容不精致。


II、 關于WIN2K的服務

WIN32服務由三部分組成:服務應用程序、服務控制程序(SCP)和服務控制管理器(SCM)。

一、服務控制管理器

服務控制管理器(Service Control Manager):在系統啟動的時候開始,是WIN系統的一部分,它是一個遠程過程調用(RPC)服務器。這也是WIN服務系統的核心。
SCM主要負責下面的東西:
·維護安裝的服務數據庫
·在系統啟動或者有命令的時候開始服務和驅動服務
·枚舉安裝的服務和驅動
·維護運行著的服務和驅動的狀態
·傳輸控制請求去運行服務
·鎖定和解鎖服務數據庫
SCM維護著注冊表中的服務數據庫,位于:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices。其下的子鍵就是安裝的服務和驅動服務。每個子鍵的名稱就是服務名,當安裝的時候由服務安全程序的 CreateService 函數指定。

當系統安裝的時候,最初的數據庫就被創建。這個數據庫包含系統啟動時候的設備驅動。數據庫中的每個服務和驅動的信息包括:
·服務類型。服務執行時候是自己的進行還是同其他服務共享進行,是否是核心驅動還是文件系統驅動。
·啟動類型。服務或者驅動服務是否是在系統啟動的時候自動啟動還是,是否是由SCM來接受控制請求來啟動。啟動類型也表明服務是否被禁止。
·錯誤控制等級。指明如果服務或者驅動服務啟動失敗的錯誤處理。
·執行文件的全路徑。
·附加依賴信息決定啟動的正確順序。對于服務,這個信息包括在服務啟動之前SCM需要先啟動的指定服務,服務所屬加載順序組的名稱,服務在組中啟動順序的標志符。對于驅動服務,這個信息包括驅動啟動前需要啟動的指定驅動。
·對于服務,還有附加的帳號名稱和密碼。如果沒有指定帳號,服務就使用LocalSystem帳號。
·對于驅動,附加驅動對象名稱,用于I/0系統加載設備驅動。如果沒有指明對象名,I/O系統在驅動服務名稱基礎上創建一個默認的名稱。


二、服務控制程序

服務控制程序(SCP)則是控制服務應用程序的功能塊,也是服務應用程序同服務管理器(SCM)之間的橋梁。服務控制程序可以完成這些動作:
·如果服務啟動類型為SERVICE_DEMAND_START,那么服務控制程序來啟動服務
·發送控制請求給運行著的服務
·查詢運行著的服務的當前狀態
這些動作要求打開一個服務對象的句柄。

·服務啟動

要啟動一個服務,服務控制程序使用StartService 函數。如果數據庫被鎖定,那么StartService函數會失敗。如果遇到這種情況,那么服務控制程序需要等待,并重新調用StartService。可以通過QueryServiceLockStatus來查詢服務數據庫的狀態。

當服務控制程序開始一個服務的時候,可以通過StartService函數來指定傳遞給服務ServiceMain 函數的參數。當創建一個新的線程去執行ServiceMain后,StartService就返回了。服務控制程序可以通過QueryServiceStatus 函數來查詢被啟動的服務的狀態。在SERVICE_STATUS結構初始化中dwCurrentState應該是SERVICE_START_PENDING,而dwWaitHint則是一個毫秒的時間間隔,表示服務控制程序在調用QueryServiceStatus應該等待的時間。當初始化完成,服務就會改變服務的狀態dwCurrentState 為SERVICE_RUNNING。

如果服務在80秒,再加上最后的等待時間內沒有改變它的狀態,服務控制管理器確定服務已經停止響應,會記錄事件并停止服務。

如果程序在啟動驅動服務,StartService會在設備驅動初始化完成后返回。


·服務控制請求

服務控制程序通過ControlService來發送一個控制請求給運行著的服務。這個函數指定控制值傳遞給指定服務的HandlerEx 函數。這個控制值可以是用戶自定義碼,也可以是下面這些基本控制碼:
·停止服務:SERVICE_CONTROL_STOP
·暫停服務:SERVICE_CONTROL_PAUSE
·恢復被暫停的服務:SERVICE_CONTROL_CONTINUE
·返回服務的更新狀態信息:SERVICE_CONTROL_INTERROGATE

每個服務可以指定它接收和處理的控制值。要確定哪個基本控制值被服務接收,可以使用QueryServiceStatus 函數或者指定SERVICE_CONTROL_INTERROGATE 來調用ControlService 函數。SERVICE_STATUS結構中的dwControlsAccepted返回的是是否服務能被停止、暫停和恢復。所有的服務都能接收SERVICE_CONTROL_INTERROGATE。

QueryServiceStatus函數返回指定服務的最近狀態,而不會獲得服務本身更新的狀態。使用
SERVICE_CONTROL_INTERROGATE控制來調用ControlService函數可以確定狀態是否是當前的信息。

三、服務應用程序

服務應用程序是一個服務的主體程序,它是一個或者多個服務的可執行代碼。這將在服務的編程中詳細解釋。


III、 服務的啟動和關閉的基本過程

當系統啟動的時候,SCM會啟動所有自動啟動的服務以及這些服務依賴的服務。如果一個自動啟動的服務所依賴的服務是“手動”(需要命令才啟動)的服務,那么這個服務也會被自動啟動。服務的加載順序由下面這些方面來決定:
1.組的順序
2.一個組中服務的加載順序
3.每個服務所依賴的服務

當啟動完成的時候,系統執行啟動確認程序(由注冊表的HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControl
中的BootVerificationProgram值指定,默認情況下,這個值是沒有的。)。當第一個用戶登錄后,系統會簡單地報告啟動成功。可以單獨提供一個啟動確認程序來檢查系統問題和報告啟動狀態給SCM,使用 NotifyBootConfigStatus 函數。

當系統成功啟動后,系統就克隆保存一份數據庫備份,作為last-known-good(LKG)配置。如果當前使用的數據庫導致系統啟動失敗,那么可以用備份來恢復。備份的數據庫就保存在:
HKEY_LOCAL_MACHINESYSTEMControlSetXXXServices 中。
其中XXX值也被保存在:
HKEY_LOCAL_MACHINESystemSelectLastKnownGood 中。

如果自動啟動的服務自動的時候得出SERVICE_ERROR_CRITICAL錯誤,SCM就會重新啟動機器,并使用LKG的配置,如果LKG的配置已經被使用了,啟動就會失敗。

注冊表中服務的ErrorControl值表示SCM如何處理服務錯誤。如果值為SERVICE_ERROR_IGNORE(0)或者沒有指定,SCM只忽略錯誤并繼續服務的啟動,如果為SERIVCE_ERROR_NORMAL(1),就在事件日志中記錄下錯誤原因。如果錯誤控制為SERIVCE_ERROR_SEVERE(2)或者SERIVCE_ERROR_CRITICAL(3),服務就報告啟動錯誤。SCM記錄事件日志,并調用函數ScreverToLastKnownGood,將系統注冊配置切換到LKG的版本,然后調用NtShutDownSystem重新啟動系統。如果系統已經使用LKG版本,就直接重新啟動。

LKG版本的產生:SCM在系統啟動階段啟動了所有自起服務之后,需要來決定這個LKG配置。缺省情況下,一次成功的啟動包括所有服務的成功啟動和一個用戶的登錄。如果在啟動服務階段存在服務的SERIVCE_ERROR_SEVERE(2)或者SERIVCE_ERROR_CRITICAL(3)錯誤,那么這就是失敗的啟動。如果SCM成功完成服務的啟動,當有用戶登錄的時候,Winlogon調用NotifyBootConfigStatus函數發送消息給SCM。在成功啟動所有服務,并且收到NotifyBootConfigStatus的登錄信息,SCM就調用NtInitializeRegistry保存當前的啟動配置信息。

第三方可以用自己的定義取代Winlogon的確認,這可以由注冊表中:
KHLMSYSTEMCurrentControlSetControlBootVerificationProgam中的程序確定,可通過此加入對系統成功啟動的定義。啟動驗證程序則通過設定HKLMSOFTWAREMicrosoftWindows NTCurrentVersionWinlogonReportBootOK為0禁止Winlogon對NotifyBootConfigStatus的調用。這樣,SCM啟動完服務后,等待這個驗證程序調用NotifyBootConfigStatus函數通知登錄成功,然后才保存LKG配置。

SCM的執行文件是:WINNSystem32Service.exe,以控制臺模式運行,Winlogon進程在系統啟動早期啟動SCM。
SvcCtrlMain在緊接著屏幕變為空白時刻運行,在Winlogon加載圖形化身份鑒定并顯示登錄界面GINA之前運行。

SvcCtrlMain首先創建一個nonsignaled初始化的名為SvcCtrlEvent_A3752DX的同步事件,在完成準備接受SCP的命令的各項步驟之后,SCM才設定此事件為signaled狀態。SCP通過OpenSCManager函數來確認SCM,這個函數通過等待SvcCtrlEvent_A3752DX為signaled來防止SCP在SCM初始化完成之前接觸SCM。

SvcCtrlMain然后調用ScCreateServiceDB函數,建立SCM的服務數據庫。它先讀取注冊表中:
HKLMsystemCurrentControlSetControlServicegroupOrderlist內容,列出服務組名稱和它們的啟動順序,然后再搜索HKLMSYSTEMcurrentControlSetServices的內容,為每一條主鍵在服務的數據庫中創建一個條目。SCM本身屬于自起服務和設備驅動,并且標記為引導啟動和系統啟動驅動的啟動錯誤,也就是,所有標記為引導驅動和系統啟動驅動將在SCM啟動前被加載,在用戶模式進程執行前,I/O管理器就會加載這些啟動。ScCreateServiceDB讀取服務的組鍵值來確定服務所屬組,并同先前建立的組列表聯系起來。該函數還通過DependOnGroup和DependOnService函數來查詢服務和組的依賴關系。

在服務啟動的時候,SCM可能需要調用Lsass,SCM會等待Lsass在其初始化結束時的LSA_RPC_SERVICE_ACTIVE同步事件通知,Winl

相關TAG標簽
上一篇:臺積電:絕大多數7nm客戶都會轉向6nm_IT新聞_博客園
下一篇:最后一頁
相關文章
圖文推薦

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

免费的黄色网站