走進SVCHOST
SVCHOST進程現(xiàn)在是聲名狼藉,本來Windows用它來啟動各種服務,可是偏偏病毒、木馬也想盡辦法來利用它,企圖利用它的特性來迷惑用戶,達到
感染、入侵、破壞的目的(如沖擊波變種病毒“W32.Welchia.Worm”),弄的大家草木皆兵一見有SVCHOST就懷疑自己是否已經中招,其實
Windows系統(tǒng)存在多個SVCHOST進程是很正常的,在受感染的機器中到底哪個是病毒進程呢?這里僅舉一例來說明。
假設
Windows
XP系統(tǒng)被“W32.Welchia.Worm”感染了。正常的SVCHOST文件存在于“C:\Windows\system32”目錄下,如果發(fā)現(xiàn)該
文件出現(xiàn)在其他目錄下就要小心了。“W32.Welchia.Worm”病毒存在于“C:\Windows\system32\wins”目錄中,因此使
用進程管理器查看SVCHOST進程的執(zhí)行文件路徑就很容易發(fā)現(xiàn)系統(tǒng)是否感染了病毒。Windows系統(tǒng)自帶的任務管理器不能夠查看進程的路徑,可以使用
第三方進程管理軟件,如“Windows優(yōu)化大師”進程管理器,通過這些工具就可很容易地查看到所有的SVCHOST進程的執(zhí)行文件路徑,一旦發(fā)現(xiàn)其執(zhí)行
路徑為不平常的位置就應該馬上進行檢測和處理。
在基于NT內核的Windows操作系統(tǒng)家族中,不同版本的Windows系
統(tǒng),存在不同數量的“SVCHOST”進程,用戶使用“任務管理器”可查看其進程數目。一般來說,Win2000有兩個SVCHOST進程,WinXP中
則有四個或四個以上的SVCHOST進程(以后看到系統(tǒng)中有多個這種進程,千萬別立即判定系統(tǒng)有病毒了喲),而Win2003
server中則更多。這些SVCHOST進程提供很多系統(tǒng)服務,如:RpcSs服務(Remote Procedure
Call)、dmserver服務(Logical Disk Manager)、Dhcp服務(DHCP Client)等。
如果要了解每個SVCHOST進程到底提供了多少系統(tǒng)服務,可以在Win2000的命令提示符窗口中輸入“Tlist -S”命令來查看,該命令是Win2000 Support Tools提供的。在WinXP則使用“tasklist /svc”命令。
深入分析SVCHOST
Windows
系統(tǒng)進程分為獨立進程和共享進程兩種,“SVCHOST.EXE”文件存在于“%SystemRoot%\system32\”目錄下,它屬于共享進程。
隨著Windows系統(tǒng)服務不斷增多,為了節(jié)省系統(tǒng)資源,微軟把很多服務做成共享方式,交由SVCHOST.EXE進程來啟動。但SVCHOST進程只作
為服務宿主,并不能實現(xiàn)任何服務功能,即它只能提供條件讓其他服務在這里被啟動,而它自己卻不能給用戶提供任何服務。那這些服務是如何實現(xiàn)的呢?
Svchost組是由注冊表[HKEY_LOCAL_MACHINE\ Software\Microsoft\Windows
NT\CurrentVersion\Svchost]項來識別的。在這個注冊表項下的每個值都代表單獨的Svchost組,并在我們查看活動進程時作為
單獨的實例顯示。這里的鍵值均為REG_MULTI_SZ類型的值,并且包含該Svchost組里運行的服務名稱(如圖1)。
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" src="http://www.pconline.com.cn/pcedu/soft/st/winxp/0409/pic/040907svchost01.gif" src_cetemp="http://www.pconline.com.cn/pcedu/soft/st/winxp/0409/pic/040907svchost01.gif">
圖1 注冊表中的Svchost
實際上,Svchost只是作為服務的宿主,本身并不實現(xiàn)什么功能。如果需要使用Svchost來啟動某個DLL形式實現(xiàn)的服務,該
DLL的載體Loader指向Svchost,在啟動服務的時候由Svchost調用該服務的DLL來實現(xiàn)啟動的目的。使用Svchost啟動某個服務的
DLL文件是由注冊表中的參數來決定的,在需要啟動服務的注冊表項下都有一個“Parameters”子項,其中的“ServiceDll”鍵值表明該服
務由哪個DLL文件負責,并且這個DLL文件必須導出一個ServiceMain()函數,為處理服務任務提供支持。
那
SVCHOST又怎么知道某個系統(tǒng)服務該調用哪個動態(tài)鏈接庫呢?這是通過系統(tǒng)服務在注冊表中設置的參數來實現(xiàn)。下面就以RpcSs(Remote
Procedure Call)服務為例,進行講解。實例:筆者以Windows
XP為例,點擊“開始”/“運行”,輸入“services.msc”命令,彈出服務對話框,然后打開“Remote Procedure
Call”屬性對話框,可以看到RpcSs服務的可執(zhí)行文件的路徑為“C:\WINDOWS\system32\svchost -k
rpcss”,這說明RpcSs服務是依靠SVCHOST調用“rpcss”參數來實現(xiàn)的,而參數的內容則是存放在系統(tǒng)注冊表中的。
在運行對話框中輸入“regedit.exe”后回車,打開注冊表編輯器,找到[HKEY_LOCAL_MACHINESYSTEM\CurrentControlSet\Services\RpcSs]項,找到類型為“REG_EXPAND_SZ”的鍵
“magePath”,其鍵值為“%SystemRoot%\system32\svchost -k
rpcss”(這就是在服務窗口中看到的服務啟動命令),另外在“Parameters”子項中有個名為“ServiceDll”的鍵,其值為“%
SystemRoot%\system32\rpcss.dll”,其中“rpcss.dll”就是rpcss服務要使用的動態(tài)鏈接庫文件。這樣
SVCHOST進程通過讀取“RpcSs”服務注冊表信息,就能啟動該服務了。
Svchost進程木馬淺析
從前面的介紹我們
已經知道,在注冊表[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\Current-
Version\Svchost]分支中,存放著Svchost啟動的組和組內的各項服務,很多木馬和病毒正是利用這一點來實現(xiàn)自動加載的。它們通常的方
法有:
· 添加一個新的組,在組里添加服務名;
· 在現(xiàn)有的組里添加服務名或者利用現(xiàn)有組一個未安裝的服務;
· 修改現(xiàn)有組里的服務,將它的ServiceDll指向自己的DLL文件。
例如PortLess BackDoor就是一款典型的利用Svchost進程加載的后門工具。那么對于像PortLess
BackDoor這樣的木馬、病毒,該如何檢測并清除呢?以Windows
XP為例,首先我們可以利用“進程間諜”這樣的進程工具查看Svchost進程中的模塊信息(如圖3),并與之前的模塊信息比較,可以發(fā)現(xiàn)Svchost
進程中有一個可疑的DLL文件“SvchostDLL.dll”。同時,在“管理工具→服務”列表中會看到一項新的服務“Intranet
Services”(顯示名稱),此服務名稱為:Iprip,由Svchost啟動,“-k netsvcs”表示此服務包含在Netsvcs服務組中。
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" src="http://www.pconline.com.cn/pcedu/soft/st/winxp/0409/pic/040907svchost03.gif" src_cetemp="http://www.pconline.com.cn/pcedu/soft/st/winxp/0409/pic/040907svchost03.gif">
圖3 Svchost進程中的模塊信息
提示:在Windows 2000中,系統(tǒng)的Iprip服務偵聽由使用Routing Information協(xié)議版本1(RIPv1)的路由器發(fā)送的路由更新信息,在服務列表中顯示的名稱為“RIP Listener”。
運行Regedit,打開注冊表編輯器,展開[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\
Services\IPRIP]分支,查看其“Parameters”子項,其中“ServiceDll”鍵值指向調用的DLL文件路徑和全稱,這正是
后門的DLL文件。知道了這些,就可以動手清除了:在服務列表用右鍵單擊“Intranet
Services”服務,從菜單中選擇“停止”,然后在上述注冊表分支中刪除“Iprip”項。重新啟動計算機,再按照“ServiceDll”鍵值提示
的位置刪除后門程序主文件即可。最后需要提醒讀者的是,對注冊表進行修改前,應做好備份工作,以便出現(xiàn)錯誤時能夠及時還原。