TL;DR. ShimCache 证明一个文件曾存在于磁盘上。AmCache 证明它被执行过,并以 SHA-1 进行识别。ShimCache 只在 clean shutdown 时刷新。AmCache 持续写入。两个都要取。它们是共同证人,不是替代品。
我带过的每位初级分析师都会在第一周问同一个问题:"既然 AmCache 更好,为什么我们还要取 ShimCache?"答案是它们记录不同的事件、在不同的时间,并有不同的失败模式。把它们当作互相替代,你写出来的报告将在第一次技术评审时就崩塌。
一览对比
| ShimCache | AmCache | |
|---|---|---|
| 注册表位置 | HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache | C:\Windows\AppCompat\Programs\Amcache.hve |
| 容量 | 最多约 1,024 条 | 数千条,没有固定上限 |
| 每条记录的数据 | 路径、文件 mtime、(遗留)执行 flag | 路径、SHA-1、大小、publisher、安装日期,以及更多 |
| 何时写入 | 仅在 clean shutdown 时 | 持续写入,以及在 Appraiser 任务运行时 |
| 硬重启后是否存活 | 否,最近的条目会丢失 | 是,已经在磁盘上 |
| 最适合 | 证明文件曾存在于磁盘上 | 证明文件运行过,并用哈希识别 |
ShimCache 占优的场景
该缓存在文件被检查时触发,而非在执行时触发。这种敏感性使它成为对付攻击者短暂投放后再抹除的文件的更好证人。一个在 14:33 落到 C:\Users\Public\ 又在 14:35 被删除的二进制,如果在这两分钟内 Windows 出于任何原因接触过它,仍可能出现在 ShimCache 中。
该缓存还携带文件的 $STANDARD_INFORMATION mtime。该时间戳不是执行时间,而是文件的属性,这意味着它在保留元数据的重命名和复制中都能存活。这对于跨主机聚类相关构建非常有用。在时间线上排序事件却没有用,正如 ShimCache 时间戳实际意味着什么 一文所述。
AmCache 占优的场景
向 AmCache 提问"这个二进制是否真的运行过,到底是哪一个二进制?"你会得到真正的答案。Amcache.hve 下每条 InventoryApplicationFile 都带有 SHA-1 哈希、文件大小、publisher、签名状态以及每个文件的 LastWrite(作为"Appraiser 何时注意到这个"的代理)。这就足以转向 VirusTotal、威胁情报,或资产中的其他主机进行追查,即使磁盘上的文件早已消失。
它的持久化模型也更胜一筹。AmCache 由 compattelrunner.exe 按计划和在安装器事件时刷新。硬重启和 BSOD 不会像对待 ShimCache 那样悄然销毁最近的活动。把 Amcache.hve 连同 Amcache.hve.LOG1 和 Amcache.hve.LOG2 一并取出,重放任何进行中的事务。
联合使用
把它们当作有着不同盲点的共同证人。
- 两者都存在,路径匹配。 强有力的执行证据。用 AmCache 提供基于哈希的身份,用 ShimCache 确认该文件曾在该路径上存在。
- 仅有 ShimCache。 文件存在过,执行未被证明。寻找 Prefetch、EVTX 或 BAM/DAM 来佐证。
- 仅有 AmCache。 自该活动以来主机未曾 clean shutdown。ShimCache 从未刷新。如果机器还在运行,取一份 RAM dump;内存中的 ShimCache 就在那里。
- 两者都没有,但怀疑有活动。 检查 Appraiser 任务 是否运行过。一个被禁用的 Compatibility Appraiser 会产生看似空白的 AmCache hive。
技术布局细节见 Windows 10/11 二进制格式详解。如果你想现在就在不安装任何东西的情况下解析一份 hive,将其拖入 Shimcache Parser。它完全在浏览器内运行。
延伸阅读
- Eric Zimmerman 的 AppCompatCacheParser:C# 参考实现。
- Velociraptor 的
Windows.Registry.AppCompatCache工件:在运行系统上的采集逻辑。 - Mehrnoush 的 ShimCache & AmCache forensic analysis:以案例驱动的讲解。