启动任务管理器,会发现svchost进程有多个,很多人会猜测有病毒,其实不然,到底是怎么回事呢,下面告诉你。
1. Svchost进程工作基本原理?
Svchost.exe文件存在于“%system root%\system32”(例如C:\Windows\system32)目录下,它是Windows NT核心的重要进程(Windows 9X没有该进程),专门为系统启动各种服务的。例如Svchost.exe调用rpcss.dll文件,就会启动rpcss服务(remote procedure call)。
随着windows系统服务不断增多,为了节省系统资源,微软把很多服务做成共享方式,交由 svchost.exe进程来启动。所以Svchost.exe实际上是一个服务宿主,它本身并不能给用户提供任何服务,但是可以用来运行动态链接库DLL文件,从而启动对应的服务。Svchost.exe进程可以同时启动多个服务。
2. Svchost如何启动服务?
由于系统服务都是以动态链接库(DLL)形式实现的,它们把可执行程序指向Svchost,因此Svchost只要调用某个动态链接库,即可启动对应的服务。那么Svchost启动某服务时,又是如何知道应该调用哪个动态链接库?这是由于系统服务在注册表中都设置了相关参数,因此Svchost通过读取某服务在注册表中的信息,即可知道应该调用哪个动态链接库,从而启动该服务。
实例说明:
以Svchost启动helpsvc(Help and Support)服务为例,介绍其启动服务的方法。在Windows XP中点击“开始” “运行”,输入“services.msc”命令,弹出服务对话框,然后双击打开“Help and Support”服务属性对话框,可以看到helpsvc服务的可执行文件的路径为“C:\WINDOWS\System32\svchost.exe -k netsvcs” ,说明helpsvc服务是依靠SVCHOST调用“netsvcs”参数来实现的,而参数的内容则是存放在系统注册表中的。
在运行对话框中输入“regedit.exe”后回车,打开注册表编辑器,找到[HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\helpsvc]项,找到类型为“REG_EXPAND_SZ”的键“magePath”,其键值为“%SystemRoot%\System32\svchost.exe -k netsvcs”(这就是在服务窗口中看到的服务启动命令),另外在“Parameters”子项中有个名为“ServiceDll”的键,其值为 “%WINDIR%\PCHealth\HelpCtr\Binaries\pchsvc.dll”,其中“pchsvc.dll”就是helpsvc服务要使用的动态链接库文件。这样SVCHOST进程通过读取“helpsvc”服务注册表信息,就能启动该服务了。
3. Svchost启动了哪些服务?
可以在命令提示符下输入命令来查看。例如在Windows XP中,打开“命令提示符”,键入tasklist /svc命令查看;在Windows 2000中,则输入“Tlist -S”命令来查看。如果你在Windows XP中,想得到所有进程的详细信息,可以打开“命令提示符”,键入tasklist /svc>abc.txt 命令,于是在当前目录中,将会生成一个abc.txt文件,其内容就是当前正在运行的所有进程情况,例如进程名、PID号、该进程启动了哪些服务。
4. 为什么系统中有多个Svchost进程?
MS把服务分为几组,同组服务共享一个svchost进程,不同组服务使用多个svchost进程,组的区别是由服务的可执行程序后边的参数决定的。
5. Svchost程序实现原理?
主函数首先调用ProcCommandLine()对命令行进行分析,获得要启动的服务组,然后调用SvcHostOptions()查询该服务组的选项和服务组的所有服务,并使用一个数据结构 svcTable 来保存这些服务及其服务的DLL,然后调用PrepareSvcTable() 函数创建 SERVICE_TABLE_ENTRY 结构,把所有处理函数SERVICE_MAIN_FUNCTION 指向自己的一个函数FuncServiceMain(),最后调用API StartServiceCtrlDispatcher() 注册这些服务的调度函数。
由于svchost为该组的所有服务都注册了svchost中的一个处理函数,因此每次启动任何一个服务时,服务管理器SCM都会调用 FuncServiceMain() 这个函数。这个函数使用 svcTable 查询要启动的服务使用的DLL,调用DLL导出的ServiceMain()函数来启动服务,然后返回。
6. Svchost病毒如何诊断?
Svchost并不是病毒进程,但是由于svchost的特殊性,许多病毒千方百计入侵svchost,相关病毒有如下两类行为。
1)假冒svchost.exe程序的病毒
病毒并没有直接利用真正的Svchost.exe,而是启动了一个名称同样是Svchost.exe的病毒进程,由于没有加载系统服务,它和真正的 Svchost.exe进程是不同的,只需在命令行窗口中运行一下“Tasklist /svc”,如果看到哪个Svchost.exe进程后面提示的服务信息是“暂缺”,而不是一个具体的服务名,那么它就是病毒进程了,记下这个病毒进程对应的PID数值(进程标识符),即可在任务管理器的进程列表中找到它,结束进程后,在C盘搜索Svchost.exe文件,也可以用第三方进程工具如process explorer直接查 看该进程的路径,正常的Svchost.exe文件是位于% systemroot%\System32目录中的,而假冒的Svchost.exe病毒文件则会在其他目录。
还需注意的是,有些病毒把SVCHOST.exe的字母通过大写方式混淆,字母O 其实是数字0,亦要把字母O改为数字0搜索。同时注意一下进程还有没有混淆的文件执行,例如:svohost.exe、syohost.exe、,或是后 缀名不同,例如:svchost.com、svchost.scr。
2)通过真正的Svchost.exe进程加载病毒程序
一些高级病毒则采用类似系统服务启动的方式,通过真正的Svchost.exe进程加载病毒程序,而Svchost.exe是通过注册表数据来决定要装载的服务列表的,所以病毒通常会在注册表中采用以下方法进行加载:
添加一个新的服务组,在组里添加病毒服务名
在现有的服务组里直接添加病毒服务名
修改现有服务组里的现有服务属性,修改其“ServiceDll”键值指向病毒程序
病毒程序要通过真正的Svchost.exe进程加载,就必须要修改相关的注册表数据,可以打开 [HKEY_LOCAL_MACHINE\Software \Microsoft\WindowsNT\CurrentVersion\Svchost],观察有没有增加新的服务组,同时要留意服务组中的服务列表,观察有没有可疑的服务名称,通常来说,病毒不会在只有一个服务名称的组中添加,往往会选择LocalService和netsvcs这两个加载服务较多的组,以干扰分析。
还有通过修改服务属性指向病毒程序的,通过注册表判断起来都比较困难,这时可以利用工具如windows服务管理专家,分别打开 LocalService和netsvcs分支,逐个检查右边服务列表中的服务属性,尤其要注意服务描述信息全部为英文的,很可能是第三方安装的服务,同时要结合它的文件描述、版本、公司等相关信息,进行综合判断。例如发现文件版本、公司、描述信息全部为空,要知道微软的系统服务程序是绝对不可能出现这种现象的,所以这样很可能是病毒。当猜测Svchost.exe进程加载运行的为病毒时可先用服务管理专家停止该服务的运行,然后运行regedit.exe打开“注册表编辑器”,删除[HKEY_LOCAL_MACHINE\System \CurrentControlSet\
Services\]下对应服务主键,重新启动计算机,再删除%systemroot% \System32目录中的病毒源程序。
02.03.2009 by vivilisa