FineArt News

認識 Windows Service

Windows服務 ( Service ) 是指Windows 背景執行的電腦程式。Windows服務程式和一般的應用程式 ( APP) 撰寫法式有些不同,必須符合Windows服務控制管理器的介面規則和協定。

由於 Windows服務 ( Service ) 可以長時間在背景執行,即使在Windows 開機階段中也可以執行,和常見的 Application執行方式略有不同。

一般的應用程式 必須在使用者登入 Windows的情況下,由使用者發動執行;而 Windows服務 ( Service )一但完成註冊,就可以在開機階段、使用者登入 Windows階段、使用者登出及關機階段執行。如果期望在登入或登出前做初始化動作,就必須要用Windows服務 ( Service )來完成。一般的應用程式綁定登入的使用者,而Windows服務 ( Service )則綁定在三種Windows內定的系統身分:系統服務、網路服務和本機服務,即使沒有使用者登入 Windows ,服務仍可以正常工作。

一般來說,Windows服務 ( Service )可以在電腦開機時自動啟動、也可以臨時暫停和重新啟動服務,這些操作都不會顯示任何的使用者介面。

基於以上的特性,Windows服務 ( Service ) 非常適合在伺服器上使用。一般的伺服器沒有顯示螢幕,又需長時間工作,將特定的Windows服務 ( Service ) 掛在伺服器上,供其他用戶使用,例如:遠端  RPC 服務、Web Service …等。

 

Windows服務 ( Service )的權限

前文提到Windows服務 ( Service ),會執行在三種Windows內定的系統帳號環境中,這些帳號和一般的使用者登入帳號不同,Windows內建的是具有較高權限的系統帳戶。如果要安裝一個新的服務,必須具備系統管理員 ( Administrator )相當的權限,才能安裝新的服務。這和驅動程式一樣也須要系統管理員 ( Administrator ) 的權限,而且須要經過微軟簽署核可才能安裝。

因為服務程式有高權限帶起,安裝及使用必須特別小心,如果服務程式有問題,會影響 Windows 的穩定性及安全性。

使用Ctrl-Alt-Esc 可以叫出工作管理員,點選下圖中的左下方服務,就可以看到那些服務程式正在執行。

在上圖中:

  • 可以看到服務的名稱。
  • 可以看到和一般程式相同,有一個陏機的 PID,PID 編號在程式結束後,會回收此編號。但可能在下一次新的程執行式或服務啟動時,會重新賦予相同的PID。也就是說,PID 在不同時間點,可能是不同的程式。
  • 駭客刻意偽冒寫的服務,那一定仿冒得分不出是否有問題,可以查詢Windows 正規服務或論壇上有無相關資訊,比對服務是否異常。
  • 如果發現奇怪的服務正在工作中,可以將之停止。
  • 將服務分群管理,方便特定目的及 IT 人員管理。

 

常用管理服務行程的工具
  • SC.EXE
    我們可以 CMD 或 PowerShell 下使用 SC.EXE ( Service Control ),可以透過SC.EXE對本地及遠端的Windows Service Control Manager下命令,直接輸入  SC.EXE 會顯示如何使用的範例。
  • 電腦管理
    在[開始]上使用右鍵,啟動[電腦管理],再點選在[電腦管理]左下方的[服務],或者直接於DOS command 中輸入 services.msc。如果要取得更多的訊息,可以進一步在[電腦管理]右方點選要觀察的服務程式,使用右鍵的[內容]對服務的細節進行開始,暫停…等操作。
  • EventLog
    服務通常沒有 UI 和使用者互動,會將服務發生的重要事件或是執行中的錯誤,透過如:RegisterEventSource 等 API,將訊息寫入 EventLog;而EventLog 則是在做資安鑑識時重要的線索來源。
  • EXE
    當開啟Windows工作管理員時,常常會發現有很多個SVCHOST.EXE在執行,而 SVCHOST.EXE是載入動態連結程式庫 (DLL) 成為服務執行;就是利用 SVCHOST.EXE 將我們寫的  DLL 載入,讓 DLL 如同服務般在背景執行。有些病毒,就是利用 SVCHOST.EXE 當做載入器,一般可以用 Process Explorer 觀察。如果發可疑的SVCHOST.EXE ( 例如:執行時間太長或是佔用資源太大 ),可以手動關掉服務。
  • 服務設定檔在那?
    除了上面介紹的工具外,也可以使用 RegEdit 觀察服務,在:電腦\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ 下混合了服務及驅動程式,其中 Srart 的鍵值 = 0 表示在 Boot 階段載入, =1, 2 表示順序載入, =3 表示手動載入,, =4 表示關閉。
    下圖例的 AcpiDev 是鍵值 = 3,屬於手動載入 ( 現在並未啟動 )‧有興趣的讀者,可以比對前述服務工具程式的顯示值。