ข้ามไปที่เนื้อหา

Prefetch

Prefetch คืออะไร

ไฟล์ Windows Prefetch บันทึกข้อมูลที่ใช้เพื่อเพิ่มประสิทธิภาพการเริ่มต้นแอปพลิเคชัน ไฟล์ .pf เฉพาะของแต่ละโปรแกรม โดยทั่วไปจะเก็บชื่อและแฮชของไฟล์ปฏิบัติการ จำนวนครั้งที่ทำงาน เวลาที่ทำงานล่าสุด ข้อมูลวอลุ่ม ไดเรกทอรี และไฟล์ที่ถูกอ้างอิง ระหว่างการเริ่มต้น

สำหรับ Windows เวอร์ชันที่รองรับ เรคคอร์ด Prefetch ของแอปพลิเคชันที่ถูกต้องมักเป็นหลักฐานที่หนักแน่นว่า ไฟล์ปฏิบัติการนั้นได้ทำงานแล้ว และเป็นหนึ่งในอาร์ติแฟกต์การทำงานที่ไม่ใช่ event log ที่มีประโยชน์ที่สุด

ข้อสรุปที่ดีที่สุด: ไฟล์ปฏิบัติการที่ระบุชื่อถูกเรียกใช้ ณ เวลาที่ทำงานล่าสุดที่บันทึกไว้ ทั้งนี้ขึ้นอยู่กับพฤติกรรมของระบบปฏิบัติการและความถูกต้องของพาร์เซอร์

ตำแหน่งและการเก็บรวบรวม

C:\Windows\Prefetch\*.pf

Juntei รองรับรูปแบบเวอร์ชัน 17 ถึง 31 (Windows XP ถึง Windows 11) รวมถึงไฟล์ที่บีบอัดของ Windows 8 ขึ้นไป ให้เก็บรวบรวมทั้งไดเรกทอรีเพื่อให้สามารถเปรียบเทียบแฮชของชื่อไฟล์ปฏิบัติการและเรคคอร์ดข้างเคียงได้

ข้อควรระวังสำหรับนักวิเคราะห์

  • Windows เวอร์ชันเก่าเก็บเวลาที่ทำงานในอดีตไว้เพียงค่าเดียว และเวอร์ชันใหม่เก็บได้สูงสุดแปดค่า RunCount อาจมากกว่าจำนวน timestamp ที่มีอยู่
  • Prefetch อาจถูกปิดใช้งาน ล้าง ยกเว้น หรือไม่มีอยู่ในบางระบบ/บทบาท การไม่มีอยู่ไม่ได้ พิสูจน์ว่าโปรแกรมไม่ได้ทำงาน
  • รายการไฟล์ที่โหลดอธิบาย dependency และการเข้าถึงระหว่างการเริ่มต้น ไม่ได้พิสูจน์ว่าทุกไฟล์ในรายการ เป็นอันตราย ถูกเปิดโดยเจตนา หรือถูกอ่านทั้งหมด
  • ชื่อไฟล์ปฏิบัติการในส่วนหัว Prefetch ถูกจำกัดความยาว Juntei จะหาพาธจากไฟล์ที่โหลด เมื่อสามารถระบุได้อย่างไม่กำกวม
  • timestamp ในระบบไฟล์ของไฟล์ต้นทาง .pf แยกจากเวลาที่ทำงานซึ่งฝังอยู่ในไฟล์
  • Findings เป็นข้อสังเกตสำหรับการล่าภัยคุกคาม (hunting) ตัวติดตั้งและงานดูแลระบบที่ถูกต้องตามกฎหมายมักใช้พาธสำหรับพักไฟล์ (staging path)

วิเคราะห์ด้วย Juntei

Usage: juntei parse-file prefetch <INPUT> [OPTIONS]

Input:
  -d, --directory <DIR>  Recursively find *.pf files
  -f, --file <FILE>      Parse one Prefetch file

Records:
  -T, --timeline  Write one row per retained execution time, sorted by time

Output:
  -o, --output <FILE>       Save every record
  -t, --output-type <TYPE>  csv, json, or jsonl
juntei parse-file prefetch -d Prefetch/ -o prefetch.csv
juntei parse-file prefetch -d Prefetch/ -T -o prefetch-timeline.csv
juntei parse-file prefetch -d Prefetch/ -t jsonl \
  | jq 'select(.ExecutableName? | test("powershell|rundll32"; "i"))'

ฟิลด์ CSV มาตรฐาน

ฟิลด์ การตีความ
SourceFile ไฟล์ .pf อินพุต ให้เก็บไว้เพื่อแยกแยะโฮสต์และชื่อไฟล์ปฏิบัติการที่ซ้ำกัน
ExecutableName ชื่อไฟล์ปฏิบัติการในส่วนหัว สำหรับการล่าภัยคุกคามส่วนใหญ่ไม่ต้องสนใจตัวพิมพ์เล็ก/ใหญ่ แต่ให้เก็บตัวสะกดเดิมไว้
ExecutablePath พาธที่โหลดซึ่ง Juntei หาได้ (ถ้าทำได้) ให้ยืนยันกับ Files และอาร์ติแฟกต์อื่น
PathValidated พาธที่เลือกตรงกับแฮชพาธ SCCA เป็นการยืนยันพาธ ไม่ใช่เนื้อหาหรือความน่าเชื่อถือของไฟล์
PathAmbiguous ยังแยกพาธที่โหลดหลายตัวเลือกไม่ได้ จึงเก็บชื่อจากส่วนหัวใน ExecutablePath โปรดตรวจสอบ Files และหลักฐานอื่น
PrefetchHash แฮชที่ Windows ใช้ในชื่อไฟล์ .pf ไม่ใช่แฮชเชิงวิทยาการเข้ารหัสของเนื้อหาไฟล์
FormatVersion เวอร์ชันโครงสร้าง Prefetch เป็นตัวกำหนดฟิลด์ที่มีและจำนวน timestamp
RunCount ตัวนับสะสมที่ Windows บันทึกไว้ มีประโยชน์สำหรับความถี่ ไม่ใช่ประวัติที่แม่นยำ
LastRun เวลาที่ทำงานล่าสุดที่เก็บไว้
PreviousRun1 … PreviousRun7 เวลาที่ทำงานก่อนหน้าที่เก็บไว้ เรียงจากใหม่ไปเก่า จะว่างหากรูปแบบ/ประวัติไม่มีค่าเหล่านี้
VolumeCount จำนวนวอลุ่มต้นทางที่บันทึกไว้
VolumeDevicePaths พาธอุปกรณ์ NT ของวอลุ่มที่ใช้ระหว่างการเริ่มต้น ให้เชื่อมโยงกับ serial
VolumeSerialNumbers ตัวระบุวอลุ่ม มีประโยชน์สำหรับเชื่อมโยงหลักฐานของไดรฟ์แบบถอดได้หรือไดรฟ์ที่ถูกฟอร์แมตใหม่
VolumeCreated เวลาสร้างวอลุ่มที่บันทึกไว้ ไม่ใช่เวลาสร้างไฟล์ปฏิบัติการ
DirectoryCount จำนวนสตริงไดเรกทอรีที่บันทึกไว้
FileCount จำนวนการอ้างอิงไฟล์ที่โหลดที่บันทึกไว้
Findings ข้อสังเกตของ Juntei เช่น ไบนารีระบบที่ถูกย้ายตำแหน่งหรือพาธการทำงานที่น่าสงสัย ให้ตรวจทานด้วยตนเอง
Files ไฟล์ที่โหลด/ถูกอ้างอิงพร้อม NTFS reference (ถ้ามี) เป็นจุดเชื่อมโยง (pivot) ที่ยอดเยี่ยมสำหรับ DLL/พาธ แต่ไม่ใช่หลักฐานของเจตนาต่อไฟล์
Dir สตริงไดเรกทอรีที่เกี่ยวข้องกับการเริ่มต้น มีประโยชน์เมื่อพาธของไฟล์ที่โหลดแต่ละรายการไม่สมบูรณ์

ฟิลด์ CSV ของไทม์ไลน์ (-T)

ฟิลด์ การตีความ
RunTime เวลาที่ทำงานหนึ่งค่าที่ Prefetch เก็บไว้
ExecutableName, ExecutablePath บริบทของตัวตน/พาธของโปรแกรม
PathValidated พาธที่เลือกตรงกับแฮชพาธ SCCA เป็นการยืนยันพาธ ไม่ใช่เนื้อหาหรือความน่าเชื่อถือของไฟล์
PathAmbiguous ยังแยกพาธที่โหลดหลายตัวเลือกไม่ได้ จึงเก็บชื่อจากส่วนหัวใน ExecutablePath โปรดตรวจสอบ Files และหลักฐานอื่น
PrefetchHash ใช้แยกแยะรูปแบบ/พาธที่ใช้ชื่อไฟล์ปฏิบัติการเดียวกัน
RunCount ตัวนับจากไฟล์ Prefetch ซึ่งจะซ้ำอยู่ในทุกแถวของไทม์ไลน์
SourceFile ไฟล์ .pf ต้นทางสำหรับการตรวจสอบความถูกต้อง

JSON/JSONL จะเก็บรักษาวอลุ่ม ไดเรกทอรี ไฟล์ที่โหลด และ NTFS file reference เป็นอาร์เรย์ที่มีโครงสร้าง แทนที่จะเป็นเซลล์ CSV ที่เชื่อมด้วยเครื่องหมายจุลภาค

กลยุทธ์การตรวจสอบ

  1. ใช้ -T เพื่อเพิ่มการทำงานที่เก็บไว้ลงในไทม์ไลน์
  2. จัดกลุ่มตามชื่อไฟล์ปฏิบัติการร่วมกับแฮช Prefetch เพราะชื่อเดียวกันอาจมีพาธ/แฮชต่างกันได้
  3. ตรวจทาน ExecutablePath, staging path, ข้อสังเกตเกี่ยวกับไบนารีระบบที่ถูกย้ายตำแหน่ง และ DLL ที่โหลด
  4. จับคู่ MFT reference ของเป้าหมายและพาธไฟล์กับเรคคอร์ด $MFT/USN
  5. เชื่อมโยงเวลาที่ทำงานกับ event log, SRUM, ข้อมูล telemetry เครือข่าย, บริการ, งานตามกำหนดเวลา และอาร์ติแฟกต์ของผู้ใช้

รายละเอียดเพิ่มเติม