文章总结: 该文档系统梳理了Windows持久化攻击的7大类排查方法,涵盖注册表自启动、启动文件夹、计划任务、服务、WMI事件订阅等核心维度。重点提供了每类手法的具体检测命令、异常特征判断标准及排查优先级,例如注册表Run键路径检查、隐藏计划任务XML解析、WMI事件过滤器特征识别等实战技巧。文档强调结合路径合法性、数字签名、触发条件等要素进行综合研判,并给出P0-P3级响应优先级指导。 综合评分: 85 文章分类: 应急响应,实战经验,安全工具,恶意软件,内网渗透
Windows 持久化排查实战手册:从注册表到 WMI 一网打尽
原创
Pik安全实验室 Pik安全实验室
Pik安全实验室
2026年6月22日 09:30 广东
在小说阅读器读本章
去阅读
#
Pik 安全团队 | 2026-06-22
攻击者拿到一台 Windows 的权限之后,第一件事不是偷数据——是”确保下次还能进来”。这就是持久化。
市面上讲持久化的文章很多,但大多停留在”列出所有启动项路径”的层面。真正做应急的时候,你需要的不列表——是排查优先级、检测命令、误报处理、以及攻击者最新用的隐蔽手法。
持久化排查总览
Windows 持久化可以分为 7 大类,每一类对应一个排查维度:
| | | | | — | — | — | | 分类 | 攻击者手法 | 排查位置 | | 注册表自启动 | Run / RunOnce / Winlogon 等 | 注册表特定键值 | | 启动文件夹 | .lnk / .exe 快捷方式 | 文件系统 | | 计划任务 | 定时执行 payload | schtasks XML | | 服务 | 注册恶意服务 | 注册表 + sc query | | WMI 事件订阅 | 触发器 + 动作绑定 | WMI 命名空间 | | DLL 劫持 | 替换/劫持系统 DLL | 文件时间线 + 签名 | | 其他 | 屏幕保护 / 组策略 / AppCertDLLs | 分散路径 |
一、注册表自启动——经典但永远有效
1.1 Run / RunOnce
四条核心路径
reg query “HKLM\Software\Microsoft\Windows\CurrentVersion\Run” reg query “HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce” reg query “HKCU\Software\Microsoft\Windows\CurrentVersion\Run” reg query “HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce”
WOW64 路径(32位程序在64位系统上的自启动)
reg query “HKLM\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Run”
Run 每次登录都执行。RunOnce 执行一次后自动删除——但某些恶意软件会在退出前重新写入 RunOnce,实现”每次只执行一次”的效果。
排查要点:
-
程序路径在 C:\Users\、C:\Windows\Temp\、%APPDATA%\ → 高嫌疑
-
无数字签名的 exe → 标记
-
命令行包含 powershell -enc / cmd /c 等编码执行 → 极高嫌疑
1.2 Winlogon Shell 替换
reg query “HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon” /v Shell reg query “HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon” /v Userinit
正常值:Shell = explorer.exe,Userinit = C:\Windows\system32\userinit.exe,。
如果 Shell 变成了 explorer.exe, malware.exe 或者直接是 malware.exe——攻击者劫持了登录流程。
实战中我们见过 Shell 被改成 explorer.exe,C:\Windows\System32\cmd.exe——用户登录后 explorer 正常启动看不出问题,但同时 CMD 也在后台以用户权限运行,攻击者用它来反弹 Shell。
1.3 AppInit_DLLs(DLL 注入全系统进程)
reg query “HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows” /v AppInit_DLLs reg query “HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows” /v LoadAppInit_DLLs
如果 LoadAppInit_DLLs = 1 且 AppInit_DLLs 非空——系统上每一个加载 user32.dll 的进程都会加载这个 DLL。这是最暴力的持久化方式,但也很”脏”——大量进程崩溃会暴露。
Windows 10 1607+ 需要同时设置 RequireSignedAppInit_DLLs 才会加载,但攻击者如果同时设置了这个键为 0,仍然可以注入未签名 DLL。
1.4 BootExecute(系统启动前执行)
reg query “HKLM\System\CurrentControlSet\Control\Session Manager” /v BootExecute
正常值:autocheck autochk *。如果多出来其他程序路径——攻击者在系统启动完成前就植入了代码。
1.5 排查优先级
| | | | | — | — | — | | 优先级 | 注册表路径 | 理由 | | P0 | Winlogon\Shell / Userinit | 劫持整个登录流程 | | P0 | AppInit_DLLs | 注入所有 GUI 进程 | | P1 | HKLM\Run | 最常用 | | P1 | HKLM\RunOnce | 容易被忽视 | | P2 | HKCU\Run | 需要特定用户登录 | | P2 | BootExecute | 较少被使用 | | P3 | WOW6432Node 相关 | 32位程序场景 |
二、启动文件夹——最容易被忽略
dir “C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup” dir “$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup”
ProgramData 对所有用户生效,APPDATA 只对当前用户生效。攻击者更偏爱前者——不需要知道谁会登录。
注意:攻击者常见的技巧是在这里放一个 .lnk 而不是 .exe。LNK 文件的”目标”可以指向恶意 exe,”起始位置”可以设在正常目录,图标可以伪装成文件夹或文档。排查时不能只看文件名,要逐个右键查看属性。
三、计划任务——攻击者的最爱
schtasks /query /fo CSV /v > tasks.csv
从 CSV 中重点看这几列:
| | | | — | — | | 列名 | 异常特征 | | Task To Run | 路径包含 Temp / AppData / ProgramData / Public | | Schedule Type | At logon / At startup / One time + 每日重复 | | Author | 非 SYSTEM / Administrator / 企业管理员 | | Status | Ready(就绪待触发) | | Hidden | 1(隐藏任务,在 GUI 中不显示) |
隐藏计划任务
攻击者可以创建 SD(安全描述符)为隐藏的计划任务
这种任务在 GUI 任务计划程序中不显示
schtasks /query /fo LIST /v | findstr /i “hidden”
更准确的方式:直接看 XML
Get-ChildItem C:\Windows\System32\Tasks\ -Recurse -File | ForEach-Object { $xml = [xml](Get-Content $_.FullName) if ($xml.Task.Settings.Hidden -eq “true”) { Write-Host $_.Name } }
排查重点
-
执行路径是否指向临时目录或用户目录
-
触发器是否为”用户登录时”(At logon)——攻击者最常用的触发方式
-
是否有以管理员身份运行(RunLevel HighestAvailable)的计划任务
-
任务 XML 中是否包含 Base64 编码的参数
四、服务——戴上”系统”面具
sc query type= service state= all Get-Service | Select Name,DisplayName,StartType,Status
重点筛选:
所有自动启动的非 Microsoft 服务
Get-CimInstance Win32_Service | Where-Object { $_.StartMode -eq ‘Auto’ -and $_.PathName -notlike ‘*Microsoft*’ } | Select Name,DisplayName,PathName,StartName | Export-Csv services.csv
排查要点:
| | | | — | — | | 特征 | 风险 | | 服务名模仿系统服务(svchost 改成 svch0st) | 极高 | | 服务显示名很长(如 “Microsoft Windows Update Service Manager”) | 伪装 | | PathName 指向 Temp/Download/用户目录 | 极高 | | StartName 为 LocalSystem | 正常但高危(最高权限) | | 服务描述为空 | 可疑(正常服务通常有描述) | | 服务 DLL(svchost 托管)在注册表中被篡改 | 隐蔽 |
svchost 托管服务
很多恶意软件不注册独立 .exe 服务,而是注册为 svchost 托管的 DLL 服务。检查:
reg query “HKLM\System\CurrentControlSet\Services\Parameters” /v ServiceDll
如果 ServiceDll 指向非 System32 目录的 DLL——立即调查。
五、WMI 事件订阅——攻击者的”隐形触发”
WMI 事件订阅是持久化中最隐蔽的手法之一。它不需要可执行文件落地,不需要注册表自启动键值,不需要计划任务。只是一个 WMI 事件过滤器 + 消费者 + 绑定关系。
排查命令
列出所有 __EventFilter(事件过滤器)
Get-WMIObject -Namespace root\Subscription -Class __EventFilter | Select Name, Query, QueryLanguage
列出所有 __EventConsumer(消费者/动作)
Get-WMIObject -Namespace root\Subscription -Class __EventConsumer | Select Name, CommandLineTemplate
列出所有绑定关系
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding | Select Filter, Consumer
典型的恶意 WMI 订阅特征
一个经典的 WMI 后门:
| | |
| — | — |
| 组件 | 内容 |
| Filter | SELECT \* FROM \_\_InstanceCreationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32\_PerfFormattedData\_PerfOS\_System' |
| Consumer | powershell.exe -WindowStyle Hidden -enc |
| 触发逻辑 | 每 60 秒检查系统性能计数器(只要系统在运行就会触发) |
关键判断点:
-
Filter 的 Query 中是否包含 WITHIN 子句——定时触发
-
Consumer 的 CommandLineTemplate 是否指向 PowerShell/cmd/wscript/cscript
-
过滤器名称是否模仿合法名称(比如 SystemPerformanceMonitor、WindowsUpdateCheck)
跨命名空间排查
攻击者不一定只用 root\Subscription:
枚举所有命名空间
Get-WmiObject -Namespace root -Class __Namespace | Select Name
检查每个命名空间下的订阅
Get-WMIObject -Namespace “root\” -Class __EventFilter
六、其他隐蔽持久化手法
6.1 屏幕保护程序
reg query “HKCU\Control Panel\Desktop” /v SCRNSAVE.EXE
正常的 .scr 文件在 System32 下。如果指向其他路径——立即调查。
6.2 AppCertDLLs(API 调用劫持)
reg query “HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDLLs”
任何调用 CreateProcess / WinExec 等 API 的进程都会被拦截,加载指定的 DLL。这是 Ring 3 层最彻底的进程创建劫持。
6.3 Image File Execution Options(IFEO 调试器劫持)
查看可疑的 IFEO 调试器设置
reg query “HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options”
逐个检查是否有 Debugger 键值
攻击者可以对 sethc.exe(粘滞键)等系统工具设置 IFEO Debugger,实现按五次 Shift 反弹 cmd.exe 的经典技巧。
6.4 组策略脚本
reg query “HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System” /v RunLogonScriptSync
组策略登录/注销脚本在 gpedit.msc 中有对应条目,但也可以直接通过注册表配置
6.5 COM 劫持
攻击者替换系统中的 COM 对象注册,使得合法程序加载恶意 DLL:
查询被劫持的 COM 注册(需要基线对比)
reg query “HKLM\Software\Classes\CLSID” /s | findstr “InprocServer32”
COM 劫持排查需要基线对比——建议定期导出合法 COM 注册快照。
七、一页纸排查清单
□ HKLM\Run / RunOnce(4条路径 + WOW6432Node) □ HKCU\Run / RunOnce(2条路径) □ Winlogon Shell / Userinit □ AppInit_DLLs + LoadAppInit_DLLs □ BootExecute □ 启动文件夹(ProgramData + APPDATA) □ 计划任务(schtasks CSV → 过滤 Temp/AppData 路径 + 隐藏任务) □ 服务(非Microsoft + Auto启动 + 异常路径) □ svchost 托管服务 ServiceDll □ WMI 事件订阅(__EventFilter + __EventConsumer + __FilterToConsumerBinding) □ 屏幕保护程序(SCRNSAVE.EXE) □ AppCertDLLs □ IFEO 调试器劫持 □ 组策略脚本 □ COM 劫持(InprocServer32)
八、误报处理
持久化排查中最让人崩溃的不是找不到恶意项——是找出来一堆疑似项,分辨不出来哪个是恶意的。
几条经验:
1. 先跑基线:在干净的同版本 Windows 上导出一份自启动清单,作为对比
2. 看时间:可疑项的注册表 LastWriteTime 是否在攻击时间窗口内
3. 看签名:有微软签名的程序 ≠ 安全,但无签名的程序 + 异常路径 = 高危
4. 看路径:C:\Windows\System32\ 下的基本安全(除非被替换),C:\Users\*\AppData\ 下的需要重点关注
5. 交叉验证:同一程序是否同时出现在注册表自启动和计划任务中(攻击者常用多手法确保持久化)
自动化:Forensic Collector 的 persistence 模块自动采集上述全部注册表键值和计划任务,tasks 模块导出 schtasks 全量 CSV,auth 模块标注异常登录事件串联. 工具地址:https://github.com/Pik-sec/forensic-collector
本文覆盖 Windows XP 到 Windows 11 / Server 2025 全版本持久化机制。攻击技术在进化,但排查方法论不变——永远从注册表开始,到计划任务,再到 WMI。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Pik安全实验室 Pik安全实验室 Pik安全实验室《Windows 持久化排查实战手册:从注册表到 WMI 一网打尽》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论