Svchost的多個實例可以同時運行。每個Svchost會話可以包含一組服務,以便根據Svchost的啟動方式和位置的不同運行不同的服務,這樣可以更好地進行控制且更加便於調試。
Svchost組是由注冊表[HKEY_LOCAL_MacHINE\Software\Microsoft\Windows NT\CurrentVersion\Svchost]項來識別的。在這個注冊表項下的每個值都代表單獨的Svchost組,並在我們查看活動進程時作為單獨的實例顯示。這裡的鍵值均為REG_MULTI_SZ類型的值,並且包含該Svchost組裡運行的服務名稱(如圖1)。
實際上,Svchost只是作為服務的宿主,本身並不實現什麼功能。如果需要使用Svchost來啟動某個DLL形式實現的服務,該DLL的載體Loader指向Svchost,在啟動服務的時候由Svchost調用該服務的DLL來實現啟動的目的。使用Svchost啟動某個服務的DLL文件是由注冊表中的參數來決定的,在需要啟動服務的注冊表項下都有一個“Parameters”子項,其中的“ServiceDll”鍵值表明該服務由哪個DLL文件負責,並且這個DLL文件必須導出一個ServiceMain()函數,為處理服務任務提供支持。
提示:不同版本的Windows系統,存在不同數量的Svchost進程。一般來說,Windows 2000有兩個Svchost進程,而Windows XP則有四個或四個以上的Svchost進程。
Svchost進程實例講解
要想查看在Svchost中運行服務的列表,可以在Windows XP命令提示符窗口中輸入“Tasklist /svc”命令後,回車執行(如果使用的是Windows 2000,可用Support Tools提供的Tlist工具查看,命令為“Tlist -s”)。Tasklist命令顯示活動進程的列表,/svc命令開關指定顯示每個進程中活動服務的列表。從圖中可以看到,Svchost進程啟動很多系統服務,如:RpCSS(Remote Procedure Call)、Dhcp(DHCP ClIEnt)、Netman(Network Connections)服務等等(如圖2)。
這裡我們以RpcSs服務為例,來具體了解一下Svchost進程與服務的關系。運行Regedit,打開注冊表編輯器,依次展開[HKEY_LOCAL_MacHINE\SYSTEM\CurrentControlSet\Services\RpcSs ]分支,在“Parameters”子項中有個名為“ServiceDll”的鍵,其值為“%SystemRoot%\system32\rpcss.dll”。這表示系統啟動RpcSs服務時,調用“%SystemRoot%\system32”目錄下的RpCSS.dll動態鏈接庫文件。
接下來,從控制面板中依次雙擊“管理工具→服務”,打開服務控制台。在右側窗格中雙擊“Remote Procedure Call(RPC)”服務項,打開其屬性對話框,可以看到RpcSs服務的可執行文件的路徑為“C:\Windows\system32\svchost -k rpcss”,這說明RpcSs服務是依靠Svchost啟動的,“-k rpcss”表示此服務包含在Svchost的RpCSS服務組中。
Svchost進程木馬淺析
從前面的介紹我們已經知道,在注冊表[HKEY_LOCAL_MacHINE\SOFTWARE\Microsoft\Windows NT\Current- Version\Svchost]分支中,存放著Svchost啟動的組和組內的各項服務,很多木馬和病毒正是利用這一點來實現自動加載的。它們通常的方法有:
· 添加一個新的組,在組裡添加服務名;
· 在現有的組裡添加服務名或者利用現有組一個未安裝的服務;
· 修改現有組裡的服務,將它的ServiceDll指向自己的DLL文件。
例如PortLess BackDoor就是一款典型的利用Svchost進程加載的後門工具。那麼對於像PortLess BackDoor這樣的木馬、病毒,該如何檢測並清除呢?以Windows XP為例,首先我們可以利用“進程間諜”這樣的進程工具查看Svchost進程中的模塊信息(如圖3),並與之前的模塊信息比較,可以發現Svchost進程中有一個可疑的DLL文件“SvchostDLL.dll”。同時,在“管理工具→服務”列表中會看到一項新的服務“Intranet Services”(顯示名稱),此服務名稱為:Iprip,由Svchost啟動,“-k netsvcs”表示此服務包含在Netsvcs服務組中。
提示:在Windows 2000中,系統的Iprip服務偵聽由使用Routing Information協議版本1(RIPv1)的路由器發送的路由更新信息,在服務列表中顯示的名稱為“RIP Listener”。
運行Regedit,打開注冊表編輯器,展開[HKEY_LOCAL_MacHINE\SYSTEM\CurrentControlSet\Services\IPRIP]分支,查看其“Parameters”子項,其中“ServiceDll”鍵值指向調用的DLL文件路徑和全稱,這正是後門的DLL文件。知道了這些,就可以動手清除了:在服務列表用右鍵單擊“Intranet Services”服務,從菜單中選擇“停止”,然後在上述注冊表分支中刪除“Iprip”項。重新啟動計算機,再按照“ServiceDll”鍵值提示的位置刪除後門程序主文件即可。最後需要提醒讀者的是,對注冊表進行修改前,應做好備份工作,以便出現錯誤時能夠及時還原。