TL;DR. 在 Windows 运行时,你不能 copy C:\Windows\System32\config\SYSTEM。该文件被锁定。在活体主机上使用 FTK Imager、KAPE、reg save、VSS snapshot 或 Velociraptor。死盘工作时则从挂载的离线磁盘直接读取。复制原始文件时,务必一并取 SYSTEM.LOG1 和 SYSTEM.LOG2。否则你读到的就是过时的数据。reg save 则不需要它们。
在收到的证据中我看到的最常见的采集错误是分析师复制了 SYSTEM 却跳过了事务日志。其次最常见的是分析师在活体主机上尝试 xcopy,看到"该进程无法访问文件,因为它正在被另一个进程使用",然后只能去找一份三天前的 EDR 收集副本。这两种情况都不需要发生。挑一个方法,用对它,然后继续往下走。
为什么不能直接复制
每当 Windows 在运行时,内核以独占访问的方式持有 SYSTEM hive。普通的 copy 会返回访问被拒错误。即便你绕过锁读到字节,正在运行的 OS 也会把最近的注册表写入保留在内存里,直到下一次 clean shutdown,这意味着最有用的 ShimCache 条目并不在你刚抓到的文件里。在你决定使用哪种方法之前,存储与刷新模型 值得一读。
你的目标无非以下之一:
- 在运行中的主机上干净地绕过锁(raw NTFS、VSS 或取证级复制)。
- 从挂载的离线磁盘映像或暂停的 VM 直接读取该文件。
- 从 RAM dump 中恢复内存副本。这是从活动会话中获取条目的唯一方法。
方法 1:死盒或挂载的离线磁盘
最简单的路径。关机或以只读方式挂载然后复制:
<盘符>:\Windows\System32\config\SYSTEM
<盘符>:\Windows\System32\config\SYSTEM.LOG1
<盘符>:\Windows\System32\config\SYSTEM.LOG2
三个文件都要。一个健壮的 parser 会在读取主 hive 之前重放 .LOG1 和 .LOG2,这样你就不会错过尚未合并的写入。跳过它们,你读到的就是过时视图。
方法 2:活体系统、取证级复制
有几款工具能绕过这把锁,方式各不相同:FTK Imager 和 KAPE 在卷一级读取文件,reg save 通过注册表 API,esentutl /vss 或 VSS snapshot 则从卷影副本中读取:
- FTK Imager。 GUI,免费。"Obtain Protected Files" → "Custom" → 选择
SYSTEM、SYSTEM.LOG1、SYSTEM.LOG2。输出到外部驱动器。 - KAPE。 命令行,可脚本化。
RegistryHivestarget 会拉取所有相关 hive 以及日志:kape.exe --tsource C: --target RegistryHives --tdest C:\out reg save。 Windows 内置,需要以管理员身份运行的命令提示符。它让内核写出已加载的 hive,因此结果干净、一致,不需要事务日志。如果你想要原始文件,esentutl /y /vss会从临时卷影副本中复制它(对SYSTEM.LOG1和SYSTEM.LOG2再各运行一次):
不要在活体系统上使用reg save HKLM\SYSTEM C:\out\SYSTEM.hiv /y esentutl /y C:\Windows\System32\config\SYSTEM /vss /d C:\out\SYSTEMrobocopy /B。备份模式绕过的是文件 ACL,而不是内核对已加载 hive 的独占锁,因此复制会以共享冲突失败。把它留给挂载的镜像或卷影副本,例如镜像挂载为E:时使用robocopy E:\Windows\System32\config C:\out SYSTEM SYSTEM.LOG1 SYSTEM.LOG2 /B。- VSS snapshot。 一份可读取的时间点卷影副本。当你需要一致视图又不能关机时很有用。
vssadmin create shadow只能在 Windows Server 上使用;在客户端系统上,esentutl /y ... /vss(见上文)会替你创建并删除快照,或者在管理员 PowerShell 中用Invoke-CimMethod -ClassName Win32_ShadowCopy -MethodName Create -Arguments @{Volume='C:\'}创建。
这四种方法都能产出可用的副本。FTK Imager 和 KAPE 是评审人员期望在报告方法学部分看到引用的工具。reg save 无需安装、在紧急情况下能用;请在报告中注明它写出的是 hive 的当前内容,而不是文件的逐字节副本,因此已删除的单元和 slack 空间不会被保留。
方法 3:内存映像
磁盘上的 hive 只包含上一次 clean shutdown 时持久化的条目。在自事件以来未曾干净重启的主机上,最近的条目仅存在于内存中。
用 WinPmem、Magnet RAM Capture 或 AVML 捕获内存。然后要么提取 SYSTEM hive,要么用 Volatility 3 直接拉取 ShimCache:
# 提取注册表 hive
vol -f memory.raw windows.registry.hivelist
vol -f memory.raw windows.registry.hivedump --offset <addr>
# 或者跳过 hive,直接从内存读取 ShimCache
vol -f memory.raw windows.shimcachemem
从内存转储中提取 ShimCache 对此有更深入的介绍,包括 Velociraptor 的活体采集路径。
方法 4:规模化的活体分诊
Velociraptor 通过直接 NTFS 访问读取被锁定的 hive,并将其返回以供离线分析。要在整个舰队范围内采集,请使用 RegistryHivesSystem target 采集 Windows.Triage.Targets(较旧的服务器:Windows.KapeFiles.Targets 配合 RegistryHives)。它会连同事务日志一起取回 SYSTEM hive;下载采集 ZIP 后离线解析。
关于 ShimCache 之外更广泛的注册表分诊,见 registry parser。
别跳过事务日志
待处理的写入在 SYSTEM.LOG1 和 SYSTEM.LOG2 中保存直至下一个 checkpoint。这部分增量可能恰好包含你最关心的条目。Eric Zimmerman 的 AppCompatCacheParser 会自动重放日志,但前提是日志与 hive 放在一起。Mandiant 的 Shim Cache Parser 和本工具不会重放任何日志:它们按原样读取主 hive 文件。使用它们时,先用 Eric Zimmerman 的 rla.exe(Registry Log Applier)或 Registry Explorer 重放日志,再解析清理后的 hive。
如果你几个月前采集了 hive 却没有日志,想知道少了什么:答案是"最有意思的那一块"。可能的话,重新采集。
然后解析它
把 SYSTEM hive 拖入 Shimcache Parser。它只接受这一个文件;如果 hive 是 dirty 的,先用 rla.exe 或 Registry Explorer 把 .LOG1 和 .LOG2 重放进去。它完全在你的浏览器中运行,没有上传步骤,并支持从 XP 到 Windows 11 的所有 Windows 版本。格式细节见 Windows 10/11 二进制格式参考。
延伸阅读
- Microsoft Learn: Registry hives:hive 文件和事务日志的官方参考。
- Eric Zimmerman 的 KapeFiles:用于系统化采集的 Targets 和 Modules。
- Velociraptor
Windows.Registry.AppCompatCache:活体内存采集。 - Volatility 3 文档:从内存侧提取 hive。