TL;DR. ShimCache 位于 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache\AppCompatCache。Windows 在每次会话中于内存里重建它,并 仅在干净关机时 写入 SYSTEM 配置单元 —— 强制重启可能完全丢失最近的条目。别忘了重放 SYSTEM.LOG1 / SYSTEM.LOG2。
很多 ShimCache 相关的事故都源于同一个误解:调查人员以为缓存像日志文件那样持续更新,条目一发生就被写入磁盘。事实并非如此。本文准确地讲清 ShimCache 究竟在哪里、Windows 又在何时往里面写。
注册表中的路径
ShimCache 位于 SYSTEM 配置单元中,路径为:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache\AppCompatCache
最后一个 AppCompatCache 是一个 值,并非子键。其数据是单一的二进制 blob,结构因 Windows 版本而异 —— XP、7、8、8.1、10 与 11 各自使用略有不同的布局。二进制格式讲解 对现代 Windows 10/11 的 schema 做了详细说明。
要离线读取相同的值,提取 SYSTEM 配置单元(位于 C:\Windows\System32\config\ 下的文件之一),然后用解析器去读它。Shimcache Parser 正是这么做的 —— 在你的浏览器里完成,不向任何地方上传文件。
「当前」ControlSet 的小窍门
Windows 实际上会维护多个 ControlSet(ControlSet001、ControlSet002,有时更多)。任一时刻只有一个是 活动 集,由 HKLM\SYSTEM\Select\Current 指出。CurrentControlSet 是指向当前活动 ControlSet 的运行时别名。
离线解析时应当:
- 读取
HKLM\SYSTEM\Select\Current(DWORD,通常为 1 或 2), - 遍历对应的
ControlSetXXX\Control\Session Manager\AppCompatCache\AppCompatCache值, - 若
Select\Current读不到,则回落到ControlSet001与ControlSet002依次尝试。
大多数解析器(包括本工具)会自动处理这一切。
缓存何时被写入
下面这一点最出人意料:在系统运行期间,ShimCache 存活于 内存 中。Windows 只在 干净关机时 把它写入 SYSTEM 配置单元。因此:
- 强制重启、断电、蓝屏,或在 hypervisor 层杀掉 VM,都会丢弃 所有尚未持久化的近期记录。
- 在线分诊(用
reg.exe或 RegRipper)看到的是 此前 持久化的 ShimCache,而不是 正在内存里构建 的那一份。 - 内存取证(如 Volatility 的
shimcachemem插件)可以在丢失之前回收 当前 在内存中的缓存。
正是这一时序,导致对配置单元做静态分析时常常错过最新活动;也正因如此,调查人员会转向持续写入的 AmCache 来填补空白(详见 ShimCache 与 AmCache)。
注册表事务日志呢?
SYSTEM 配置单元会伴随事务日志文件(SYSTEM.LOG1、SYSTEM.LOG2)。它们可能保存了尚未刷入主配置单元的写入。健壮的离线解析器会在读取 ShimCache 前先重放这些日志;如果你自行实现解析,请考虑这一点,或者直接使用具备该能力的解析器。
速查清单
- ShimCache 值:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache\AppCompatCache - 活动 ControlSet 由
HKLM\SYSTEM\Select\Current选择 - 仅在干净关机时落盘 —— 最近活动需结合 AmCache 佐证
- 解析前重放
SYSTEM.LOG*以获得最新状态
延伸阅读
- Microsoft Learn — Registry hives —— 配置单元与 ControlSet 的官方参考。
- Mandiant 的 ShimCacheParser —— 原始 Python 解析器,是格式参考。
- Velociraptor
Windows.Registry.AppCompatCache—— 在线系统采集逻辑。