首页/安全/应急响应速查/Windows Run 注册表启动项

Windows Run 注册表启动项

经典自启位置:HKLM 与 HKCU 的 Run/RunOnce 键,外加 Wow6432Node;逐键导出核对,陌生值即嫌疑。

应急响应速查安全更新于 2026-10-13

Windows Run 启动项是什么

Run 与 RunOnce 是 Windows 最经典的自启位置:登录或开机时由系统读取注册表键下列出的命令并执行。它之所以成为恶意软件首选,是因为写入门槛低(HKCU 下普通用户即可写)、生效快、不需要额外组件,而且名字看起来像系统自带功能。排查的关键不是只看“有没有奇怪的名字”,而是把每个键值指向的实际文件路径、签名状态与写入时间核对清楚。

基本信息

系统级键HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 与 RunOnce
用户级键HKCU 同名路径;其他用户的 HKCU 对应各自的 NTUSER.DAT
32 位视图HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
策略键HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
权限要求读 HKLM 一般用户即可;写 HKLM 需管理员,写 HKCU 无需提权
读取工具PowerShell Get-ItemProperty、reg query/export、Sysinternals Autoruns

典型使用场景

  • 终端出现异常外联或进程后,核对登录自启项里是否有陌生条目
  • 钓鱼附件执行后的主机排查,确认是否已写入持久化
  • 做 Windows 主机基线,留存全量启动项供后续差异对比
  • 安全加固与合规检查时确认启动项中不存在无签名或临时目录程序
  • 清理前导出原始键值,作为处置证据与回滚依据

查询与导出启动项

查询与导出启动项
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run' | Format-List
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce' | Format-List
Get-ItemProperty 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run' | Format-List
Get-ItemProperty 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run' | Format-List
reg export 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run' D:\evidence\run_hklm.reg  # 先导出留证
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run' | Select-Object PSChildName, Property

键位置对照

位置生效范围注意点
HKLM Run所有用户登录时需要管理员权限写入,恶意条目出现即代表已提权
HKCU Run仅当前用户登录时普通用户可写,用户态投毒最常落在这里
HKLM Wow6432Node Run32 位程序视角的 HKLM64 位系统上 32 位安装程序会写这里,极易被漏查
RunOnce登录时执行一次后自动删除自删特性导致现场往往只剩痕迹,要同时查事件日志
Policies Explorer Run受组策略控制的启动项通常由管理员部署,出现陌生条目需核对策略来源

核对值指向的文件

核对值指向的文件
$items = Get-ItemProperty 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
$items.PSObject.Properties | Where-Object Name -notlike 'PS*' | ForEach-Object {
  $p = $_.Value -replace '"', ''
  Write-Output ('{0} => {1}' -f $_.Name, $p)            # 打印条目名与实际命令
}
Get-ChildItem 'C:\Users\*\.config' -ErrorAction SilentlyContinue   # 用户目录下的常见落点
Get-AuthenticodeSignature 'C:\路径\程序.exe' | Select-Object Status, SignerCertificate   # 看签名状态
64 位系统存在注册表重定向:32 位的 reg.exe 或 32 位程序访问 HKLM\SOFTWARE 时会自动映射到 Wow6432Node。用 64 位 PowerShell 查一遍、再用 32 位视角查一遍,两边结果不同是正常的。
取证顺序是先 reg export 导出原始键值再删项:注册表内容本身就是证据,删除后无法还原攻击者写的原始命令行与参数。
Run 键只是自启位置的一部分:计划的 Autoruns 会一并覆盖启动文件夹、服务、计划任务、WMI 订阅、IFEO 等十余类位置。排查如果只做 Run 键,容易得出“没有持久化”的错误结论。

其他常见自启位置

位置类型排查提示
启动文件夹文件用户级路径与 All Users 路径各有一份,放快捷方式或脚本
计划任务任务定义用 schtasks 导出 XML,看触发器与执行账号
Windows 服务服务配置服务被设为自动启动即可常驻,路径指向临时目录是强信号
Winlogon Userinit注册表键值被改成多个逗号分隔的命令属于典型手法
IFEO 调试器注册表键值给正常程序挂调试器实现劫持启动
WMI 事件订阅WMI 对象无文件持久化,需专门查询命令行为订阅事件

启动文件夹与服务核对

启动文件夹与服务核对
Get-ChildItem 'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp' -Force   # 公共启动文件夹
Get-ChildItem "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup" -Force     # 当前用户启动文件夹
Get-CimInstance Win32_Service | Select-Object Name, StartMode, PathName | Where-Object StartMode -eq 'Auto' | Format-Table -AutoSize
schtasks /query /fo LIST /v | Select-String -Pattern 'TaskName|Task To Run|Run As User' | Select-Object -First 60
条目值里出现引号包裹、路径含空格、或写成 rundll32、mshta、powershell -EncodedCommand 这类形态时,重点是还原它真正加载的文件,而不是先纠结进程名。

易错点

  • 只看 HKLM:用户级 HKCU 与各用户自己的 hive 同样能自启,漏查等于漏掉最常见的一类
  • 忽略 Wow6432Node:64 位系统上 32 位程序另有一份键,只查一处会漏条目
  • 对 RunOnce 抱着“执行完就没了”的想法跳过:自删特性反而说明它执行过,需要到事件日志与文件系统里找残留
  • 看到陌生条目直接删:不导出、不记录值名与数据,后续无法证明攻击者的原始命令行
  • 把名称奇怪但签名正常的条目一律当成恶意:要结合文件签名、存放路径与写入时间判断,避免误删业务组件

数据来源与参考

  • Microsoft Learn:Run 与 RunOnce 注册表键
  • MITRE ATT&CK T1547.001

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌