当前位置:首页 > 技术经验 > 正文内容

追踪 WmiPrvSE.exe 进程的 CPU 利用率过高的问题

6年前 (2019-03-12)技术经验3729

前言

最近出现很网吧技术反馈 WmiPrvSE.exe 进程的 CPU 利用率过高的问题,达到5%至30%,很多人一头雾水,不知从何查起,只能靠挨个停用软件来排查。

本文介绍一种更加科学的方法来找出导致 WmiPrvSE.exe 进程的 CPU 利用率过高的罪魁祸首。

引用

WmiPrvSE.exe 是微软Windows操作系统的一部分,用于通过WinMgmt.exe程序处理WMI操作,该程序对计算机系统的正常运行是非常重要的。----百度百科

通俗的来讲,WmiPrvSE.exe 就是系统服务“Winmgmt ”对应的具体执行进程,系统服务“Winmgmt ”的显示名称为“Windows Management Instrumentation”,服务描述:“提供共同的界面和对象模式以便访问有关操作系统、设备、应用程序和服务的管理信息。如果此服务被终止,多数基于 Windows 的软件将无法正常运行。如果此服务被禁用,任何依赖它的服务将无法启动。”

注意:WmiPrvSE.exe 的路径在 C:\Windows\System32\wbem\WmiPrvSE.exe ,如果不是,则是后门程序或某软件投放的增值相关的软件

原理 & 操作方法

通常情况下,应用程序通过执行类似SQL语句的WMI语句来进行查询系统信息(ExecQuery)或注册监视事件(ExecNotificationQuery),具体的执行由 WmiPrvSE.exe 进程来完成。非频繁的查询系统信息(ExecQuery)并不容易导致 WmiPrvSE.exe CPU 利用率过高,而注册监视事件(ExecNotificationQuery)就很容易导致这个问题。那么我们追踪注册监视事件(ExecNotificationQuery)即可找到导致 WmiPrvSE.exe 进程的 CPU 利用率过高的罪魁祸首。

在win10上,操作系统默认会将WMI的语句执行记录到系统日志,我们只需要在 WmiPrvSE.exe 进程的CPU利用率很高的时候,在系统日志中寻找注册监视事件(ExecNotificationQuery)即可。

win7及win7以下的系统默认不记录WMI的语句执行,需要我们手动开启日志记录。开启方法很简单,客户机在超管状态下,执行此批处理:

@echo off
set Logfile=C:\Windows\System32\Winevt\Logs\Microsoft-Windows-WMI-ActivityTrace.evtx
Wevtutil sl Microsoft-Windows-WMI-Activity/Trace /e:true /q:true /logfilename:%Logfile% /maxsize:2147483648
ping 127.0.0.1 -n 3
eventvwr.msc /l:"%Logfile%"

然后保存还原点。

当客户机开机,玩过一段时间后,发现  WmiPrvSE.exe 进程的 CPU 利用率过高,此时我们找到日志文件 “C:\Windows\System32\Winevt\Logs\Microsoft-Windows-WMI-ActivityTrace.evtx”,将此日志文件复制到文件夹 “C:\wmilog” (文件夹需要自己手动建立),然后使用 FullEventLogView 来查看此日志文件。


当FullEventLogView完全显示wmi日志后,我们按下Ctrl+F,来搜索注册监视事件的关键字“ExecNotificationQuery”,下面这个日志是我在万象OL环境下找到的.

GroupOperationId = 506; OperationId = 507; Operation = Start IWbemServices::ExecNotificationQuery - SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'; ClientMachine = MSG023; User = MSG023\Administrator; ClientProcessId = 6248; NamespaceName = \\.\ROOT\CIMV2

该WMI语句用于注册一个进程创建事件监视器,当有新进程创建时,通知注册该事件的进程。我们可以看到表示进程ID的 ClientProcessId 的值为 6248,那么我们去找PID为 6248 的进程,很可能就是他导致  WmiPrvSE.exe 进程的 CPU 利用率过高,我找到的进程名称为“WxCSafe.exe”

在后来的日志中,我又发现了网维大师环境下特有的“TenNetbarProtect.exe”也执行过“ExecNotificationQuery”。还有易乐游环境下进程“eyoorun.exe”在开机的时候往C盘随机目录写出随机名称的exe文件并执行,该随机名称的进程,也会注册监视事件(ExecNotificationQuery)。那么此时问题范围就缩到很小了,我们只需要使用维护大师的安全中心的进程拦截或文件拦截规则暂时屏蔽他们来观察问题是否解决。

规则实例(仅拿 TenNetbarProtect.exe 做参考):

FileCheck[Self(Path=".*\\TenNetbarProtect.exe")][Process(null)][AccessMode(Create)]=Deny

补充

有维护大师用户找到我,反馈wmi日志频繁出现以下内容:

GroupOperationId = 321; OperationId = 59148; Operation = Start IWbemServices::ExecQuery - select * from Win32_Process; ClientMachine = Local; User = .\SYSTEM; ClientProcessId = 0; NamespaceName = \\.\root\CIMV2

从日志中可以看出,表示进程ID的 ClientProcessId 的值为0,表示进程用户名的 User 的值为 SYSTEM,通过PChunter查找系统中所有已加载“wbemcomn.dll”模块的进程,得出如下结果:

尝试依次暂停上方所有进程,最后查出暂停了PID为1484的进程,就没有这个日志了,使用process explorer查看得知该进程是wmi服务的宿主进程,于是重新分析wmi日志,看到文网客户端执行过“ExecNotificationQuery”,在开机命令去掉文网客户端则没有这个日志了,目前怀疑文网客户端的这个操作可能引起 WmiPrvSE.exe 的CPU利用率过高,后来由于时间问题没做测试。

FullEventLogView
类型:压缩文件|已下载:63|下载方式:免费下载
立即下载

扫描二维码推送至手机访问。

版权声明:本文由笨笨神发布,如需转载请注明出处。

本文链接:https://www.benbenshen.com/post/45.html

分享给朋友: