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 Run | 32 位程序视角的 HKLM | 64 位系统上 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 这类形态时,重点是还原它真正加载的文件,而不是先纠结进程名。