TL;DR. ShimCache 证明文件曾在磁盘上存在;AmCache 证明它被执行过,并以 SHA-1 标识。ShimCache 仅在干净关机时才落盘 —— AmCache 持续写入。两者都要采集;它们是相互印证的共同证人,不是替代品。
ShimCache 与 AmCache 是 Windows 程序执行调查中最常被引用的两类基于注册表的证据。它们听起来可以互换,其实并不是。本文是一份快速参考,帮助你根据想回答的问题选择该看哪一个。
概览
| ShimCache | AmCache | |
|---|---|---|
| 位置 | HKLM\SYSTEM\…\AppCompatCache | C:\Windows\AppCompat\Programs\Amcache.hve |
| 容量 | 最多 1,024 条 | 数千条,无固定上限 |
| 每条记录 | 路径、mtime、(旧版)执行标志 | 路径、SHA-1、大小、发布者、安装日期等更多字段 |
| 写入时机 | 仅在关机时 | 持续写入(并按计划间隔写入) |
| 能否抵御崩溃 | 否 — 最近记录会丢失 | 能 — 已在磁盘上 |
| 适用于 | 证明文件曾在磁盘上 存在过 | 证明文件曾 被执行,并通过哈希精确识别 |
ShimCache 占优势的时候
ShimCache 会为 Windows 仅仅因兼容性原因 检查过 的可执行文件保留记录。这一点很灵敏:攻击者投放后立刻删除的二进制文件,仍可能在 ShimCache 中留下痕迹。如果你的问题是 「这个文件曾经在这台主机上存在过吗?」,ShimCache 就是你的盟友。
它也是两者中唯一记录文件 $STANDARD_INFORMATION mtime 的证据。该时间戳 并非 执行时刻(这是一个常见误读,另一篇文章 专门讨论),但它把文件身份锚定在时间轴上。
AmCache 占优势的时候
当问题是 「这个文件真的被执行了吗?又是哪一个文件?」 时,应当使用 AmCache。每条 AmCache 记录都包含 SHA-1 哈希、文件大小、发布者、安装日期 —— 足以毫无歧义地识别一个二进制文件,即使磁盘上的文件后来被替换或抹除。
AmCache 还更具持久性。由于 Windows 是持续写入而不仅仅在关机时刷新,发生在崩溃或被硬重启系统上的近期活动,更可能保留在 AmCache 中而非 ShimCache 中。
如何配合使用
实践中可以把它们当作 互证:
- 在 两者 中都有条目、路径一致且 AmCache 时间戳较新,这是执行的强证据。
- 仅在 ShimCache 中出现,说明文件至少在某个时刻曾在磁盘上。在下结论说执行之前,去找其它佐证(Prefetch、AmCache、事件日志)。
- 仅在 AmCache 中出现,而 Prefetch 与 ShimCache 都没有,通常意味着自从该活动以来主机没有干净关机过 —— ShimCache 还没来得及落盘。
关于 ShimCache 二进制布局的技术细节,请见 解析 ShimCache:Windows 10 与 11 的二进制格式。如果想立刻分析一个注册表配置单元而不安装任何工具,可使用 Shimcache Parser —— 全部在你的浏览器内运行。
延伸阅读
- Eric Zimmerman 的 AppCompatCacheParser —— 参考 C# 实现。
- Velociraptor 的
Windows.Registry.AppCompatCache工件 —— 在线系统采集逻辑。 - ShimCache & AmCache forensic analysis (Mehrnoush) —— 含案例的详细分析。