svchost.exe是什么?
我的svchost.exe文件就在 C:\Windows\System32目錄下
svchost.exe工作過程
在系統(tǒng)啟動的時候,svchost.exe檢查注冊表中的位置來構建需要加載的服務列表。這就會使多個svchost.exe在同一時間運行。一般地,通過在任務管理器,我們可以看到Windows系統(tǒng)中存在多個“svchost”進程。
這些svchost進程提供多種系統(tǒng)服務,如:rpcss服務(remote procedure call)、dmserver服務(logical disk manager)、dhcp服務(dhcp client)等。 以常見的,讓人討厭的windows Update 服務為例子
其中,C:\Windows\System32\svchost.exe-k netsvcs -p 這個路徑當然就是啟動服務的關鍵信息,但是,后邊的這個-k netsvcs參數(shù)并不是在告訴svchost.exe啟動哪個服務,而是在告訴你wuauserv是屬于netsvcs這個組,正是由于采用了分組機制,系統(tǒng)中才會有多個svchost.exe進程,每個進程代表一個組,而這個服務的名稱叫wuauserv并不是顯示的Windows Update,哪個服務對應哪個dll,都是保存在注冊表里的,路徑是計算機\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services
就拿上邊的wuauserv服務來說,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services路徑下有一個wuauserv項,名字和服務名字一樣(也就是說,有多少個服務,這個路徑下就有多少個項,和服務名稱相對應),這個項里里邊又有一個Parameters子項,Parameters子項里有一個名字叫ServiceDll的鍵,它的值就是需要運行的動態(tài)鏈接庫文件(dll)的路徑。如圖:
啟動wuauserv服務的運行命令在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\wuauserv ,在項中找到類型為“reg_expand_sz”的鍵“Imagepath”的值為%systemroot%\system32\svchost.exe -k netsvcs -p,這就是wuauserv服務的運行命令,然后在重溫一遍 這個-k netsvcs參數(shù)并不是在告訴svchost.exe啟動哪個服務,而而是告訴你wuauserv是屬于netsvcs這個組
這樣一來,svchost.exe根據(jù)服務名稱找到相應的鍵值,就找到要啟動的dll了,然后在運行它
如果服務不通過svchost.exe啟動,那么就更簡單,直接在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services路徑下找到和服務名稱一樣的項,項中有一個叫ImagePath的鍵,這個鍵的值就是服務exe文件的路徑和啟動參數(shù)。如圖:
接著繼續(xù)分析svchost的分組要注意的是,并不是啟動一個相關服務就增加一個svchost進程的,而是根據(jù)命令參數(shù)分組,一般是一組服務就有一個svchost進程(上面提到過的)。也就是說,每個svchost.exe會話可以包含一組服務,可以根據(jù)svchost.exe的啟動方式和位置的不同運行不同的服務。 svchost.exe組的鍵值是: HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\svchost 在其中,我們可以找到上面的例子,就是在netsvcs組下的
svchost原理總結
例如netsvcs(Windows Update) 在注冊表中的位置是: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\netsvcs,它的參數(shù)子鍵Parameters里有這樣一項: "ServiceDll"=REG_EXPAND_SZ:"%SystemRoot%\system32\wuaueng.dll" 當啟動netsvcs服務時,svchost就會調用wuaueng.dll,并且執(zhí)行其ServiceMain()函數(shù)執(zhí)行具體服務。 既然這些服務是使用共享進程方式由svchost啟動的,為什么系統(tǒng)中會有多個svchost進程呢?微軟把這些服務分為幾組,同組服務共享一個svchost進程,不同組服務使用多個svchost進程,組的區(qū)別是由服務的可執(zhí)行程序后邊的參數(shù)決定的。就是這個
svchost的所有組和組內的所有服務都在注冊表的如下位置: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\svchost,我的電腦上組內服務最多的就是 netsvcs,在啟動一個svchost.exe負責的服務時,服務管理器如果遇到可執(zhí)行程序內容ImagePath已經(jīng)存在于服務管理器的映象庫中,就不再啟動第2個進程svchost,而是直接啟動服務。這樣就實現(xiàn)了多個服務共享一個svchost進程。
要通過svchost調用來啟動的服務,就一定要在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost下有該服務名,這可以通過如下方式來實現(xiàn):(1) 添加一個新的服務組,在組里添加服務名; (2) 在現(xiàn)有組里添加服務名; (3) 直接使用現(xiàn)有服務組里的一個服務名,但本機沒有安裝的該服務; (4) 修改現(xiàn)有服務組里的現(xiàn)有服務,把它的ServiceDll指向自己。 前兩種可以被正常服務使用,如使用第1種方式,啟動其服務要創(chuàng)建新的svchost進程;第2種方式如果該組服務已經(jīng)運行,安裝后不能立刻啟動服務,因為svchost啟動后已經(jīng)把該組信息保存在內存里,并調用API StartServiceCtrlDispatcher() 為該組所有服務注冊了調度處理函數(shù),新增加的服務不能再注冊調度處理函數(shù),需要重啟計算機或者該組的svchost進程。 后兩種可能被后門使用,尤其是最后一種,沒有添加服務,只是改了注冊表里一項設置,從服務管理控制臺又看不出來,如果作為后門還是很隱蔽的。比如EventSystem服務,缺省是指向es.dll,如果把ServiceDll改為EventSystem.dll就很難發(fā)現(xiàn)。 服務的安裝除了調用CreateService()創(chuàng)建服務之外,還需要設置服務的ServiceDll,如果使用前2種還要設置svchost的注冊表選項,在卸載時也最好刪除增加的部分。 |
|
|