svchost与服务进程共享

2017-01-06 11:16:20来源:作者:人点击

从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服务中去执行,这类恶意软件就需要通过杀毒软件来防御了(肯定需要修改注册表的,有了前面的知识,我们就能对于杀毒软件弹出的注册表被修改的提示有更好的判断了)。

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台