4 个版本

0.13.0 2024 年 5 月 13 日
0.9.2 2024 年 5 月 13 日
0.9.1 2024 年 2 月 8 日
0.9.0 2024 年 2 月 8 日

819解析器实现

Download history 1/week @ 2024-04-20 261/week @ 2024-05-11 60/week @ 2024-05-18 18/week @ 2024-05-25 15/week @ 2024-06-01 53/week @ 2024-06-08 8/week @ 2024-06-15 1/week @ 2024-06-22 15/week @ 2024-07-06 25/week @ 2024-07-13 15/week @ 2024-07-20 49/week @ 2024-07-27 5/week @ 2024-08-03

98 每月下载量
dfir-toolkit 中使用

MIT 许可证

87KB
2K SLoC

Prefetch 解析器

crates.io documentation MIT License Rust

Windows Prefetch 的纯 Rust 解析器实现,适用于所有平台。

use forensic_rs::prelude::*;
use frnsc_prefetch::prelude::*;
let mut fs = ChRootFileSystem::new("./artifacts/17", Box::new(StdVirtualFS::new()));
let prefetch_list : <PrefetchFile> = read_prefetch_form_fs(&mut fs).expect("Must read all prefetch from filesystem");

转换为时间线

可以将 PrefetchFile 结构转换为 TimelineData,请注意,单个 Prefetch 文件可能大于 45Kb,在此过程中会丢失一些数据,例如 MFT 文件引用或文件跟踪。

{ 
    time: 06-11-2023 14:18:00.429, 
    artifact: Unknown, 
    fields: {
        "artifact.host": "", 
        "artifact.name": "Unknown", 
        "artifact.tenant": "", 
        "file.accessed": 06-11-2023 14:18:00.429, 
        "file.path": "POWERSHELL.EXE", 
        "pe.imports": ["\\VOLUME{01d98a6b8e4b1a36-1c2ea44d}\\WINDOWS\\SYSTEM32\\NTDLL.DLL", "\\VOLUME{01d98a6b8e4b1a36-1c2ea44d}\\WINDOWS\\SYSTEM32\\WOW64.DLL", "\\VOLUME{01d98a6b8e4b1a36-1c2ea44d}\\WINDOWS\\SYSTEM32\\WOW64WIN.DLL", "\\VOLUME{01d98a6b8e4b1a36-1c2ea44d}\\WINDOWS\\SYSTEM32\\KERNEL32.DLL", "\\VOLUME{01d98a6b8e4b1a36-1c2ea44d}\\WINDOWS\\SYSWOW64\\KERNEL32.DLL", "\\VOLUME{01d98a6b8e4b1a36-1c2ea44d}\\WINDOWS\\SYSTEM32\\USER32.DLL", "\\VOLUME{01d98a6b8e4b1a36-1c2ea44d}\\WINDOWS\\SYSTEM32\\WOW64CPU.DLL", "\\VOLUME{01d98a6b8e4b1a36-1c2ea44d}\\WINDOWS\\SYSWOW64\\NTDLL.DLL", "\\VOLUME{01d98a6b8e4b1a36-1c2ea44d}\\WINDOWS\\SYSWOW64\\WINDOWSPOWERSHELL\\V1.0\\POWERSHELL.EXE", "..."], "prefetch.execution_times": 2945, 
        "prefetch.version": 30, 
        "prefetch.volume_files": ["\\VOLUME{01d98a6b8e4b1a36-1c2ea44d}\\$EXTEND", "\\VOLUME{01d98a6b8e4b1a36-1c2ea44d}\\PROGRAM FILES", "\\VOLUME{01d98a6b8e4b1a36-1c2ea44d}\\PROGRAM FILES\\SECRMM", "\\VOLUME{01d98a6b8e4b1a36-1c2ea44d}\\PROGRAM FILES\\SECRMM\\ADMINUTILS", "\\VOLUME{01d98a6b8e4b1a36-1c2ea44d}\\PROGRAM FILES\\SECRMM\\ADMINUTILS\\SDK", "\\VOLUME{01d98a6b8e4b1a36-1c2ea44d}\\PROGRAMDATA", "..."]
        } 
    }, 
    time_context: Accessed 
}
let mut fs = StdVirtualFS::new();
let file = fs.open(Path::new(
    "./artifacts/30/C/Windows/Prefetch/POWERSHELL.EXE-AE8EDC9B.pf",
)).unwrap();
let pref = read_prefetch_file_compressed("POWERSHELL.EXE-AE8EDC9B.pf", file).unwrap();
let mut forensic_data = pref.timeline();
let event : TimelineData = forensic_data.next().unwrap();

转换为活动

将 Prefetch 数据转换为用户活动事件,以便知道用户执行了哪个程序。

法医活动{时间戳: 06-11-2023 15:18:00.237,用户: "WARD",会话 ID:未知,活动:程序执行(\{01d98a6b9e4a0a35-1c9e547d}\WINDOWS\SYSWOW64\WINDOWSPOWERSHELL\V1.0\POWERSHELL.EXE) }

let mut fs = StdVirtualFS::new();
let file = fs.open(Path::new(
    "./artifacts/30/C/Windows/Prefetch/POWERSHELL.EXE-AE8EDC9B.pf",
)).unwrap();
let pref = read_prefetch_file_compressed("POWERSHELL.EXE-AE8EDC9B.pf", file).unwrap();
let mut forensic_data = pref.activity();
let activity : ForensicActivity = forensic_data.next().unwrap();

预取格式

参考信息可以在这里找到:libscca

压缩后的文件格式具有 MAM 签名,然后是压缩算法、一个表示是否有 CRC 的标志、解压缩大小、CRC 值和最终压缩大小

Compressed prefetch format

解压缩文件(或未压缩时的完整文件)具有一个头部

  • 版本:用于生成预取的 SCCA 版本。
    • 17:Windows XP
    • 23:Windows 7
    • 26:Windows 8.1
    • 30:Windows 10
  • 签名:签名是 "SCCA"。
  • 文件大小:预取文件大小。
  • 可执行文件名:为该预取创建的可执行文件名称。
  • 哈希:预取哈希。必须与预取文件名称中的哈希相同。

Prefetch header

头部之后是版本相关的文件信息数据

  • 度量数据位置:用于了解加载可执行文件的 DLL/EXE。
  • 跟踪链位置
  • 字符串数组位置
  • 卷信息数组位置
  • 执行次数
  • 上次执行时间:FILETIME 格式。对于现代版本,存储最后 8 次执行。

Prefetch information v17

Prefetch information v23

Prefetch information v26

Prefetch information v30-1

Prefetch information v30-2

依赖项

~415–660KB
~14K SLoC