Prefetch¶
한 줄 요약
Prefetch 파일은 실행 파일이 실행됐다는 것, 언제 실행됐는지(최근 8번까지), 몇 번 실행됐는지, 그리고 처음 ~10초 동안 어떤 파일/폴더에 접근했는지를 기록합니다 — 워크스테이션에서 "실행됐나?"에 답하는 최고의 아티팩트입니다.
알려 주는 것¶
- 실행 파일 이름과 전체 경로의 해시 (그래서
C:\Windows\System32의cmd.exe와C:\Temp의cmd.exe는 서로 다른.pf파일이 됩니다). - 실행 횟수와 최근 실행 시각 최대 8개 (Win8+; XP/7은 마지막 1개만).
- 로딩 중에 참조한 파일과 폴더 — DLL, 설정 파일, 뷰어가 연 문서, 사이드로딩된 바이너리가 불러온 DLL.
- 볼륨 정보: 실행된 볼륨의 시리얼 번호와 생성 시각 (USB에서 실행한 도구를 찾는 데 도움).
위치¶
| 항목 | 경로 |
|---|---|
| 폴더 | C:\Windows\Prefetch\ |
| 파일 이름 규칙 | <EXENAME>-<8자리 해시>.pf — 예: MIMIKATZ.EXE-5B7C4A2D.pf |
| 제어 키 | HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters\EnablePrefetcher |
| 최대 파일 수 | 128 (XP/7), 1024 (Win8+). 가득 차면 오래된 것부터 삭제 |
EnablePrefetcher 값: 0 비활성, 1 애플리케이션만, 2 부팅만, 3 애플리케이션 + 부팅 (워크스테이션 기본값). Windows Server는 기본으로 꺼져 있고, Win7에서는 SSD 시스템에서 꺼져 있는 경우가 많습니다 (Win8+는 SSD와 상관없이 켜 둡니다).
주요 필드¶
| 필드 | 의미 | 메모 |
|---|---|---|
| 실행 파일 이름 | 실행된 파일명 | 대소문자 구분 없음; 경로는 해시로 구분 |
| 해시 | 전체 경로로 계산 (svchost.exe, dllhost.exe, mmc.exe, rundll32.exe, backgroundtaskhost.exe 같은 호스팅 프로세스는 명령줄도 포함) |
같은 바이너리라도 경로가 다르면 → 다른 .pf |
| 실행 횟수 | 실행된 횟수 | 줄어들지 않으므로, 공백이 있다고 지워진 것은 아님 |
| 마지막 실행 시각 | 최대 8개 (Win8+) | FILETIME(UTC)으로 저장. 첫 실행은 최근 8개 안에 들지 않으면 저장되지 않음 |
| 파일 참조 | 처음 ~10초 동안 연 파일 | 불러온 문서/DLL도 포함 — LOLBin이 실행한 페이로드를 찾는 데 좋음 |
| 폴더 참조 | 접근한 폴더 | 스테이징 폴더가 드러남 |
| 볼륨 시리얼 / 생성 시각 | exe가 있던 곳 | USB나 마운트한 이미지 탐지 |
10초 문제와 ~10초 오프셋
.pf 파일은 프로세스 시작 후 약 10초 뒤에 기록됩니다. 그래서 .pf 파일의 NTFS 생성 시각 ≈ 첫 실행 + 10초, 수정 시각 ≈ 마지막 실행 + 10초입니다. 또 아주 짧게 산 프로세스(1초 만에 끝나는 드로퍼)도 prefetch 파일은 생기지만 파일 참조는 적을 수 있습니다.
포맷 버전¶
| 버전 | OS | 압축? |
|---|---|---|
| 17 | XP / 2003 | 아니오 |
| 23 | Vista / 7 | 아니오 |
| 26 | 8 / 8.1 | 아니오 |
| 30 | 10 / 11 | 예 — MAM (Xpress Huffman); 파싱 전에 압축을 풀어야 함. 최신 10/11 빌드는 v30 변형과 v31을 사용 |
압축을 풀면 오프셋 4에 시그니처 SCCA가 있습니다.
수집 방법¶
Windows.Forensics.Prefetch 아티팩트 — 라이브로 파싱해서 표로 돌려줍니다 (파일을 먼저 복사할 필요 없음).
파싱 방법¶
# Whole directory → CSV (one row per pf + one row per referenced file in *_Timeline.csv)
PECmd.exe -d C:\Case\Prefetch --csv C:\Case\out --csvf prefetch.csv
# Single file, human readable
PECmd.exe -f C:\Case\Prefetch\MIMIKATZ.EXE-5B7C4A2D.pf
# Only show pf files that reference a keyword (e.g. a staging dir)
PECmd.exe -d C:\Case\Prefetch -k "temp,appdata\local\temp,users\public"
--csvf로 지정한 이름이 주 출력이고, *_Timeline.csv는 실행 시각마다 한 줄씩 나옵니다 — 슈퍼 타임라인에 넣으세요.
분석 팁¶
빠른 트리아지
PECmd 출력을 Last Run 내림차순, Run Count 오름차순으로 정렬하세요. 공격 도구는 보통 사고 시간대에 실행 횟수가 적습니다(1–3회). 정상 소프트웨어는 몇 달에 걸쳐 실행 횟수가 많습니다.
- 파일명이 무죄를 뜻하지 않습니다. 처음 보는 해시의
svchost.exe.pf는 svchost가 비표준 경로에서(또는 이상한 명령줄로) 실행됐다는 뜻입니다. 전체 PC의 해시를 비교하세요. - 파일 참조 안을 보세요.
C:\Users\Public\update.ps1을 참조하는POWERSHELL.EXE-*.pf는 PowerShell이 무엇을 실행했는지 알려 줍니다. 낯선 DLL을 참조하는RUNDLL32.EXE-*.pf는 사이드로딩 / 프록시 실행의 단서입니다. - 삭제된 도구도 보입니다. 공격자가
mimikatz.exe를 지워도.pf파일은 대개 남습니다. 같은 바이너리를$MFT, USN 저널, Amcache에서도 확인하세요. - 이름을 바꾼 도구. prefetch의 실행 파일 이름과 Amcache SHA1이 말하는 실제 정체를 비교하세요.
- 타임스톰핑은 prefetch를 건드리지 않습니다. 공격자는 EXE의 타임스탬프를 조작해도 prefetch와
$MFT$FILE_NAME속성은 잊는 경우가 많습니다. - 없다고 실행 안 된 건 아닙니다.
EnablePrefetcher, Server SKU 여부, 폴더가 1024개 한도에 도달했는지(그러면 가장 오래된 것부터 삭제), 폴더가 지워졌는지 확인하세요 — 거의 비어 있는 Prefetch 폴더의 수정 시각이 아주 최근이라면 그 자체로 수상합니다. - 안티포렌식:
C:\Windows\Prefetch\*삭제,EnablePrefetcher=0설정, RAM 디스크 / 매핑된 공유에서 실행 (네트워크 공유의 파일도 prefetch 파일이 생기지만 UNC 경로가 해시됩니다).
타임라인 / 상관분석¶
| 질문 | 교차 확인 |
|---|---|
| 그 바이너리는 정확히 무엇이었나? | Amcache (SHA1, 게시자), Shimcache (경로, 존재) |
| 누가 실행했나? | Security 4688 (켜져 있다면), UserAssist, BAM/DAM 키 (SID별 마지막 실행 시각) |
| 다음에 무엇을 했나? | Sysmon 1/3/11, 실행 시각 ±10초에 생성된 파일은 USN 저널 |
| USB에서 실행됐나? | .pf의 볼륨 시리얼 ↔ SYSTEM\MountedDevices, USBSTOR |
| 지속성을 남겼나? | 레지스트리 Run 키, 예약 작업 4698, 서비스 7045 |