svchost与服务进程共享

来源:互联网 发布:模式识别算法 编辑:程序博客网 时间:2024/05/06 00:22

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

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

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

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

 

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

【原创】svchost与服务进程共享 - 远行的风 - 风的驿站

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

【原创】svchost与服务进程共享 - 远行的风 - 风的驿站

当一个共享服务要启动的时候,使用相同的参数(服务组名),在SCMService 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,在输出结果中左边的“图像名”列出了系统中正在执行的进程的名字,右侧的“服务”列出了对应进程承载的服务。

【原创】svchost与服务进程共享 - 远行的风 - 风的驿站

 

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

 

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

 

安全问题

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

 

参考资料:

http://en.wikipedia.org/wiki/Svchost

http://book.51cto.com/art/201103/248375.htm

 

86 0
原创粉丝点击