TL;DR. ShimCache 位于 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache\AppCompatCache。Windows 在每个会话中都在内存里重建它,只有在 clean shutdown 时才把它刷新到 SYSTEM hive。硬重启会让最近的条目完全丢失。在你信任所读到的内容之前,先重放 SYSTEM.LOG1 和 SYSTEM.LOG2。
大多数 ShimCache 上的事故都源自同一个根因:分析师以为该缓存像日志文件一样更新。它不是。该缓存在系统运行时驻留于内存,磁盘上的副本只反映上一次 clean shutdown 时的状态。搞错这一点,你写出来的报告会说主机干净,而其实并非如此。
注册表路径
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache\AppCompatCache
末尾的 AppCompatCache 是一个 value,而不是子键。数据是一个单独的二进制 blob,其 schema 因 Windows 版本而异。XP、7、8、8.1 和 10/11 系列各自使用不同的布局。二进制格式详解 详尽介绍了现代 Windows 10/11 schema。
离线时,你取出 SYSTEM hive(位于 C:\Windows\System32\config\ 下的某个文件),把 parser 指向它。把 SYSTEM.LOG1 和 SYSTEM.LOG2 一并带上。Shimcache Parser 在浏览器里读取 SYSTEM hive,不上传,但它只接受这一个文件,不会重放日志。如果 hive 是 dirty 的,先用 Eric Zimmerman 的 rla.exe 把 .LOG1 和 .LOG2 重放进去(或在 Registry Explorer 中加载并保存清理后的 hive),再解析结果。
ControlSet 的陷阱
Windows 实际上维护多个 ControlSet,通常是 ControlSet001 和 ControlSet002。任意时刻只有一个处于激活状态,由 HKLM\SYSTEM\Select\Current 指示。CurrentControlSet 是激活那一个的运行时别名。在活动系统上它总是正确解析;离线时你必须自己处理。
一个站得住脚的 parser:
- 读取
HKLM\SYSTEM\Select\Current(一个 DWORD,通常是 1 或 2)。 - 遍历对应的
ControlSetXXX\Control\Session Manager\AppCompatCache\AppCompatCachevalue。 - 如果
Select\Current读不出,则回退为扫描ControlSet001和ControlSet002两者。
本工具、Eric Zimmerman 的 AppCompatCacheParser 以及 Mandiant 的 Shim Cache Parser 都会自动处理这种解析。自己造轮子风险自担。
Windows 实际何时写入
下面是把人绊倒的地方。Windows 运行期间,ShimCache 驻留在内存中。磁盘副本只在 clean shutdown 时被写入。因此:
- 硬重启、断电、BSOD 或在 hypervisor 层强制结束 VM,会销毁所有尚未持久化的条目。
- 使用
reg.exe或 RegRipper 的活体分诊读到的是之前已经持久化的 value,而不是当前正在内存里构建的缓存。 - Volatility 3 的
windows.shimcachemem插件针对 RAM dump 可恢复当前的内存缓存。这是从未 clean shutdown 的主机上获取当前会话条目的唯一方法。
如果你到达的是一台已经硬重启过的失陷机器,磁盘上的 hive 保存的是事件之前的缓存。攻击者在活动会话里运行的东西都没了,除非你也捕获了内存。佐证的故事通常必须来自 AmCache,它持续写入且能从同样的重启中幸存。
事务日志
SYSTEM.LOG1 和 SYSTEM.LOG2 保存尚未合并到主 hive 的注册表写入。任何健壮的 parser 都会在读取 ShimCache 之前重放这些日志。如果你只复制了 SYSTEM 而跳过了日志,那你就是在读一份过时的视图。这是最常见的采集错误。采集指南 介绍了安全获取这三者的方法。
快速检查清单
- ShimCache 的 value:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache\AppCompatCache。 - 由
HKLM\SYSTEM\Select\Current选定的活动 ControlSet。 - 存放在内存中,仅在 clean shutdown 时刷新。最近的活动需要用 AmCache 来佐证。
- 解析前务必重放
SYSTEM.LOG1和SYSTEM.LOG2。
延伸阅读
- Microsoft Learn: Registry hives:hive 文件与 ControlSet 的权威参考。
- Mandiant 的 ShimCacheParser:原始的 Python parser,适合作为格式参考。
- Velociraptor
Windows.Registry.AppCompatCache:在运行系统上的采集逻辑。