揭秘"SVCHOST.EXE"进程及其命令行选项
服务宿主进程或"svchost.exe"是最臭名昭著的进程之一。它因被误认为"恶意"而声名狼藉,主要源于两个因素:一是恶意软件会冒充它,二是老式"任务管理器"的设计缺陷。
由于旧版任务管理器(在某种程度上现在也是如此)的设计方式,它从未提供系统进程的详细信息,尤其是像"svchost.exe"这样的特殊进程。因此当用户通过任务管理器查看运行中的进程时,会看到一堆描述为"Windows服务的宿主进程"的"svchost.exe",却无法得知其中托管的具体服务。恶意软件只需两个步骤就能伪装成合法进程:首先将自身命名为"svchost.exe",然后添加描述"Host Process for Windows Services",就能在旧版任务管理器中以假乱真。
当然,你可以使用带"/SVC"参数的"Tasklist"命令,或者"Process Explorer"等工具,甚至Win10的新任务管理器来查看"svchost.exe"进程中的服务列表。但本文的重点不在此处。
让我们深入探讨以下问题:服务如何启动?"services.exe"与"svchost.exe"有何关联?"svchost.exe"进程托管哪些类型的服务?以及"svchost.exe"命令行参数的含义。
服务控制管理器(SERVICES.EXE)
服务控制管理器(SCM)是一个系统进程,运行磁盘"System32"文件夹中的"services.exe"。简言之,它是负责运行和管理系统服务的核心进程。
它通过注册表中的SCM数据库跟踪所有已安装服务,该数据库位于:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices
系统启动时,SCM会启动所有标记为"自动启动"的服务及其依赖项。这些服务将作为"services.exe"的子进程运行。观察"services.exe"进程时,我们会看到两类子进程:独立托管服务的进程和多个"svchost.exe"实例。
服务宿主(SVCHOST.EXE)
根据微软文档描述:
服务宿主(svchost.exe)是共享服务进程,作为从DLL文件加载服务的壳程序 —— 微软文档
查看正在运行的"svchost.exe"实例的命令行参数,通常会看到类似:
使用Process Explorer等工具检查该进程,会发现该实例实际托管了四个服务:
接下来解析这些命令行参数如何关联多个服务。
"-k"参数
当"svchost.exe"使用"-k"参数时,会查询注册表键:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionSvchost
该键定义了服务宿主组。每个值包含字符串,指定使用"-k"参数时要启动的服务。例如"-k UnistackSvcGroup"对应注册表中的值:
随后进程会从各服务的注册表键加载对应服务:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices[服务名称]
"-s"参数
该参数指定只加载服务组中的特定服务。例如:
表示仅加载"UnistackSvcGroup"组中的"CDPUserSvc"服务。
"-p"参数
根据@redmed666的研究,该参数强制实施三种策略:
-
DynamicCodePolicy(动态代码策略) -
BinarySignaturePolicy(二进制签名策略) -
ExtensionPolicy(扩展策略)
建议阅读其完整分析。
总结
通过本文我们解析了服务宿主进程的运作机制。如需视觉化学习,可下载我制作的思维导图:
下载链接:https://github.com/nasbench/MindMaps/tree/main/Windows%20System%20Processes/Svchost
推荐进一步阅读《Windows Internals》系列书籍。
参考资料
-
Geoff Chappell的Windows研究 -
微软服务控制管理器文档 -
微软服务宿主重构文档 -
.NET Windows服务介绍 -
@redmed666的"-p"参数分析
原文始发于微信公众号(独眼情报):揭秘“SVCHOST.EXE”进程及其命令行选项
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论