admin管理员组

文章数量:1516870

Windows NT 操作系统开始, svchost.exe 进程就作为一个能够承载多个 Windows 服务的系统进程存在( svchost Windows 2000 就出现了,但是在 NT 3.1 中才支持进程共享), svchost 是服务进程共享的重要组成部分。

(服务进程共享( Shared Service Processes ):

如果每个服务都使用自己的进程来承载服务,那么会造成大量的系统资源浪费,使用共享的进程来承载多个服务,可以有效的减少资源浪费,当然弊端就是如果一个服务导致进程崩溃,那么进程上承载的其他服务也就跟着崩溃退出了。

Windows 系统自带的服务中,有些使用自己的进程,还有一些共享进程,例如 LSASS 进程,承载了安全相关的服务,比如 Security AccountsManager Service Net Logon Service 等等。)

一个 svchost Service Host )进程承载了多个服务,系统中有多个 svchost 的实例同时运行,在 svchost 中承载的服务都被编译为 DLL ,服务的注册表数据中,在“ Parameters ”子项下一定包含一个名叫 ServiceDll 的键,其值为对应的 DLL 文件的路径,例如 Browser 进程的注册表数据路径为 ”HKLM\SYSTEM\CurrentControlSet\Services\Browser” ,在 Parameters 子项中找到 ServiceDll 键值为 ”%SystemRoot%\System32\browser.dll”

DLL 文件的 ImagePath 格式为 ”%SystemRoot%\System32\svchost.exe -k [service group name]” service group name 在注册表 ”HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost” 项下面可以找到,该项中包含了很多不同的组,每组的值中包含一组共享进程的服务名:

当一个共享服务要启动的时候,使用相同的参数(服务组名),在 SCM Service Control Manager ,服务控制管理器)的数据库中又相同的入口,当第一次启动时,为 SvcHost 进程传入一个参数(服务名),在注册表 ”HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost” 项中查找一个包含这个名字的键,接着,进程通知 SCM 其所承载的所有服务,当其中某个服务再次启动时, SCM 不会再去发起另一个 SvcHost 进程了,而是会向已经启动了的负责承载这个服务的 SvcHost 进程发送一个“ start ”命令, SvcHost 进程会根据注册表中的信息去加载对应服务的 DLL 文件。

根据微软 03 年的统计,共享进程的服务最小的内存占用量约为 150KB ,而独享进程的服务约为 800KB

可以通过下面的方式来查看进程中承载了哪些服务:

1. 用命令提示符( Cmd 工具),在 Cmd 中输入 tasklist/svc ,在输出结果中左边的“图像名”列出了系统中正在执行的进程的名字,右侧的“服务”列出了对应进程承载的服务。

2. 对于 WindowsVista Windows7 ,在任务管理器中包含了服务标签,在其中可以查看服务对应的进程 ID

3. Windows8 中,任务管理器的界面进一步改进了,可以直接展开 svchost 进程来查看其承载的服务。

安全问题

由于 svchost 作为公共的系统进程来使用,因此一些恶意软件会伪装成 svchost.exe 这个名字来隐藏自己,系统正常的 svchost.exe 的路径在 ”C:\Windows\System32” 下,如果在任务管理其中我们查看到某个 svchost 进程的可执行文件的路径不是这个路径,那么一定是恶意软件了。另外还有一些恶意软件会将服务挂在到真正的 svchost 服务中去执行,这类恶意软件就需要通过杀毒软件来防御了(肯定需要修改注册表的,有了前面的知识,我们就能对于杀毒软件弹出的注册表被修改的提示有更好的判断了)。

参考资料:

本文标签: 例如服务编程