用 Python 解析 Windows Prefetch 文件:执行历史重建与可疑程序识别实战指南
2026/9/10 1:40:47 网站建设 项目流程

用 Python 解析 Windows Prefetch 文件:执行历史重建与可疑程序识别实战指南

【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATT&CK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF & MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI & 20+ platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills

导读

Windows Prefetch(预读取)文件(.pf)是数字取证与应急响应中最有价值、也最容易被忽视的痕迹之一:它记录着系统中每个可执行程序的启动时间、运行次数、加载的 DLL 以及访问过的目录。本文基于 Anthropic-Cybersecurity-Skills 仓库中的 analyzing-windows-prefetch-with-python 技能,系统讲解如何使用windowsprefetchPython 库解析 Prefetch 文件,重建程序执行时间线、识别被重命名或伪装(masquerading)的可执行文件,并在应急响应中快速圈定可疑程序(如 mimikatz、psexec 等攻击工具)。读完本文,你将掌握一套可落地的 Prefetch 取证分析流程,并能直接运行仓库提供的 prefetch_analyzer.py 分析脚本产出结构化 JSON 报告。

为什么 Prefetch 文件是执行痕迹的“金矿”

Windows 默认在C:\Windows\Prefetch\目录下为高频运行的程序创建.pf文件,其中记录了:

  • 可执行文件名(如POWERSHELL.EXE
  • 运行次数(run count)
  • 最后执行时间戳,以及(按版本不同)最多 8 次的历史执行时间
  • 加载的 DLL 与访问过的文件/目录列表(prefetch 内部记录的 resources)
  • 卷信息(卷名、序列号、创建时间)

这份数据对应急响应的价值在于:它不依赖 EDR,也不需要复杂代理,只要取证镜像或文件系统副本中存在 Prefetch 目录,就能还原“某台机器上到底跑过什么”。因此它常被用于:

  • 调查被重命名或伪装的可执行文件(文件名与加载资源不符);
  • 验证可疑程序的执行时间线,与其他证据(EVTX 日志、AmCache、ShimCache)交叉印证;
  • 猎捕横向移动与恶意软件执行模式,例如攻击者在C:\Windows\TempC:\Users\...\AppData\Local\Temp下运行工具的行为。

该技能在 SKILL.md 中被映射到多个 MITRE ATT&CK 技术点:T1036.005(伪装:合法名称或位置的匹配)、T1070.004(防御规避:文件删除/日志清除)、T1070(防御规避:指示器移除)、T1003.001(凭据获取:LSASS 内存转储)、T1057(发现:进程发现),同时对应 NIST CSF 2.0 的 RS.AN-03(分析)、DE.AE-02(异常事件分析)、RS.MA-01(事件报告)能力项,可用于验证检测覆盖范围与构建检测规则。

何时使用这套方法

根据技能文档 SKILL.md,以下场景优先启用本技能:

  • 调查需要“用 Python 分析 Windows Prefetch”的安全事件(执行痕迹取证);
  • 构建该领域的检测规则或威胁狩猎查询;
  • SOC 分析人员需要结构化的分析流程;
  • 验证安全监控对相关攻击技术(改名伪装、防御规避、凭据转储、进程发现)的覆盖情况。

环境准备

使用本技能需要满足以下前提条件:

  1. Python 3.9+,并安装windowsprefetch库:

    pip install windowsprefetch
  2. 目标系统的 Prefetch 文件,来自C:\Windows\Prefetch\。该目录需要管理员权限才能读取。Windows 10/11 上 Prefetch 文件默认开启,可通过注册表确认参数:

    reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters"
  3. 理解 Prefetch 文件的命名约定(详见下文“文件版本与命名规则”)。

取证时应当复制整个C:\Windows\Prefetch\目录(建议连同卷信息一并采集),而不是单独拷贝某几个文件,否则会丢失时间线与关联分析的上下文。

文件版本与命名规则

Prefetch 文件格式随 Windows 版本演变,不同版本能记录的时间戳数量不同。参考 references/api-reference.md 中的对照表:

版本号Windows 版本最大时间戳数
17XP / 20031
23Vista / 71
268 / 8.18
30Windows 10 / 118(MAM 压缩)

注意:Windows 10 及以上的 Prefetch(版本 30)采用 MAM 压缩,windowsprefetch库声明支持版本 17-30。老版本系统的.pf文件结构有所不同,解析时需先确认格式版本(示例输出中会显示Prefetch Format: Windows 10 (MAM compressed, version 30))。

命名约定:格式为EXECUTABLE-XXXXXXXX.pf

  • EXECUTABLE:大写可执行文件名(如CMD.EXE
  • XXXXXXXX文件路径哈希,允许同一可执行文件在不同路径下产生多个 Prefetch 条目——这一点本身就有取证价值:同一个powershell.exe如果出现两个不同哈希后缀的条目,说明它从两个不同路径启动过,可能是异常信号。

核心 API:windowsprefetch 库速览

在动手写分析脚本前,先掌握windowsprefetch库的核心接口(见 references/api-reference.md):

import windowsprefetch pf = windowsprefetch.Prefetch("CMD.EXE-1234ABCD.pf") print(pf.executableName) # CMD.EXE print(pf.runCount) # 42 print(pf.lastRunTime) # 2025-01-15 10:30:22 print(pf.timestamps) # List of up to 8 execution times print(pf.resources) # List of loaded files/DLLs print(pf.volumes) # Volume info (name, serial, creation)

各字段含义:

  • executableName:预读取对象对应的可执行文件名;
  • runCount:该程序累计运行次数;
  • lastRunTime:最近一次执行时间;
  • timestamps:历史执行时间列表(最多 8 条,取决于文件版本);
  • resources:该程序执行期间加载/访问的文件与 DLL 列表——这是识别改名二进制和 C2 载荷的关键字段
  • volumes:卷信息列表(卷名、序列号、创建时间)。

四步取证流程

技能文档 SKILL.md 定义了标准的四步流程,下面结合仓库脚本逐一展开。

Step 1:采集 Prefetch 文件

从目标系统的C:\Windows\Prefetch\目录收集所有.pf文件。采集时注意:

  • 以管理员权限执行复制,避免“正在使用”导致的部分文件丢失;
  • 记录采集时间与源系统信息,保证证据链完整;
  • 优先按修改时间排序(脚本中parse_directory正是按st_mtime倒序处理),最新活动的程序会先被解析。

Step 2:解析执行历史

对每个.pf文件提取:

  • 可执行文件名(executableName
  • 运行次数(runCount
  • 最后执行时间戳及历史时间戳(lastRunTime/timestamps
  • 加载的资源列表(resources,无该属性时脚本回退到filenames
  • 卷信息(volumes
  • 文件大小与 SHA-256 哈希(用于后续关联分析)

仓库脚本 scripts/agent.py 中parse_prefetch_file方法(第 48-90 行)实现了这一逻辑,并将结果组织为统一的execution条目(含pf_hash即文件名哈希段、resources_count等字段),为后续检测与时间线构建做好准备。

Step 3:检测可疑执行

在解析结果基础上执行三类检测:

  1. 已知攻击工具标记:脚本内置SUSPICIOUS_EXECUTABLES集合(第 21-28 行),命中即产生critical级发现“Attack Tool Executed”;
  2. LOLBins 高频使用:内置LOLBINS集合(第 30-36 行),当运行次数超过 10 次时产生medium级发现“LOLBin High Usage”;
  3. 改名二进制检测detect_renamed_binaries方法(第 125-135 行)比对 Prefetch 文件名前缀与实际可执行名,不一致则产生high级发现“Possible Renamed Binary”。

SUSPICIOUS_EXECUTABLESLOLBINS的完整清单来自 references/api-reference.md,分类如下:

类别示例
凭据窃取工具mimikatz、rubeus、lazagne、secretsdump
横向移动工具psexec、psexesvc、wmiexec
C2 代理beacon、meterpreter、covenant、empire
LOLBinscertutil、mshta、regsvr32、rundll32、bitsadmin
侦察工具sharphound、bloodhound、nmap

Step 4:构建执行时间线

build_timeline方法(第 137-149 行)将所有条目的全部时间戳收集为(timestamp, executable, run_count)三元组,按时间倒序排列,返回前 100 条。这一步将碎片化的.pf记录转化为可视化的“攻击路径时间轴”,便于与网络日志、EVTX 等其他证据对齐。

运行分析脚本与输出解读

仓库脚本 scripts/agent.py 是命令行工具,用法如下:

python3 agent.py /evidence/Windows/Prefetch --output-dir /analysis/prefetch_analysis

也可以将脚本部署为技能资产后,按照技能文档 SKILL.md 示例的方式运行:

$ python3 prefetch_analyzer.py --dir /evidence/Windows/Prefetch --output /analysis/prefetch_report Windows Prefetch Analyzer v2.1 ================================ Source: /evidence/Windows/Prefetch/ Prefetch Format: Windows 10 (MAM compressed, version 30) Files Found: 234 --- Execution Timeline (Incident Window: 2024-01-15 to 2024-01-18) --- Last Executed (UTC) | Run Count | Filename | Hash | Path ------------------------|-----------|-----------------------------|----------|------------------------------------------ 2024-01-15 14:33:15 | 1 | Q4_REPORT.XLSM-2A1B3C4D.pf | 2A1B3C4D | C:\Users\jsmith\Downloads\Q4_Report.xlsm 2024-01-15 14:35:44 | 1 | POWERSHELL.EXE-A2B3C4D5.pf | A2B3C4D5 | C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe 2024-01-15 14:36:30 | 3 | UPDATE_CLIENT.EXE-B3C4D5E6.pf| B3C4D5E6| C:\ProgramData\Updates\update_client.exe 2024-01-15 15:10:22 | 1 | NETSCAN.EXE-C4D5E6F7.pf | C4D5E6F7 | C:\Users\jsmith\Downloads\netscan.exe 2024-01-16 02:28:00 | 1 | PROCDUMP64.EXE-D5E6F7A8.pf | D5E6F7A8 | C:\Windows\Temp\procdump64.exe 2024-01-16 02:30:15 | 2 | MIMIKATZ.EXE-E6F7A8B9.pf | E6F7A8B9 | C:\Windows\Temp\mimikatz.exe 2024-01-16 02:40:00 | 4 | PSEXEC.EXE-F7A8B9C0.pf | F7A8B9C0 | C:\Users\jsmith\AppData\Local\Temp\psexec.exe 2024-01-17 02:45:00 | 1 | SDELETE64.EXE-A8B9C0D1.pf | A8B9C0D1 | C:\Windows\Temp\sdelete64.exe 2024-01-18 03:00:45 | 1 | WEVTUTIL.EXE-B9C0D1E2.pf | B9C0D1E2 | C:\Windows\System32\wevtutil.exe --- Renamed Binary Detection --- ALERT: UPDATE_CLIENT.EXE loaded DLLs consistent with Cobalt Strike beacon: Referenced DLLs: wininet.dll, ws2_32.dll, advapi32.dll, dnsapi.dll, netapi32.dll Volume: \VOLUME{01d94f2a3b5c7d8e-A4E73F21} (C:) Directories referenced: C:\ProgramData\Updates\ C:\Windows\System32\ --- Execution Frequency Analysis --- Most Executed (Top 5): 1. SVCHOST.EXE (267 runs) 2. CHROME.EXE (189 runs) 3. EXPLORER.EXE (156 runs) 4. RUNTIMEBROKER.EXE (134 runs) 5. OUTLOOK.EXE (98 runs) First-Time Executions (Never seen before incident window): 6 executables first run between 2024-01-15 and 2024-01-18 Summary: Total prefetch files: 234 Suspicious executables: 6 Renamed binary indicators: 1 (update_client.exe) Anti-forensics tools: 2 (sdelete64.exe, wevtutil.exe) JSON report: /analysis/prefetch_report/prefetch_timeline.json

从示例输出中能读出的取证结论包括:

  • 时间线揭示了完整攻击链:1 月 15 日用户下载了带宏的Q4_Report.xlsm→ PowerShell 启动 → 出现伪装成更新程序的update_client.exenetscan.exe侦察 → 凌晨时段procdump64mimikatzpsexec依次落地执行 → 随后出现sdelete64wevtutil(反取证痕迹清理)。可疑程序几乎都位于C:\Windows\TempAppData\Local\Temp,这是攻击工具落地的典型位置。
  • 改名检测的价值UPDATE_CLIENT.EXEC:\ProgramData\Updates\启动,却加载了wininet.dllws2_32.dlldnsapi.dllnetapi32.dll等网络与认证相关 DLL——与 Cobalt Strike beacon 的加载特征一致,而与其“更新程序”的名称不符,这正是“通过对比可执行文件名与加载资源识别伪装二进制”的核心手法。
  • 频率与首次执行分析:SVCHOST、CHROME、EXPLORER 等系统/常用程序的高运行次数可视为基线;事件窗口内“从未出现过”的 6 个首次执行程序则是重点排查对象。

报告输出结构

脚本generate_report(第 151-171 行)最终生成 JSON 报告并落盘到prefetch_analysis_report.json,字段包括:

  • report_date:报告生成时间(UTC ISO 格式)
  • prefetch_dir:源目录
  • total_prefetch_files/total_unique_executables:文件总数与去重后可执行程序数
  • execution_history:完整解析记录(含运行次数、时间戳、资源数、卷信息、SHA-256)
  • execution_timeline:按时间倒序的前 50 条执行事件
  • findings/total_findings:全部检测发现及数量

该 JSON 可以直接接入 SIEM、威胁情报平台或自定义可视化,作为检测规则与狩猎查询的数据基础,也与技能映射的 NIST CSF RS.AN-03(分析)、DE.AE-02(异常事件分析)能力项相对应。

实战建议与注意事项

  1. 交叉验证:Prefetch 只能证明“程序被启动过”,不能证明“程序干了什么”。务必与 EVTX 安全日志、Sysmon(ProcessCreate/ImageLoad)、AmCache、ShimCache 等证据交叉印证,再下结论。
  2. 关注哈希后缀差异:同一可执行文件出现多个哈希后缀的.pf文件,意味着它从多个路径被执行过,是改名伪装与横向移动的强信号。
  3. 优先排查临时目录C:\Windows\TempC:\Users\<user>\AppData\Local\Temp下的工具类程序(procdump、mimikatz、psexec 等)应优先人工复核。
  4. 确认版本支持windowsprefetch支持版本 17-30,对于 Windows 10/11 的 MAM 压缩格式(版本 30)支持良好;解析异常时可检查文件版本并确认库版本。
  5. 保持证据完整性:采集 Prefetch 目录时应同步记录系统时间偏移(建议统一换算为 UTC),避免时间线错位。

延伸阅读

  • 技能定义与工作流:skills/analyzing-windows-prefetch-with-python/SKILL.md
  • 库 API 与版本/规则参考:skills/analyzing-windows-prefetch-with-python/references/api-reference.md
  • 可直接运行的分析脚本:skills/analyzing-windows-prefetch-with-python/scripts/agent.py
  • 框架映射总览:mappings/README.md 与 mappings/mitre-attack/coverage-summary.md

【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATT&CK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF & MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI & 20+ platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询