清理要有顺序
自启项清理按固定顺序走:导出清单 → 禁用 → 观察 → 删除 → 复验。直接删除会同时丢掉攻击者写入的参数,也无法识别「删掉又被重新拉起」的守护关系。
覆盖面要全
启动链不止 Run 键:计划任务、服务、WMI 订阅与 IFEO 都会拉起程序。Run 键常见的三个位置是 HKLM、HKCU 与 Wow6432Node,逐处都要看,只清一处等于放它回来。
基本信息
| 清理顺序 | 导出清单→禁用→观察→删除→复验 |
|---|---|
| 主要位置 | Run 键(HKLM/HKCU/Wow6432Node)、计划任务、服务 |
| 易漏位置 | WMI 订阅、IFEO Debugger、启动文件夹 |
| 导出方式 | reg export、schtasks /query /xml、Get-ScheduledTask |
| 观察期 | 禁用后观察是否被重新启用或拉起 |
| 权限要求 | 修改 HKLM 与服务配置需管理员 |
典型使用场景
- 清理已确认的持久化项
- 判断多个持久化点之间的守护关系
- 验证清理是否彻底
- 处理「删了又回来」的现象
- 收尾时输出清理前后对照表
导出清单与枚举自启项
导出清单与枚举自启项
Get-ScheduledTask | Where-Object { $_.State -ne 'Disabled' } | Select-Object TaskName, TaskPath | Format-Table -AutoSize
schtasks /query /fo LIST /v | Select-String -Pattern 'TaskName|Task To Run' | Select-Object -First 40
Get-ItemProperty 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Run'
Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Run'
reg export "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" C:\evidence\run_hklm.reg /y
Get-Service | Where-Object { $_.StartType -ne 'Disabled' } | Select-Object Name,DisplayName,StartType输出逐列读法
| 字段 | 含义 | 正常/异常 |
|---|---|---|
| TaskName / TaskPath | 任务名与所在路径 | 不在系统默认任务目录下的需重点核查 |
| Task To Run | 任务实际执行的命令 | 指向临时目录或脚本宿主即为可疑 |
| Run 键值 | 启动时执行的命令 | 值与键名不匹配时逐个解释 |
| StartType | 服务启动类型 | 自动启动的陌生服务需核对用途 |
先禁用后删除:禁用期间观察是否被其他项重新拉起,可识别守护关系;删除前导出 XML 或注册表留档,便于回溯攻击者配置。
RunOnce 键与启动文件夹同样会执行启动命令:RunOnce 在执行后通常自动删除,容易出现「只剩行为、没有配置」的现象,需要结合事件日志判断。
禁用、删除与复验
禁用、删除与复验
Disable-ScheduledTask -TaskName 'SuspiciousTask' -TaskPath '\'
Remove-ItemProperty -Path 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Run' -Name 'Suspicious' -ErrorAction SilentlyContinue
Get-ScheduledTask | Where-Object { $_.TaskName -match 'Suspicious' } | Select-Object TaskName,State
Get-ItemProperty 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Run'清理后的复验
- 重新导出四类清单与清理前对比
- 重启后确认无异常进程与服务
- 检查事件日志中是否出现日志被清除的记录
- 确认没有新的同名自启项出现
清理顺序背后的原因
- 先导出是为了留下攻击者原始配置作为证据
- 先禁用是为了观察是否存在守护与互相拉起关系
- 后删除是为了避免破坏仍可观察的行为链条
- 最后复验是为了确认没有残留与替代项