ShimCache 存储在哪里?什么时候写入?

约 1 分钟阅读

TL;DR. ShimCache 位于 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache\AppCompatCache。Windows 在每次会话中于内存里重建它,并 仅在干净关机时 写入 SYSTEM 配置单元 —— 强制重启可能完全丢失最近的条目。别忘了重放 SYSTEM.LOG1 / SYSTEM.LOG2

很多 ShimCache 相关的事故都源于同一个误解:调查人员以为缓存像日志文件那样持续更新,条目一发生就被写入磁盘。事实并非如此。本文准确地讲清 ShimCache 究竟在哪里、Windows 又在何时往里面写。

ShimCache:内存写入与磁盘落盘的时序

注册表中的路径

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(ControlSet001ControlSet002,有时更多)。任一时刻只有一个是 活动 集,由 HKLM\SYSTEM\Select\Current 指出。CurrentControlSet 是指向当前活动 ControlSet 的运行时别名。

离线解析时应当:

  1. 读取 HKLM\SYSTEM\Select\Current(DWORD,通常为 1 或 2),
  2. 遍历对应的 ControlSetXXX\Control\Session Manager\AppCompatCache\AppCompatCache 值,
  3. Select\Current 读不到,则回落到 ControlSet001ControlSet002 依次尝试。

大多数解析器(包括本工具)会自动处理这一切。

缓存何时被写入

下面这一点最出人意料:在系统运行期间,ShimCache 存活于 内存 中。Windows 只在 干净关机时 把它写入 SYSTEM 配置单元。因此:

  • 强制重启、断电、蓝屏,或在 hypervisor 层杀掉 VM,都会丢弃 所有尚未持久化的近期记录
  • 在线分诊(用 reg.exe 或 RegRipper)看到的是 此前 持久化的 ShimCache,而不是 正在内存里构建 的那一份。
  • 内存取证(如 Volatility 的 shimcachemem 插件)可以在丢失之前回收 当前 在内存中的缓存。

正是这一时序,导致对配置单元做静态分析时常常错过最新活动;也正因如此,调查人员会转向持续写入的 AmCache 来填补空白(详见 ShimCache 与 AmCache)。

注册表事务日志呢?

SYSTEM 配置单元会伴随事务日志文件(SYSTEM.LOG1SYSTEM.LOG2)。它们可能保存了尚未刷入主配置单元的写入。健壮的离线解析器会在读取 ShimCache 前先重放这些日志;如果你自行实现解析,请考虑这一点,或者直接使用具备该能力的解析器。

速查清单

  • ShimCache 值:HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache\AppCompatCache
  • 活动 ControlSet 由 HKLM\SYSTEM\Select\Current 选择
  • 仅在干净关机时落盘 —— 最近活动需结合 AmCache 佐证
  • 解析前重放 SYSTEM.LOG* 以获得最新状态

延伸阅读

相关文章