天才教育網(wǎng)合作機構(gòu) > 設(shè)計軟件培訓(xùn)機構(gòu) > AI培訓(xùn)機構(gòu) >

廣州維修培訓(xùn)網(wǎng)

歡迎您!
朋友圈

400-850-8622

全國統(tǒng)一學(xué)習(xí)專線 9:00-21:00

位置:設(shè)計軟件培訓(xùn)資訊 > AI培訓(xùn)資訊 > svchost.exe是什么進(jìn)程

svchost.exe是什么進(jìn)程

日期:2009-06-20 00:00:00     瀏覽:304    來源:廣州維修培訓(xùn)網(wǎng)

svchost.exe是什么進(jìn)程:svchost.exe是一個屬于微軟Windows操作系統(tǒng)的系統(tǒng)程序,用于執(zhí)行DLL文件。這個進(jìn)程對你系統(tǒng)的正常運行是非常重要的。注意:svchost.exe也有可能是W32.Welchia.Worm病毒,它利用WindowsLSASS漏洞,制造緩沖區(qū)溢出,導(dǎo)致你計算機關(guān)機。更多詳細(xì)信息參考:,該進(jìn)程的安全等級是建議立即刪除。

  大家都要知道Svchost.exe,是系統(tǒng)必不可少的一個進(jìn)程,很多服務(wù)都會多多少少用到它,但是我想大家也知道,由于它本身特殊性,高明的黑客們肯定是不會放過的,前段時間的Svchost.exe木馬風(fēng)波,大家應(yīng)該是記憶猶新吧,而且現(xiàn)在還是有很多機器里都藏有此木馬,因為它偽裝和系統(tǒng)進(jìn)程Svchost.exe一樣,所以很多人分不清,哪個是進(jìn)程,哪個是木馬……

  1.多個服務(wù)共享一個 Svchost.exe進(jìn)程利與弊

  windows 系統(tǒng)服務(wù)分為獨立進(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)定因素,因為任何一個共享進(jìn)程的服務(wù)因為錯誤退出進(jìn)程就會導(dǎo)致整個進(jìn)程中的所有服務(wù)都退出。另外就是有一點安全隱患,首先要介紹一下svchost.exe的實現(xiàn)機制。

  2. Svchost原理

  Svchost本身只是作為服務(wù)宿主,并不實現(xiàn)任何服務(wù)功能,需要Svchost啟動的服務(wù)以動態(tài)鏈接庫形式實現(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里有這樣一項:
  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 有這樣一項:
  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ù)。這樣就實現(xiàn)了多個服務(wù)共享一個svchost進(jìn)程。

  3. Svchost代碼

  現(xiàn)在我們基本清楚svchost的原理了,但是要自己寫一個DLL形式的服務(wù),由svchost來啟動,僅有上邊的信息還有些問題不是很清楚。比如我們在導(dǎo)出的ServiceMain()函數(shù)中接收的參數(shù)是ANSI還是Unicode?我們是否需要調(diào)用RegisterServiceCtrlHandler和StartServiceCtrlDispatcher來注冊服務(wù)控制及調(diào)度函數(shù)?
  這些問題要通過查看svchost代碼獲得。下邊的代碼是windows 2000+ service pack 4 的svchost反匯編片段,可以看出svchost程序還是很簡單的。
  主函數(shù)首先調(diào)用ProcCommandLine()對命令行進(jìn)行分析,獲得要啟動的服務(wù)組,然后調(diào)用SvcHostOptions()查詢該服務(wù)組的選項和服務(wù)組的所有服務(wù),并使用一個數(shù)據(jù)結(jié)構(gòu) svcTable 來保存這些服務(wù)及其服務(wù)的DLL,然后調(diào)用PrepareSvcTable() 函數(shù)創(chuàng)建 SERVICE_TABLE_ENTRY 結(jié)構(gòu),把所有處理函數(shù)SERVICE_MAIN_FUNCTION 指向自己的一個函數(shù)FuncServiceMain(),*調(diào)用API StartServiceCtrlDispatcher() 注冊這些服務(wù)的調(diào)度函數(shù)。
  由于svchost為該組的所有服務(wù)都注冊了svchost中的一個處理函數(shù),因此每次啟動任何一個服務(wù)時,服務(wù)管理器SCM都會調(diào)用FuncServiceMain() 這個函數(shù)。這個函數(shù)使用 svcTable 查詢要啟動的服務(wù)使用的DLL,調(diào)用DLL導(dǎo)出的ServiceMain()函數(shù)來啟動服務(wù),然后返回。
  由于svchost已經(jīng)調(diào)用了StartServiceCtrlDispatcher來服務(wù)調(diào)度函數(shù),因此我們在實現(xiàn)DLL實現(xiàn)時就不用了,這主要是因為一個進(jìn)程只能調(diào)用一次StartServiceCtrlDispatcher API。但是需要用 RegisterServiceCtrlHandler 來注冊響應(yīng)控制請求的函數(shù)。*我們的DLL接收的都是unicode字符串。
  由于這種服務(wù)啟動后由svchost加載,不增加新的進(jìn)程,只是svchost的一個DLL,而且一般進(jìn)行審計時都不會去HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionSvchost 檢查服務(wù)組是否變化,就算去檢查,也不一定能發(fā)現(xiàn)異常,因此如果添加一個這樣的DLL后門,偽裝的好,是比較隱蔽的。
  4. 安裝服務(wù)與設(shè)置
  要通過svchost調(diào)用來啟動的服務(wù),就一定要在HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionSvchost下有該服務(wù)名,這可以通過如下方式來實現(xiàn):
  1) 添加一個新的服務(wù)組,在組里添加服務(wù)名
  2) 在現(xiàn)有組里添加服務(wù)名
  3) 直接使用現(xiàn)有服務(wù)組里的一個服務(wù)名,但本機沒有安裝的服務(wù)
  4) 修改現(xiàn)有服務(wù)組里的現(xiàn)有服務(wù),把它的ServiceDll指向自己
  其中前兩種可以被正常服務(wù)使用,如使用第1種方式,啟動其服務(wù)要創(chuàng)建新的svchost進(jìn)程;第2種方式如果該組服務(wù)已經(jīng)運行,安裝后不能立刻啟動服務(wù),因為svchost啟動后已經(jīng)把該組信息保存在內(nèi)存里,并調(diào)用API StartServiceCtrlDispatcher() 為該組所有服務(wù)注冊了調(diào)度處理函數(shù),新增加的服務(wù)不能再注冊調(diào)度處理函數(shù),需要重起計算機或者該組的svchost進(jìn)程。而后兩種可能被后門使用,尤其是*一種,沒有添加服務(wù),只是改了注冊表里一項設(shè)置,從服務(wù)管理控制臺又看不出來,如果作為后門還是很隱蔽的。比如EventSystem服務(wù),缺省是指向es.dll,如果把ServiceDll改為EventSystem.dll就很難發(fā)現(xiàn)。
  因此服務(wù)的安裝除了調(diào)用CreateService()創(chuàng)建服務(wù)之外,還需要設(shè)置服務(wù)的ServiceDll,如果使用前2種還要設(shè)置svchost的注冊表選項,在卸載時也*刪除增加的部分。
  注: ImagePath 和ServiceDll 是ExpandString不是普通字符串。因此如果使用.reg文件安裝時要注意。
  5. DLL服務(wù)實現(xiàn)
  DLL程序的編寫比較簡單,只要實現(xiàn)一個ServiceMain()函數(shù)和一個服務(wù)控制程序,在ServiceMain()函數(shù)里用RegisterServiceCtrlHandler()注冊服務(wù)控制程序,并設(shè)置服務(wù)的運行狀態(tài)就可以了。
  另外,因為此種服務(wù)的安裝除了正常的CreateService()之外,還要進(jìn)行其他設(shè)置,因此*實現(xiàn)安裝和卸載函數(shù)。
  為了方便安裝,實現(xiàn)的代碼提供了InstallService()函數(shù)進(jìn)行安裝,這個函數(shù)可以接收服務(wù)名作為參數(shù)(如果不提供參數(shù),就使用缺省的iprip),如果要安裝的服務(wù)不在svchost的netsvcs組里安裝就會失?。蝗绻惭b的服務(wù)已經(jīng)存在,安裝也會失敗;安裝成功后程序會配置服務(wù)的ServiceDll為當(dāng)前Dll。提供的UninstallService()函數(shù),可以刪除任何函數(shù)而沒有進(jìn)行任何檢查。
  為了方便使用rundll32.exe進(jìn)行安裝,還提供了RundllInstallA()和RundllUninstallA()分別調(diào)用InstallService()及UninstallService()。因為rundll32.exe使用的函數(shù)原型是:
  void CALLBACK FunctionName(
  HWND hwnd, // handle to owner window
  HINSTANCE hinst, // instance handle for the DLL
  LPTSTR lpCmdLine, // string the DLL will parse
  int nCmdShow // show state
  );
  對應(yīng)的命令行是rundll32 DllName,FunctionName [Arguments]
  DLL服務(wù)本身只是創(chuàng)建一個進(jìn)程,該程序命令行就是啟動服務(wù)時提供的*個參數(shù),如果未指定就使用缺省的svchostdll.exe。啟動服務(wù)時如果提供第二個參數(shù),創(chuàng)建的進(jìn)程就是和桌面交互的。
  從啟動參數(shù)中可見服務(wù)是靠svchost來啟動的。
  實例
  以windows xp為例,點擊“開始”/“運行”,輸入“services.msc”命令,彈出服務(wù)對話框,然后打開“remote procedure call”屬性對話框,可以看到rpcss服務(wù)的可執(zhí)行文件的路徑為“c:windowssystem32svchost -k rpcss”,這說明rpcss服務(wù)是依靠svchost調(diào)用“rpcss”參數(shù)來實現(xiàn)的,而參數(shù)的內(nèi)容則是存放在系統(tǒng)注冊表中的。
  在運行對話框中輸入“regedit.exe”后回車,打開注冊表編輯器,找到[hkey_local_machine systemcurrentcontrolsetservicesrpcss]項,找到類型為“reg_expand_sz”的鍵“magepath”,其鍵值為“%systemroot%system32svchost -k rpcss”(這就是在服務(wù)窗口中看到的服務(wù)啟動命令),另外在“parameters”子項中有個名為“servicedll”的鍵,其值為“% systemroot%system32rpcss.dll”,其中“rpcss.dll”就是rpcss服務(wù)要使用的動態(tài)鏈接庫文件。這樣 svchost進(jìn)程通過讀取“rpcss”服務(wù)注冊表信息,就能啟動該服務(wù)了。
  解惑
  因為svchost進(jìn)程啟動各種服務(wù),所以病毒、木馬也想盡辦法來利用它,企圖利用它的特性來迷惑用戶,達(dá)到感染、入侵、破壞的目的(如沖擊波變種病毒“w32.welchia.worm”)。但windows系統(tǒng)存在多個svchost進(jìn)程是很正常的,在受感染的機器中到底哪個是病毒進(jìn)程呢?這里僅舉一例來說明。
  假設(shè)windows xp系統(tǒng)被“w32.welchia.worm”感染了。正常的svchost文件存在于“c:windowssystem32”目錄下,如果發(fā)現(xiàn)該文件出現(xiàn)在其他目錄下就要小心了?!皐32.welchia.worm”病毒存在于“c:windowssystem32wins”目錄中,因此使用進(jìn)程管理器查看svchost進(jìn)程的執(zhí)行文件路徑就很容易發(fā)現(xiàn)系統(tǒng)是否感染了病毒。windows系統(tǒng)自帶的任務(wù)管理器不能夠查看進(jìn)程的路徑,可以使用第三方進(jìn)程管理軟件,如“windows優(yōu)化大師”進(jìn)程管理器,通過這些工具就可很容易地查看到所有的svchost進(jìn)程的執(zhí)行文件路徑,一旦發(fā)現(xiàn)其執(zhí)行路徑為不平常的位置就應(yīng)該馬上進(jìn)行檢測和處理。
  Svchost.exe病毒的檢測和查殺方法
  1.假冒Svchost.exe程序的病毒
  運行的病毒并沒有直接利用真正的Svchost.exe,而是啟動了一個名稱同樣是Svchost.exe的病毒進(jìn)程,由于沒有加載系統(tǒng)服務(wù),它和真正的 Svchost.exe進(jìn)程是不同的,只需在命令行窗口中運行一下“Tasklist /svc”,如果看到哪個Svchost.exe進(jìn)程后面提示的服務(wù)信息是“暫缺”,而不是一個具體的服務(wù)名,那么它就是病毒進(jìn)程了,記下這個病毒進(jìn)程對應(yīng)的PID數(shù)值(進(jìn)程標(biāo)識符),即可在任務(wù)管理器的進(jìn)程列表中找到它,結(jié)束進(jìn)程后,在C盤搜索Svchost.exe文件,也可以用第三方進(jìn)程工具直接查看該進(jìn)程的路徑,正常的Svchost.exe文件是位于% systemroot%System32目錄中的,而假冒的Svchost.exe病毒文件則會在其他目錄。
  2:一些高級病毒則采用類似系統(tǒng)服務(wù)啟動的方式,通過真正的Svchost.exe進(jìn)程加載病毒程序,而Svchost.exe是通過注冊表數(shù)據(jù)來決定要裝載的服務(wù)列表的,所以病毒通常會在注冊表中采用以下方法進(jìn)行加載:
  添加一個新的服務(wù)組,在組里添加病毒服務(wù)名
  在現(xiàn)有的服務(wù)組里直接添加病毒服務(wù)名
  修改現(xiàn)有服務(wù)組里的現(xiàn)有服務(wù)屬性,修改其“ServiceDll”鍵值指向病毒程序
  病毒程序要通過真正的Svchost.exe進(jìn)程加載,就必須要修改相關(guān)的注冊表數(shù)據(jù),可以打開[HKEY_LOCAL_MACHINESoftware MicrosoftWindowsNTCurrentVersionSvchost],觀察有沒有增加新的服務(wù)組,同時要留意服務(wù)組中的服務(wù)列表,觀察有沒有可疑的服務(wù)名稱,通常來說,病毒不會在只有一個服務(wù)名稱的組中添加,往往會選擇LocalService和netsvcs這兩個加載服務(wù)較多的組,以干擾分析。還有通過修改服務(wù)屬性指向病毒程序的,通過注冊表判斷起來都比較困難,這時可以利用前面介紹的服務(wù)管理專家,分別打開 LocalService和netsvcs分支,逐個檢查右邊服務(wù)列表中的服務(wù)屬性,尤其要注意服務(wù)描述信息全部為英文的,很可能是第三方安裝的服務(wù),同時要結(jié)合它的文件描述、版本、公司等相關(guān)信息,進(jìn)行綜合判斷。
  Svchost.exe病毒的簡單處理:
  1.當(dāng)發(fā)現(xiàn)Svchost.exe不在%systemroot%System32目錄中的,可以安全刪除,同時在注冊表中查找對應(yīng)的注冊項刪除掉。
  2.Svchost.exe在%systemroot%System32目錄,說明Svchost.exe是被病毒感染了,可以用殺毒軟件清除。
  注:清除和刪除要分清楚,清除是清除病毒,刪除則是刪文件
  svchost.exe到底啟動了那些服務(wù)?
  答:
  如果你想了解每個SVCHOST進(jìn)程當(dāng)前到底提供了哪些系統(tǒng)服務(wù),可以在命令提示符下輸入命令來查看。例如在Windows XP中,打開“命令提示符”,鍵入tasklist /svc命令查看;在Windows 2000中,則輸入“Tlist -S”命令來查看。如果
  如果你在Windows XP中,想得到所有進(jìn)程的詳細(xì)信息,可以打開“命令提示符”,鍵入 tasklist /svc>abc.txt 命令,于是在當(dāng)前目錄中,將會生成一個abc.txt文件,其內(nèi)容就是當(dāng)前正在運行的所有進(jìn)程情況,例如進(jìn)程名、PID號、該進(jìn)程啟動了哪些服務(wù)。
  Svchost.exe病毒的清除方法:
  1、用unlocker刪除類似于C:SysDayN6這樣的文件夾:例如C:Syswm1i、C:SysAd5D等等,這些文件夾有個共同特點,就是名稱為 Sys*** (***是三到五位的隨機字母),這樣的文件夾有幾個就刪幾個。
  2、開始——運行——輸入“regedit”——打開注冊表,展開注冊表到以下位置:

  HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersion
PoliciesExplorerRun

  刪除右邊所有用純數(shù)字為名的鍵,如
  <66>
  <333>
  <50>
  <4>
  3、重新啟動計算機,病毒清除完畢。
如果本頁不是您要找的課程,您也可以百度查找一下: