服务安装日志(7045)判读
Windows 系统日志中由服务控制管理器(Service Control Manager)写入的 7045 事件记录新服务安装,字段包括服务名、映像路径(ImagePath)、服务类型、启动类型与运行账号。异常服务是主机持久化的典型痕迹:映像路径位于用户目录、临时目录,或指向无签名的可执行文件时最需要关注。配套事件能补齐状态变化:7036 记录服务启停状态变化,7040 记录启动类型被修改,7000/7009 记录启动失败。
基本信息
| 适用平台 | Windows 7/10/11 与 Windows Server 2008 R2 及以上 |
|---|---|
| 日志位置 | 系统日志(LogName=System),提供程序为 Service Control Manager |
| 核心事件 | 7045 安装新服务、7036 状态变化、7040 启动类型变更、7000/7009 启动失败 |
| 关键字段 | ServiceName、ImagePath、ServiceType、StartType、AccountName |
| 当前状态核验 | sc qc <服务名>、Get-CimInstance Win32_Service、注册表 Services 键 |
典型使用场景
- 发现被植入的常驻服务:事件窗口内出现非同期的服务安装记录
- 定位载荷路径:ImagePath 直接给出可执行文件位置,便于计算哈希
- 区分软件安装带来的正常服务与人为创建的服务:结合发布窗口与签名信息
- 还原服务的启动与失败过程,判断载荷是否真正运行过
- 处置前确认服务是否仍在运行与自启动,决定禁用与清理顺序
筛查与核验
筛查与核验
# 1) 拉出服务安装事件
Get-WinEvent -FilterHashtable @{LogName='System'; Id=7045} -MaxEvents 40 |
Select-Object TimeCreated, Message | Format-List
# 2) 只看映像路径,按路径归组(用户目录与临时目录优先)
Get-WinEvent -FilterHashtable @{LogName='System'; Id=7045} -MaxEvents 200 |
ForEach-Object { ($_ | Select-String -Pattern 'Service file name:(.+)').Matches.Value }
# 3) 核验当前配置与状态
sc.exe qc SuspiciousSvc
Get-CimInstance Win32_Service | Where-Object { $_.PathName -match 'Users|Temp|ProgramData' } |
Select-Object Name, PathName, StartMode, State, StartName
# 4) 配套看启停与失败记录
Get-WinEvent -FilterHashtable @{LogName='System'; Id=7036,7040,7000,7009} -MaxEvents 40 |
Select-Object TimeCreated, Id, Message事件与字段对照
| 项 | 含义 | 判读要点 |
|---|---|---|
| 7045 | 安装新服务 | 仅在新装时记录,事件窗口外的既往服务不会出现 |
| 7036 | 服务状态变化 | 确认服务是否真的启动过 |
| 7040 | 启动类型变更 | 从手动改成自动是常见的持久化手法 |
| 7000 / 7009 | 服务启动失败 | 失败信息含路径与错误码,可佐证载荷状态 |
| ImagePath | 服务映像路径 | 用户目录、临时目录、无签名程序优先深挖 |
| StartType / AccountName | 启动类型与运行账号 | 自动启动 + LocalSystem 组合风险最高 |
软件安装过程也会写入 7045:判读时要结合发布窗口、程序签名与安装目录,不能仅凭“服务被安装”就下结论。
直接修改注册表 Services 键创建的服务不一定产生 7045(该事件主要覆盖通过服务控制管理器安装的路径),因此必须同时核对注册表服务键及其最后写入时间。