SvcHost.exe的說明
1.多個服務(wù)共享一個 Svchost.exe進(jìn)程利與弊
windows 系統(tǒng)服務(wù)分為獨(dú)立進(jìn)程和共享進(jìn)程兩種,在windows NT時只有服務(wù)器管理器SCM(Services.exe)有多個共享服務(wù),隨著系統(tǒng)內(nèi)置服務(wù)的增加,在windows 2000中ms又把很多服務(wù)做成共享方式,由svchost.exe啟動。windows 2000一般有2個svchost進(jìn)程,一個是RPCSS(Remote Procedure Call)服務(wù)進(jìn)程,另外一個則是由很多服務(wù)共享的一個svchost.exe。而在windows XP中,則一般有4個以上的svchost.exe服務(wù)進(jìn)程,windows 2003 server中則更多,可以看出把更多的系統(tǒng)內(nèi)置服務(wù)以共享進(jìn)程方式由svchost啟動是ms的一個趨勢。這樣做在一定程度上減少了系統(tǒng)資源的消耗,不過也帶來一定的不穩(wěn)定因素,因?yàn)槿魏我粋€共享進(jìn)程的服務(wù)因?yàn)殄e誤退出進(jìn)程就會導(dǎo)致整個進(jìn)程中的所有服務(wù)都退出。另外就是有一點(diǎn)安全隱患,首先要介紹一下svchost.exe的實(shí)現(xiàn)機(jī)制。
2. Svchost原理
Svchost本身只是作為服務(wù)宿主,并不實(shí)現(xiàn)任何服務(wù)功能,需要Svchost啟動的服務(wù)以動態(tài)鏈接庫形式實(shí)現(xiàn),在安裝這些服務(wù)時,把服務(wù)的可執(zhí)行程序指向svchost,啟動這些服務(wù)時由svchost調(diào)用相應(yīng)服務(wù)的動態(tài)鏈接庫來啟動服務(wù)。
那么svchost如何知道某一服務(wù)是由哪個動態(tài)鏈接庫負(fù)責(zé)呢?這不是由服務(wù)的可執(zhí)行程序路徑中的參數(shù)部分提供的,而是服務(wù)在注冊表中的參數(shù)設(shè)置的,注冊表中服務(wù)下邊有一個Parameters子鍵其中的ServiceDll表明該服務(wù)由哪個動態(tài)鏈接庫負(fù)責(zé)。并且所有這些服務(wù)動態(tài)鏈接庫都必須要導(dǎo)出一個ServiceMain()函數(shù),用來處理服務(wù)任務(wù)。
例如rpcss(Remote Procedure Call)在注冊表中的位置是 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesRpcSs,它的參數(shù)子鍵Parameters里有這樣一項(xiàng):
"ServiceDll"=REG_EXPAND_SZ:"%SystemRoot%system32 pcss.dll"
當(dāng)啟動rpcss服務(wù)時,svchost就會調(diào)用rpcss.dll,并且執(zhí)行其ServiceMain()函數(shù)執(zhí)行具體服務(wù)。
既然這些服務(wù)是使用共享進(jìn)程方式由svchost啟動的,為什么系統(tǒng)中會有多個svchost進(jìn)程呢?ms把這些服務(wù)分為幾組,同組服務(wù)共享一個svchost進(jìn)程,不同組服務(wù)使用多個svchost進(jìn)程,組的區(qū)別是由服務(wù)的可執(zhí)行程序后邊的參數(shù)決定的。
例如rpcss在注冊表中 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesRpcSs 有這樣一項(xiàng):
"ImagePath"=REG_EXPAND_SZ:"%SystemRoot%system32svchost -k rpcss"
因此rpcss就屬于rpcss組,這在服務(wù)管理控制臺也可以看到。
svchost的所有組和組內(nèi)的所有服務(wù)都在注冊表的如下位置: HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionSvchost,例如windows 2000共有4組rpcss、netsvcs、wugroup、BITSgroup,其中最多的就是netsvcs=REG_MULTI_SZ:EventSystem.Ias.Iprip.Irmon.Netman.Nwsapagent.Rasauto.Rasman.Remoteaccess.SENS.Sharedaccess.Tapisrv.Ntmssvc.wzcsvc..
在啟動一個svchost.exe負(fù)責(zé)的服務(wù)時,服務(wù)管理器如果遇到可執(zhí)行程序內(nèi)容ImagePath已經(jīng)存在于服務(wù)管理器的映象庫中,就不在啟動第2個進(jìn)程svchost,而是直接啟動服務(wù)。這樣就實(shí)現(xiàn)了多個服務(wù)共享一個svchost進(jìn)程。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。