ShimCache vs Prefetch:哪个能证明程序运行过?

约 2 分钟阅读

TL;DR. Prefetch 是带有运行次数和运行时间的真正执行证据。ShimCache 只能证明文件存在过并被检查过。如果你需要回答"它运行过吗,何时?",先去找 Prefetch。如果 Prefetch 被禁用或被清除,ShimCache 就成为你的存在性后备证人。

二者经常被拿来比较,因为它们都浮现"Windows 主机上的程序"。它们并不是同一种证据。把它们当作可互换会得出错误结论。下面是它们的对决。

一览对比

ShimCachePrefetch
位置HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCacheC:\Windows\Prefetch\*.pf
它证明的是什么文件存在过且被检查过文件被执行过
运行次数否是
运行时间戳否(只有文件 mtime)是,最近 8 次运行时间
引用的文件否是,加载的 DLL 和数据文件
何时写入仅在 clean shutdown 时执行后约 10 秒内
工作站 SKU 默认是是
服务器 SKU 默认是通常被禁用
容量最多约 1,024 条Win8+ 上 1,024 个 .pf 文件

Prefetch 占优的地方

Prefetch 是更强的执行工件,无须多言。每个 .pf 文件都给你最后运行时间(Windows 8+ 上最多八次)、总运行次数,以及该进程加载的文件列表。这足以断言"该二进制在这些时刻执行过",而 ShimCache 永远做不到,因为它唯一的时间戳是文件的最后修改时间,不是执行时间。

加载模块列表对分诊也是金子:一个 .pf 显示某个 Word 进程加载了 WINWORD.EXE 加 MSO.DLL 再加来自 \AppData\ 的可疑 DLL,这就是恶意加载项的快速判读。Eric Zimmerman 的 PECmd 是标准 parser。如果想自己造,Prefetch parser 介绍了格式。

ShimCache 占优的地方

Prefetch 有一个致命弱点:在服务器、针对 SSD 调优的镜像,以及攻击者(EnablePrefetcher = 0)那里都经常被禁用。它也会被清理工具主动删除。相比之下 ShimCache 总是开着,并且足够敏感,能记录下一个被投放后还没运行就被删除的二进制。

当 Prefetch 是空的时候,ShimCache 通常仍能回答"该文件是否曾接触过这台主机?"。完整推理见 ShimCache 能否证明程序被执行过。

该缓存还能捕获 Prefetch 永远看不到的文件:

  • 在完成进程初始化之前就崩溃的二进制。
  • Windows 出于兼容性检查过、但用户并未真正启动的文件。
  • 在 Prefetch 决定写出一个 .pf 之前就从网络共享上运行的可执行文件。

如何配合使用

  • 两者都在,路径匹配。 强力的执行证据。把 Prefetch 的运行时间当作事件时间线。把 ShimCache 的 mtime 仅用于锚定文件身份。
  • 只有 Prefetch。 执行已被证明。ShimCache 可能只是还没刷新(它只在关机时写入,见 ShimCache 存放在哪里)。
  • 只有 ShimCache。 文件存在过且被检查过。在没有佐证的情况下不要声称执行。拉取 AmCache、BAM 和 EVTX。完整矩阵见 工件参考。
  • 都没有,但你怀疑发生过执行。 寻找反取证。Prefetch 被删除加上 ShimCache 缺少刷新本身就是一项发现,在 ShimCache 反取证 中有介绍。

要在不安装任何东西的情况下读取 ShimCache 一侧,把一份 SYSTEM hive 拖入 Shimcache Parser。完全在浏览器内。

延伸阅读

相关文章