A. svchost是什麼程序
SvcHost 進程文件: svchost.dll
進程名稱: Trojan.W32.Agent
英文描述:
svchost.dll is a mole which is registered as a trojan. This Trojan allows attackers to access your computer from remote locations, stealing passwords, Internet banking and personal data. This process is a security risk and should be removed from your system.
進程分析:
svchost.exe是一個屬於微軟Windows操作系統的系統程序,用於執行DLL文件。這個程序對你系統的正常運行是非常重要的。注意:svchost.exe也有可能是W32.Welchia.Worm病毒,它利用WindowsLSASS漏洞,製造緩沖區溢出,導致你計算機關機。更多詳細信息參考:http://www.microsoft.com/technet/security/bulletin/ms04-011.mspx,該進程的安全等級是建議立即刪除。
安全等級 (0-5): N/A (N/A無危險 5最危險)
間諜軟體: 否
廣告軟體: 否
病毒: 否
木馬: 否
系統進程: 否
應用程序: 否
後台程序: 是
使用訪問: 是
訪問互聯網: 是
大家都要知道Svchost.exe,是系統必不可少的一個進程,很多服務都會多多少少用到它,但是我想大家也知道,由於它本身特殊性,高明的"黑客們"肯定是不會放過的,前段時間的Svchost.exe木馬風波,大家應該是記憶猶新吧,而且現在還是有很多機器里都藏有此木馬,因為它偽裝和系統進程Svchost.exe一樣,所以很多人分不清,哪個是進程,哪個是木馬……
好的,還是讓我們詳盡了解一下Svchost.exe進程吧
1.多個服務共享一個 Svchost.exe進程利與弊
windows 系統服務分為獨立進程和共享進程兩種,在windows NT時只有伺服器管理器SCM(Services.exe)有多個共享服務,隨著系統內置服務的增加,在windows 2000中ms又把很多服務做成共享方式,由svchost.exe啟動。windows 2000一般有2個svchost進程,一個是RPCSS(Remote Procere Call)服務進程,另外一個則是由很多服務共享的一個svchost.exe。而在windows XP中,則一般有4個以上的svchost.exe服務進程,windows 2003 server中則更多,可以看出把更多的系統內置服務以共享進程方式由svchost啟動是ms的一個趨勢。這樣做在一定程度上減少了系統資源的消耗,不過也帶來一定的不穩定因素,因為任何一個共享進程的服務因為錯誤退出進程就會導致整個進程中的所有服務都退出。另外就是有一點安全隱患,首先要介紹一下svchost.exe的實現機制。
2. Svchost原理
Svchost本身只是作為服務宿主,並不實現任何服務功能,需要Svchost啟動的服務以動態鏈接庫形式實現,在安裝這些服務時,把服務的可執行程序指向svchost,啟動這些服務時由svchost調用相應服務的動態鏈接庫來啟動服務。
那麼svchost如何知道某一服務是由哪個動態鏈接庫負責呢?這不是由服務的可執行程序路徑中的參數部分提供的,而是服務在注冊表中的參數設置的,注冊表中服務下邊有一個Parameters子鍵其中的ServiceDll表明該服務由哪個動態鏈接庫負責。並且所有這些服務動態鏈接庫都必須要導出一個ServiceMain()函數,用來處理服務任務。
例如rpcss(Remote Procere Call)在注冊表中的位置是 HKEY_LOCAL_,它的參數子鍵Parameters里有這樣一項:
"ServiceDll"=REG_EXPAND_SZ:"%SystemRoot%system32 pcss.dll"
當啟動rpcss服務時,svchost就會調用rpcss.dll,並且執行其ServiceMain()函數執行具體服務。
既然這些服務是使用共享進程方式由svchost啟動的,為什麼系統中會有多個svchost進程呢?ms把這些服務分為幾組,同組服務共享一個svchost進程,不同組服務使用多個svchost進程,組的區別是由服務的可執行程序後邊的參數決定的。
例如rpcss在注冊表中 HKEY_LOCAL_ 有這樣一項:
"ImagePath"=REG_EXPAND_SZ:"%SystemRoot%system32svchost -k rpcss"
因此rpcss就屬於rpcss組,這在服務管理控制台也可以看到。
svchost的所有組和組內的所有服務都在注冊表的如下位置: HKEY_LOCAL_ 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負責的服務時,服務管理器如果遇到可執行程序內容ImagePath已經存在於服務管理器的映象庫中,就不在啟動第2個進程svchost,而是直接啟動服務。這樣就實現了多個服務共享一個svchost進程。
3. Svchost代碼
現在我們基本清楚svchost的原理了,但是要自己寫一個DLL形式的服務,由svchost來啟動,僅有上邊的信息還有些問題不是很清楚。比如我們在導出的ServiceMain()函數中接收的參數是ANSI還是Unicode?我們是否需要調用RegisterServiceCtrlHandler和StartServiceCtrlDispatcher來注冊服務控制及調度函數?
這些問題要通過查看svchost代碼獲得。下邊的代碼是windows 2000+ service pack 4 的svchost反匯編片段,可以看出svchost程序還是很簡單的。
主函數首先調用ProcCommandLine()對命令行進行分析,獲得要啟動的服務組,然後調用SvcHostOptions()查詢該服務組的選項和服務組的所有服務,並使用一個數據結構 svcTable 來保存這些服務及其服務的DLL,然後調用PrepareSvcTable() 函數創建 SERVICE_TABLE_ENTRY 結構,把所有處理函數SERVICE_MAIN_FUNCTION 指向自己的一個函數FuncServiceMain(),最後調用API StartServiceCtrlDispatcher() 注冊這些服務的調度函數。
; =============================== Main Funcion =======================================
.text:010010B8 public start
.text:010010B8 start proc near
.text:010010B8 push esi
.text:010010B9 push edi
.text:010010BA push offset sub_1001EBA ; lpTopLevelExceptionFilter
.text:010010BF xor edi, edi
.text:010010C1 call ds:SetUnhandledExceptionFilter
.text:010010C7 push 1 ; uMode
.text:010010C9 call ds:SetErrorMode
.text:010010CF call ds:GetProcessHeap
.text:010010D5 push eax
.text:010010D6 call sub_1001142
.text:010010DB mov eax, offset dword_1003018
.text:010010E0 push offset unk_1003000 ; lpCriticalSection
.text:010010E5 mov dword_100301C, eax
.text:010010EA mov dword_1003018, eax
.text:010010EF call ds:InitializeCriticalSection
.text:010010F5 call ds:GetCommandLineW
.text:010010FB push eax ; lpString
.text:010010FC call ProcCommandLine
.text:01001101 mov esi, eax
.text:01001103 test esi, esi
.text:01001105 jz short lab_doservice
.text:01001107 push esi
.text:01001108 call SvcHostOptions
.text:0100110D call PrepareSvcTable
.text:01001112 mov edi, eax ; SERVICE_TABLE_ENTRY returned
.text:01001114 test edi, edi
.text:01001116 jz short loc_1001128
.text:01001118 mov eax, [esi+10h]
.text:0100111B test eax, eax
.text:0100111D jz short loc_1001128
.text:0100111F push dword ptr [esi+14h] ; dwCapabilities
.text:01001122 push eax ; int
.text:01001123 call InitializeSecurity
.text:01001128
.text:01001128 loc_1001128: ; CODE XREF: start+5Ej
.text:01001128 ; start+65j
.text:01001128 push esi ; lpMem
.text:01001129 call HeapFreeMem
.text:0100112E
.text:0100112E lab_doservice: ; CODE XREF: start+4Dj
.text:0100112E test edi, edi
.text:01001130 jz ExitProgram
.text:01001136 push edi ; lpServiceStartTable
.text:01001137 call ds:StartServiceCtrlDispatcherW
.text:0100113D jmp ExitProgram
.text:0100113D start endp
; =============================== Main Funcion end ===========================================
由於svchost為該組的所有服務都注冊了svchost中的一個處理函數,因此每次啟動任何一個服務時,服務管理器SCM都會調用FuncServiceMain() 這個函數。這個函數使用 svcTable 查詢要啟動的服務使用的DLL,調用DLL導出的ServiceMain()函數來啟動服務,然後返回。
; ============================== FuncServiceMain() ===========================================
. text:01001504 FuncServiceMain proc near ; DATA XREF: PrepareSvcTable+44o
.text:01001504
.text:01001504 arg_0 = dword ptr 8
.text:01001504 arg_4 = dword ptr 0Ch
.text:01001504
.text:01001504 push ecx
.text:01001505 mov eax, [esp+arg_4]
.text:01001509 push ebx
.text:0100150A push ebp
.text:0100150B push esi
.text:0100150C mov ebx, offset unk_1003000
.text:01001511 push edi
.text:01001512 mov edi, [eax]
.text:01001514 push ebx
.text:01001515 xor ebp, ebp
.text:01001517 call ds:EnterCriticalSection
.text:0100151D xor esi, esi
.text:0100151F cmp dwGroupSize, esi
.text:01001525 jbe short loc_1001566
.text:01001527 and [esp+10h], esi
.text:0100152B
.text:0100152B loc_100152B: ; CODE XREF: FuncServiceMain+4Aj
.text:0100152B mov eax, svcTable
.text:01001530 mov ecx, [esp+10h]
.text:01001534 push dword ptr [eax+ecx]
.text:01001537 push edi
.text:01001538 call ds:lstrcmpiW
.text:0100153E test eax, eax
.text:01001540 jz short StartThis
.text:01001542 add dword ptr [esp+10h], 0Ch
.text:01001547 inc esi
.text:01001548 cmp esi, dwGroupSize
.text:0100154E jb short loc_100152B
.text:01001550 jmp short loc_1001566
.text:01001552 ; =================================================
.text:01001552
.text:01001552 StartThis: ; CODE XREF: FuncServiceMain+3Cj
.text:01001552 mov ecx, svcTable
.text:01001558 lea eax, [esi+esi*2]
.text:0100155B lea eax, [ecx+eax*4]
.text:0100155E push eax
.text:0100155F call GetDLLServiceMain
.text:01001564 mov ebp, eax ; dll ServiceMain Function address
.text:01001566
.text:01001566 loc_1001566: ; CODE XREF: FuncServiceMain+21j
.text:01001566 ; FuncServiceMain+4Cj
.text:01001566 push ebx
.text:01001567 call ds:LeaveCriticalSection
.text:0100156D test ebp, ebp
.text:0100156F jz short loc_100157B
.text:01001571 push [esp+10h+arg_4]
.text:01001575 push [esp+14h+arg_0]
.text:01001579 call ebp
.text:0100157B
.text:0100157B loc_100157B: ; CODE XREF: FuncServiceMain+6Bj
.text:0100157B pop edi
.text:0100157C pop esi
.text:0100157D pop ebp
.text:0100157E pop ebx
.text:0100157F pop ecx
.text:01001580 retn 8
.text:01001580 FuncServiceMain endp ; sp = -8
; ============================== FuncServiceMain() end ========================================
由於svchost已經調用了StartServiceCtrlDispatcher來服務調度函數,因此我們在實現DLL實現時就不用了,這主要是因為一個進程只能調用一次StartServiceCtrlDispatcher API。但是需要用 RegisterServiceCtrlHandler 來注冊響應控制請求的函數。最後我們的DLL接收的都是unicode字元串。
由於這種服務啟動後由svchost載入,不增加新的進程,只是svchost的一個DLL,而且一般進行審計時都不會去HKEY_LOCAL_ NTCurrentVersionSvchost 檢查服務組是否變化,就算去檢查,也不一定能發現異常,因此如果添加一個這樣的DLL後門,偽裝的好,是比較隱蔽的。
4. 安裝服務與設置
要通過svchost調用來啟動的服務,就一定要在HKEY_LOCAL_ NTCurrentVersionSvchost下有該服務名,這可以通過如下方式來實現:
1) 添加一個新的服務組,在組里添加服務名
2) 在現有組里添加服務名
3) 直接使用現有服務組里的一個服務名,但本機沒有安裝的服務
4) 修改現有服務組里的現有服務,把它的ServiceDll指向自己
其中前兩種可以被正常服務使用,如使用第1種方式,啟動其服務要創建新的svchost進程;第2種方式如果該組服務已經運行,安裝後不能立刻啟動服務,因為svchost啟動後已經把該組信息保存在內存里,並調用API StartServiceCtrlDispatcher() 為該組所有服務注冊了調度處理函數,新增加的服務不能再注冊調度處理函數,需要重起計算機或者該組的svchost進程。而後兩種可能被後門使用,尤其是最後一種,沒有添加服務,只是改了注冊表裡一項設置,從服務管理控制台又看不出來,如果作為後門還是很隱蔽的。比如EventSystem服務,預設是指向es.dll,如果把ServiceDll改為EventSystem.dll就很難發現。
因此服務的安裝除了調用CreateService()創建服務之外,還需要設置服務的ServiceDll,如果使用前2種還要設置svchost的注冊表選項,在卸載時也最好刪除增加的部分。
註: ImagePath 和ServiceDll 是ExpandString不是普通字元串。因此如果使用.reg文件安裝時要注意。
5. DLL服務實現
DLL程序的編寫比較簡單,只要實現一個ServiceMain()函數和一個服務控製程序,在ServiceMain()函數里用RegisterServiceCtrlHandler()注冊服務控製程序,並設置服務的運行狀態就可以了。
另外,因為此種服務的安裝除了正常的CreateService()之外,還要進行其他設置,因此最好實現安裝和卸載函數。
為了方便安裝,實現的代碼提供了InstallService()函數進行安裝,這個函數可以接收服務名作為參數(如果不提供參數,就使用預設的iprip),如果要安裝的服務不在svchost的netsvcs組里安裝就會失敗;如果要安裝的服務已經存在,安裝也會失敗;安裝成功後程序會配置服務的ServiceDll為當前Dll。提供的UninstallService()函數,可以刪除任何函數而沒有進行任何檢查。
為了方便使用rundll32.exe進行安裝,還提供了RundllInstallA()和RundllUninstallA()分別調用InstallService()及UninstallService()。因為rundll32.exe使用的函數原型是:
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
);
對應的命令行是rundll32 DllName,FunctionName [Arguments]
DLL服務本身只是創建一個進程,該程序命令行就是啟動服務時提供的第一個參數,如果未指定就使用預設的svchostdll.exe。啟動服務時如果提供第二個參數,創建的進程就是和桌面交互的。
6
svchost.exe是nt核心系統的非常重要的進程,對於2000、xp來說,不可或缺。很多病毒、木馬也會調用它。所以,深入了解這個程序,是玩電腦的必修課之一。
大家對windows操作系統一定不陌生,但你是否注意到系統中「svchost.exe」這個文件呢?細心的朋友會發現windows中存在多個 「svchost」進程(通過「ctrl+alt+del」鍵打開任務管理器,這里的「進程」標簽中就可看到了),為什麼會這樣呢?下面就來揭開它神秘的面紗。
發現
在基於nt內核的windows操作系統家族中,不同版本的windows系統,存在不同數量的「svchost」進程,用戶使用「任務管理器」可查看其進程數目。一般來說,win2000有兩個svchost進程,winxp中則有四個或四個以上的svchost進程(以後看到系統中有多個這種進程,千萬別立即判定系統有病毒了喲),而win2003 server中則更多。這些svchost進程提供很多系統服務,如:rpcss服務(remote procere call)、dmserver服務(logical disk manager)、dhcp服務(dhcp client)等。
如果要了解每個svchost進程到底提供了多少系統服務,可以在win2000的命令提示符窗口中輸入「tlist -s」命令來查看,該命令是win2000 support tools提供的。在winxp則使用「tasklist /svc」命令。
svchost中可以包含多個服務
深入
windows系統進程分為獨立進程和共享進程兩種,「svchost.exe」文件存在於「%systemroot% system32」目錄下,它屬於共享進程。隨著windows系統服務不斷增多,為了節省系統資源,微軟把很多服務做成共享方式,交由 svchost.exe進程來啟動。但svchost進程只作為服務宿主,並不能實現任何服務功能,即它只能提供條件讓其他服務在這里被啟動,而它自己卻不能給用戶提供任何服務。那這些服務是如何實現的呢?
原來這些系統服務是以動態鏈接庫(dll)形式實現的,它們把可執行程序指向 svchost,由svchost調用相應服務的動態鏈接庫來啟動服務。那svchost又怎麼知道某個系統服務該調用哪個動態鏈接庫呢?這是通過系統服務在注冊表中設置的參數來實現。下面就以rpcss(remote procere call)服務為例,進行講解。
從啟動參數中可見服務是靠svchost來啟動的。
實例
以windows xp為例,點擊「開始」/「運行」,輸入「services.msc」命令,彈出服務對話框,然後打開「remote procere call」屬性對話框,可以看到rpcss服務的可執行文件的路徑為「c:\windows\system32\svchost -k rpcss」,這說明rpcss服務是依靠svchost調用「rpcss」參數來實現的,而參數的內容則是存放在系統注冊表中的。
在運行對話框中輸入「regedit.exe」後回車,打開注冊表編輯器,找到[hkey_local_machine ]項,找到類型為「reg_expand_sz」的鍵「magepath」,其鍵值為「%systemroot%system32svchost -k rpcss」(這就是在服務窗口中看到的服務啟動命令),另外在「parameters」子項中有個名為「servicedll」的鍵,其值為「% systemroot%system32rpcss.dll」,其中「rpcss.dll」就是rpcss服務要使用的動態鏈接庫文件。這樣 svchost進程通過讀取「rpcss」服務注冊表信息,就能啟動該服務了。
解惑
因為svchost進程啟動各種服務,所以病毒、木馬也想盡辦法來利用它,企圖利用它的特性來迷惑用戶,達到感染、入侵、破壞的目的(如沖擊波變種病毒「w32.welchia.worm」)。但windows系統存在多個svchost進程是很正常的,在受感染的機器中到底哪個是病毒進程呢?這里僅舉一例來說明。
假設windows xp系統被「w32.welchia.worm」感染了。正常的svchost文件存在於「c:\windows\system32」目錄下,如果發現該文件出現在其他目錄下就要小心了。「w32.welchia.worm」病毒存在於「c:\windows\system32\wins」目錄中,因此使用進程管理器查看svchost進程的執行文件路徑就很容易發現系統是否感染了病毒。windows系統自帶的任務管理器不能夠查看進程的路徑,可以使用第三方進程管理軟體,如「windows優化大師」進程管理器,通過這些工具就可很容易地查看到所有的svchost進程的執行文件路徑,一旦發現其執行路徑為不平常的位置就應該馬上進行檢測和處理。
Svchost.exe病毒的檢測和查殺方法
1.假冒Svchost.exe程序的病毒
運行的病毒並沒有直接利用真正的Svchost.exe,而是啟動了一個名稱同樣是Svchost.exe的病毒進程,由於沒有載入系統服務,它和真正的 Svchost.exe進程是不同的,只需在命令行窗口中運行一下「Tasklist /svc」,如果看到哪個Svchost.exe進程後面提示的服務信息是「暫缺」,而不是一個具體的服務名,那麼它就是病毒進程了,記下這個病毒進程對應的PID數值(進程標識符),即可在任務管理器的進程列表中找到它,結束進程後,在C盤搜索Svchost.exe文件,也可以用第三方進程工具直接查看該進程的路徑,正常的Svchost.exe文件是位於% systemroot%\System32目錄中的,而假冒的Svchost.exe病毒文件則會在其他目錄。
2:一些高級病毒則採用類似系統服務啟動的方式,通過真正的Svchost.exe進程載入病毒程序,而Svchost.exe是通過注冊表數據來決定要裝載的服務列表的,所以病毒通常會在注冊表中採用以下方法進行載入:
添加一個新的服務組,在組里添加病毒服務名
在現有的服務組里直接添加病毒服務名
修改現有服務組里的現有服務屬性,修改其「ServiceDll」鍵值指向病毒程序
病毒程序要通過真正的Svchost.exe進程載入,就必須要修改相關的注冊表數據,可以打開[HKEY_LOCAL_MACHINE\Software \Microsoft\WindowsNT\CurrentVersion\Svchost],觀察有沒有增加新的服務組,同時要留意服務組中的服務列表,觀察有沒有可疑的服務名稱,通常來說,病毒不會在只有一個服務名稱的組中添加,往往會選擇LocalService和netsvcs這兩個載入服務較多的組,以干擾分析。還有通過修改服務屬性指向病毒程序的,通過注冊表判斷起來都比較困難,這時可以利用前面介紹的服務管理專家,分別打開 LocalService和netsvcs分支,逐個檢查右邊服務列表中的服務屬性,尤其要注意服務描述信息全部為英文的,很可能是第三方安裝的服務,同時要結合它的文件描述、版本、公司等相關信息,進行綜合判斷。
Svchost.exe病毒的簡單處理:
1.當發現Svchost.exe不在%systemroot%\System32目錄中的,可以安全刪除,同時在注冊表中查找對應的注冊項刪除掉。
2.Svchost.exe在%systemroot%\System32目錄,說明Svchost.exe是被病毒感染了,可以用殺毒軟體清除。
註:清除和刪除要分清楚,清除是清除病毒,刪除則是刪文件
svchost.exe到底啟動了那些服務?
答:
如果你想了解每個SVCHOST進程當前到底提供了哪些系統服務,可以在命令提示符下輸入命令來查看。例如在Windows XP中,打開「命令提示符」,鍵入tasklist /svc命令查看;在Windows 2000中,則輸入「Tlist -S」命令來查看。如果
如果你在Windows XP中,想得到所有進程的詳細信息,可以打開「命令提示符」,鍵入 tasklist /svc>abc.txt 命令,於是在當前目錄中,將會生成一個abc.txt文件,其內容就是當前正在運行的所有進程情況,例如進程名、PID號、該進程啟動了哪些服務。
Svchost.exe病毒的清除方法:
1、用unlocker刪除類似於C:\SysDayN6這樣的文件夾:例如C:\Syswm1i、C:\SysAd5D等等,這些文件夾有個共同特點,就是名稱為 Sys*** (***是三到五位的隨機字母),這樣的文件夾有幾個就刪幾個。
2、開始——運行——輸入「regedit」——打開注冊表,展開注冊表到以下位置:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
刪除右邊所有用純數字為名的鍵,如
<66><C:\SysDayN6\svchost.exe>
<333><C:\Syswm1i\svchost.exe>
<50><C:\SysAd5D\svchost.exe>
<4><C:\SysWsj7\svchost.exe>
3、重新啟動計算機,病毒清除完畢
B. 用什麼軟體可以找出svchost.exe是那個程序啟動的
使用第三方進程管理軟體,如「windows優化大師」進程管理器,通過這些工具就可很容易地查看到告做所有的svchost進程的執行文件路徑,一旦發現其執行路徑為不平常的位置就旅友中應該馬上進行檢測和處理拆山。