Prefetch 运行时间线索
Prefetch 是 Windows 为加快程序启动而维护的缓存:每个被运行过的可执行文件对应一个 .pf 文件,文件名里带可执行文件名与一段路径哈希,文件内部保存运行次数与最近若干次运行时刻。它是程序执行时间线里最直接的来源之一,取值要以专用工具的解析结果为准,而不是靠目录时间猜。
基本信息
| 位置 | C:\Windows\Prefetch\ 下的 *.pf 文件 |
|---|---|
| 命名规律 | <可执行文件名>-<路径哈希>.pf |
| 内部信息 | 运行次数、最近若干次运行时刻、加载模块与涉及目录 |
| 解析工具 | PECmd.exe(Eric Zimmerman)批量导出为 CSV |
| 存在条件 | 首次运行后才生成;被清理或系统策略禁用时不存在 |
典型使用场景
- 确认某个程序是否真的在该主机上被执行过
- 取回程序最近几次运行时刻,搭建执行时间线的骨架
- 从引用路径推断程序运行时的目录与被访问的文件
- 验证样本只是被下载、尚未执行的说法
- 与缓存执行痕迹、用户活动记录互证执行事实
采集与解析
采集与解析
Get-ChildItem C:\Windows\Prefetch -Filter *.pf | Measure-Object # 先统计 .pf 数量
Get-ChildItem C:\Windows\Prefetch -Filter *.pf | Sort-Object LastWriteTime | Select-Object -Last 10 Name, LastWriteTime
PECmd.exe -d C:\Windows\Prefetch --csv C:\out\prefetch # 批量解析为 CSV
PECmd.exe -f C:\Windows\Prefetch\<名称>.pf # 解析单个文件
Import-Csv C:\out\prefetch\*.csv | Sort-Object 'Last Run' | Select-Object -Last 10 # 按运行时间排序关键字段读法
| 字段 | 含义 | 解读要点 |
|---|---|---|
| Executable Name | 被执行的可执行文件名 | 与文件名中的名称应一致 |
| Run Count | 累计运行次数 | 部分版本存在计数上限,接近上限时谨慎解读 |
| Last Run Times | 最近多次运行时刻 | 通常保存若干条,按时间排列 |
| Volume Information | 运行时所在卷与卷信息 | 推断程序从哪个卷启动 |
| Directories Referenced | 运行期间访问过的目录 | 用于关联被读取的文件 |
并非所有执行过的程序都有对应的 Prefetch:首次运行才会生成,被清理过或位于网络位置的可执行文件可能没有条目;服务器系统在默认策略下常禁用该功能,缺少条目不能直接证明程序未执行。
目录条目的写入时间只是该文件被更新的时刻,不能等同于最近一次运行时间,也不能反映运行次数;结论要建立在大写解析工具从文件内部读出的字段上,两者不一致时以解析结果为准。