解析 svchost 进程及其命令行参数
引子
svchost.exe
即服务宿主进程常被恶意软件利用,其中主要的两个原因是:恶意软件经常假冒成它,和旧的任务管理器的设计缺陷。
由于旧的任务管理器的设计(某种程度上,新的也是这样),它不会给出太多进程的详细信息,特别是对于svchost
这样的特殊进程。这就造成了,当使用任务管理器查看打开的进程时,你可以看到大量的svchost.exe
进程,而且他们的描述都是Windows服务宿主进程,并没有包含任何它们容纳的服务的信息。所以,恶意软件只需将恶意软件命名为svchost.exe
,并将描述设置为Windows服务宿主进程,就可以在任务管理器中伪装成svchost
。
可以使用tasklist
命令加/svc
参数或者使用类似 Process Explorer 和新任务管理器来查看服务列表,不过这不是这篇文章想要说的。我们想要了解的内容有以下几个:
- 服务如何启动
services.exe
和svchost.exe
之间的关系- 包含在
svchost
中的服务类型 svchost
的命令行选项的含义
The Service Control Manager(SERVICES.EXE)
SCM 简单来说是一个系统进程,运行的镜像是System32/services.exe
,它负责运行和管理系统的服务。它通过注册表中的键值(称为 SCM database)跟踪所有的服务,路径为HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
。
当 SCM 随系统启动时,它启动所有标记为auto-start
的服务和它们所需的依赖项。这些都作为services.exe
的子进程启动。当我们查看services.exe
的子进程时,可以看到两种进程:托管自己的服务的进程和svchost.exe
。
The Service Host(SVCHOST.EXE)
根据 MS 文档,svchost.exe
进程描述如下:
The Service Host(svchost.exe) is a shared-service process that serves as a shell for loading servicess from DLL files.
svchost.exe 是共享的服务进程,提供从 DLL 中加载服务的功能。
当我们查看一个svchost.exe
实例的命令行参数时,我们可以看到一些共同点:
前面提到过,命令行参数没有给出太多其中容纳的服务的信息。比如此处1336和1496进程,命令行参数都较为简单,但其实其中容纳了多个服务。
解释能够用简单的命令行参数启动多个服务的原因需要了解命令行参数的含义。
-k
svchost.exe
使用-k
标志时,会请求注册表键值HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost
,并匹配-k
标志后给出的值。以上图中1336进程为例,-k
参数后的值为DcomLaunch
,则在上述注册表下找到DcomLaunch
,即下图。
当获取到这些值且没有其他的标志时,它将从注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\[ServiceName]
中获取所有对应服务的信息并加载。
-s
在使用了-k
标志后,有时还会使用-s
标志,表示只加载特定的组的服务。
以上命令行标志只加载 DcomLuanch 对应值中 LSM 对应的服务。
-p
-p
标志表示强制执行不同的策略:DynamicCodePolicy、BinarySignaturePolicy 和 ExtensionPolicy。推荐阅读Exploration of svchost.exe /P flag – Another {websec, programming, dump} blog. (pusha.be)。
总结
推荐书籍:Windows Internals (深入解析Windows操作系统)
解析 svchost 进程及其命令行参数