Svchost原理
Svchost本身只是作为服务宿 主,并不实现任何服务功能,需要Svchost启动的服务以动态链接库形式实现,在安装这些服务时,把服务的可执行程序指向svchost,启动这些服务 时由svchost调用相应服务的动态链接库来启动服务。
Svchost.exe进程是有什么作用?
Svchost.exe文件存在于“%system root%\system32”(例如C:\Windows\system32)目录下,它是Windows NT核心的重要进程(Windows 9X没有该进程),专门为系统启动各种服务的。例如Svchost.exe调用rpcss.dll文件,就会启动rpcss服务(remote procedure call)。
Svchost.exe实际上是一个服务宿主,它本身并不能给用户提供任何服务,但是可以用来运行动态链接库DLL文件,从而启动对应的服 务。Svchost.exe进程可以同时启动多个服务。
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”的键“
ImagePath”,其 键值为“
%SystemRoot%\System32\svchost.exe -k netsvcs”(这就是在服务窗口中看到的服务启动命令),另外在“
Parameters” 子项中有个名为“
ServiceDll”的键,其值为 “
%WINDIR%\PCHealth\HelpCtr\Binaries\pchsvc.dll”, 其中“
pchsvc.dll”就是
helpsvc服 务要使用的动态链接库文件。这样
svchost进程通过读取“
helpsvc”服务注册表信息,就能启动该服务了。
Svchost到底启动了哪些服务?
如果你想了解每个svchost进程当前到底提供了哪些系统服务,可以在命令提示符下输入命令来查看。例如在Windows XP中,打开“命令提示符”,键入
tasklist /svc命 令查看;在Windows 2000中,则输入“T
list -S” 命令来查看。
如果你在Windows XP中,想得到所有进程的详细信息,可以打开“命令提示符”,键入
tasklist /svc > abc.txt 命令,于是在当前目录中,将会生成一个abc.txt文件,其内容就是当前正在运行的所有进程情况,例如进程名、PID号、该进程启动了哪些服务
如 何发现Svchost进程有问题?
由于Svchost进程可以启动各种服务,因此病毒、木马也经常伪装成系统的DLL文件,使Svchost调用它,从而进入内存中运行、感染 和控制计算机。
用
PrcView查看所有Svchost进程的执行文件 路径(如图),正常的Svchost文件应该存在于“
c:\Windows \system32”目录下,如果你发现其执行路径在其他目录下,就有可能染上了病毒或木马了,应该马上进行检测和处理。
Svchost 进程杀不掉怎么办?
如果有些Svchost进程,你在任务管理器中无法关闭之,可以使用ntsd命令来杀掉它,方法如下:
首先需要了解欲杀的Svchost进程,其PID是多少?在Windows XP下,按Ctrl+Alt+Del打开任务管理器,点击“进程选项卡” “查看” “选择列”,在弹出的窗口中(图4),勾选“PID(进程标识 符)”,然后回到任务管理器中,即可看见PID了(例如要杀的Svchost进程,其PID是844)
接 下来关闭该进程。运行cmd在命令提示符下,输入命令
ntsd -c q -p 844 即可杀掉Svchost进程(PID是844)。
小提示:
除了System、smss.exe和csrss.exe这三 个进程,ntsd命令可以杀掉任何一个系统进程。从Windows 2000开始, 微软就提供了ntsd工具,该命令执行后,可让你获得系统的debug权,因 此能够用来关闭大部分的系统进程,如果你遇到无法关闭的进程,就可以使用该命令,其杀进程的命令格式为:
ntsd -c q �Cp XXX
以上XXX为欲杀进程的PID;
ntsd �Cp XXX 表示在调 试器中打开某进程(PID为XXX);
而-c q参数则表示退出调试器。由于调试器关闭之后,它打开的进程会随调试器一起退出,因此ntsd命令能够关闭进程。
附录:
windows系统进程分为独立进程和共享进程两种,“svchost.exe”文件存在于“%systemroot% system32”目录下,它属于共享进程。随着windows系统服务不断增多,为了节省系统资源,微软把很多服务做成共享方式,交由 svchost.exe进程来启动。但svchost进程只作为服务宿主,并不能实现任何服务功能,即它只能提供条件让其他服务在这里被启动,而它自己却 不能给用户提供任何服务。那这些服务是如何实现的呢?
原来这些系统服务是以动态链接库(dll)形式实现的,它们把可执行程序指向 svchost,由svchost调用相应服务的动态链接库来启动服务。那svchost又怎么知道某个系统服务该调用哪个动态链接库呢?这是通过系统服 务在注册表中设置的参数来实现。下面就以rpcss(remote procedure call)服务为例,进行讲解。
从启动参数中可见服务是靠svchost来启动的。
本文出自 “�n零的博客” 博客,转载请与作者联系!