Prefetch — 실행 가속 캐시
Windows SysMain 서비스가 실행 가속을 위해 .pf 파일을 만든다. SS는 이 캐시를 타임라인의 첫 축으로 읽는다. Prefetch(프리페치)는 치트 로그가 아니라 실행 가속 캐시이지만, "무엇이 언제 실행됐는가"의 가장 싼 증거다.
왜 중요한가
실행 가속 캐시가 실행 후보를 가장 싸게 주기 때문에 SS에서 먼저 본다. .pf 파일 하나에 실행 파일 이름, 마지막 실행 시각(최대 8개), 실행 횟수, 참조 파일·DLL 목록이 들어 있다. 치트 본체를 삭제해도 CHEAT.EXE-1A2B3C4D.pf 형태로 이름이 남는 경우가 많고, 참조 파일 목록은 그 실행 파일이 무엇을 읽고 불러왔는지까지 보여 준다.
다만 .pf가 있다고 사용자가 직접 실행했다는 뜻은 아니다. 자동 실행이나 설치·업데이트 과정도 .pf를 만든다. 반대로 .pf가 없다고 실행이 없었다는 뜻도 아니다. 끄고 지우는 방법이 아래 우회 기법 절에 있을 만큼 잘 알려진 축이다.
무엇인가
| 항목 | 설명 |
|---|---|
| 경로 | C:\Windows\Prefetch\*.pf |
| 네이밍 | EXECUTABLE.EXE-XXXXXXXX.pf (경로 기반 해시 8자리) |
| 서비스 | SysMain (구 Superfetch). 중지되면 새 .pf가 생기지 않는다 |
| 파일당 기록 | 실행 파일명, 실행 횟수, 마지막 실행 시각, 참조 파일·DLL 목록(트레이스). 마지막 실행 시각은 Windows 8 이상에서 최대 8개, Windows 7 이하에서 1개다 |
| 폴더 상한 | Windows 8+ 약 1,024개, Windows 7 이하 128개. 상한을 넘기면 오래된 것부터 밀려난다 |
| 포맷 | Windows 10+ 에서 .pf는 MAM 압축 형태로 저장된다. 파서가 압축을 풀어 읽는다. 헤더의 형식 버전을 파서가 모르면 파일을 열지 못한다. 일부 Windows 11 기기(Qualcomm 프로세서 기기와 일부 24H2 기기)에서 만든 .pf를 libscca가 형식 미지원 오류로 열지 못한 사례가 있고(2024-11), 같은 파일을 WinPrefetchView는 열었다. 파서가 실패하면 부재로 적지 않고 다른 파서로 다시 연다(듀얼 도구 규칙) |
| 한계 | 실행 파일이 어느 드라이브·파일시스템에 있든 .pf는 시스템 볼륨의 Prefetch 폴더에 생긴다. 파일시스템에 따라 기록 여부가 갈리는 것은 USN Journal이다(NTFS·ReFS만 지원) |
열기는 Win+R → prefetch다. 폴더를 수정 날짜 순으로 정렬하면 최근 실행 순서가 보인다. 숨김 파일과 확장명 표시를 켜 두는 게 좋다. 폴더 목록은 육안 스캔용이고, 실행 시각·횟수·참조 파일 같은 내부 필드는 파서로 읽어야 한다.
SS에서 어떻게 쓰나
- T+10에
C:\Windows\Prefetch를 열고 Date Modified로 정렬해 전체를 캡처한다. - 스캐너 히트·제보 이름과
.pf이름을 대조한다. 치트가 지워졌어도 이름 해시가 남아 있을 수 있다. - 제보 시간대와 파서가 읽은 마지막 실행 시각을 비교한다. 실행 횟수가 "한 번도 안 돌렸다"는 진술과 어긋나는지 본다.
- 비-exe 이름을 찾는다.
LOGO.PNG-XXXX.pf,NOTES.TXT-XXXX.pf처럼 이미지·문서 이름의.pf는 확장자 위장 실행을 의심하게 한다. - 간접 실행 경로를 본다.
CONSENT.EXE(UAC 승인)·CONHOST.EXE쌍은 관리자 권한 실행과 함께 남는 경우가 많고,RUNDLL32.EXE·REGSVR32.EXE는 DLL 경유 실행,JAVAW.EXE는 참조 목록에서 JAR을 확인해 Java 계열 로더를 가려낸다.PYTHON.EXE와CONHOST.EXE가 함께 보이면 스크립트 인젝터 정황이다. - 의심 이름은 파서로 상세를 뽑는다. PECmd(CSV export), WinPrefetchView(GUI), 커뮤니티 도구로는
spokwn/prefetch-parser,Orbdiff/PrefetchView가 있다. - 결과를 R3-USN·R3-BAM 타임라인과 맞춘다.
Prefetch가 비어 있거나 얇으면 SysMain 서비스 상태(services.msc)부터 확인하고 비활성화 사유를 기록한 뒤 다른 축(BAM, USN)으로 전환한다. "PF가 없으니 깨끗하다"고 단정하지 않는다.
우회 기법과 남는 흔적
공격자가 Prefetch를 무력화하는 방법은 정해져 있고, 각각 다른 축에 흔적을 남긴다. 검사자는 기법 자체보다 그 기법이 남긴 파생 흔적을 본다.
| 기법 | 공격자가 하는 일 | 남는 흔적 |
|---|---|---|
.pf 일괄 삭제 | 수동 삭제 또는 CCleaner·BleachBit·.bat/.ps1 스크립트로 폴더를 비운다 | USN에 *.pf FILE_DELETE 가 짧은 창에 몰려 기록된다. SysMain 활성인데 폴더가 비거나 EXPLORER.EXE·ANYDESK.EXE 같은 기본 .pf조차 없으면 정리 정황. BAM·메모리엔 실행이 있는데 .pf만 없으면 조작 의심 |
.pf 내용 비우기 | .pf를 메모장으로 열어 내용을 지우고 저장한다. 파일은 남기고 기록만 없앤다 | 파일은 존재하는데 내용이 비어 있어 파서가 DATA_TRUNCATION·파싱 실패로 표기한다. 크기가 0이거나 실행 시각 슬롯이 빈 .pf를 플래그하고, USN의 DATA_OVERWRITE·DATA_TRUNCATION 기록과 파일 수정 시각을 대조한다. 듀얼 도구 규칙으로 두 번째 파서에서도 같은 공백인지 확인한다 |
.pf 시각 되돌리기 | 파일 속성이나 Set-Item 계열로 .pf의 LastWriteTime을 과거로 돌려 오래 전 실행처럼 보이게 한다 | 저널이 기록한 실제 변경 시각(BASIC_INFO_CHANGE)과 .pf의 표기 시각이 어긋난다. USN 레코드와 파일 시각을 대조해 조작 시점을 특정하고, 파서가 읽은 내부 실행 시각 슬롯과도 비교한다 |
| SysMain 끄기 | services.msc 또는 sc config SysMain start= disabled로 서비스를 정지·비활성한다 | 서비스 상태 자체가 증거다. 비활성 시각 이후 .pf 갱신이 끊기고, System 로그 7036(서비스 상태 변경)과 대조한다 |
.pf 읽기 전용 | attrib +r 또는 파일 속성으로 개별 .pf를 읽기 전용으로 만든다 | SysMain이 실행 시각·횟수 갱신에 실패해 최근 실행 파일이 옛날 실행처럼 보인다. dir /ar C:\Windows\Prefetch로 읽기 전용 목록을 보고, USN의 해당 .pf BASIC_INFO_CHANGE 가 변경 시각을 남긴다 |
| Prefetch ACL 거부 | icacls C:\Windows\Prefetch /deny SYSTEM:(WD) 처럼 SYSTEM 쓰기를 막거나, 개별 .pf에만 deny를 걸어 갱신을 막는다 | .pf 생성·갱신이 막힌다. 폴더뿐 아니라 개별 .pf의 보안 탭까지 Deny 항목을 열거하고, USN SECURITY_CHANGE, icacls.exe·cacls.exe·Set-Acl의 Prefetch·BAM 실행 기록으로 확인한다 |
| 서비스 스레드 정지 | SysMain·PcaSvc·DPS 같은 로깅 서비스의 특정 스레드만 Suspend한다. 서비스는 "실행 중"으로 보여 스텔스성이 높다 | System Informer에서 sechost.dll·pcasvc.dll·dps.dll 스레드가 Suspended. 서비스 실행 중인데 기록이 끊긴 불일치가 리드(재검증이 필요한 단서)다 |
| 파일 교체 | 치트 실행 후 삭제하고 같은 이름의 정상 파일(notepad.exe 복사본 등)을 그 자리에 둔다 | 실행 증거는 남지만 현재 경로엔 정상 파일만 있다. 현재 파일의 생성 시각이 Prefetch·BAM의 마지막 실행 시각보다 늦으면 교체를 의심한다. Windows 11 24H2부터는 복사한 파일이 원본의 타임스탬프를 물려받아 이 비교로 교체를 놓칠 수 있다. USN의 FILE_DELETE → 동일명 CREATE가 결정적 흔적이다 |
| 파일리스·임시 exe 실행 | 리플렉션 로드·인코딩 스크립트로 치트를 메모리에서 실행하거나, 인젝터를 임의 이름의 임시 exe로 두고 실행 직후 삭제해 치트 본체의 .pf를 만들지 않는다 | 실행 주체의 .pf는 남는다. 제보 시간대의 POWERSHELL.EXE·CMD.EXE·WSCRIPT.EXE·임의 이름 임시 exe의 .pf를 찾고, 명령행 이벤트(4688)·스크립트 블록 로그·USN의 임시 파일 create+delete 연쇄와 교차한다. "치트 .pf 없음"은 "실행 없음"이 아니다 |
| USN 저널 삭제 | fsutil usn deletejournal /D C:로 저널을 통째로 지워 .pf 삭제 기록 자체를 없앤다 | 저널이 새로 시작돼 가장 오래된 레코드가 로그인 직후다. Application 로그 3079와 저널 크기 급변을 본다. 자세한 건 USN 카드 |
이 표의 흔적은 대부분 Prefetch 밖에 있다. 조작됐다는 판단은 USN·BAM·이벤트 로그가 내린다.
정상 vs 이상
| 구분 | 정상 | 이상 |
|---|---|---|
.pf 수 | 수십~수백(활발한 PC, 상한까지 차기도 함) | 대폭 감소·비어 있음(긴 세션 후), 기본 프로세스 .pf 부재 |
| 이름 | 브라우저, 게임, 시스템 유틸 | 치트 리포트 키워드, 클리너 이름, 비-exe 확장자 이름 |
| 시각 패턴 | 고르게 분산 | 특정 시간대 집중, 제보 시간대와 맞는 실행 후 공백 |
| 삭제 흔적 | 없음 | USN에 .pf FILE_DELETE 클러스터 |
| 서비스 | SysMain 실행 중 | SysMain·관련 로깅 서비스 정지, 스레드 Suspended |
| 갱신 | 실행 때마다 시각·횟수 갱신 | 읽기 전용·ACL 거부로 갱신 멈춤 |
오탐
- SysMain 비활성: GPO나 사용자 설정으로 꺼져 있으면 PF가 희박하다. 환경을 기록하고 다른 축을 쓴다.
- 새로 설치한 Windows 또는 인플레이스 업그레이드 직후: 깨끗한 것이 당연하다.
- 서드파티 최적화 프로그램: CCleaner 등이 Prefetch를 삭제한다. 도구 자체의
.pf와 설치 시기를 확인한다. - "SSD라서 껐다"는 설명: 흔한 오해다. 서비스 상태로 확인한다.
- 관리형 이미지·서버 SKU: 기본 꺼져 있을 수 있다. OS 에디션을 기록한다.
교차 검증
| 교차 카드 | 확인 내용 |
|---|---|
| R3-USN | .pf 또는 exe의 삭제·이름변경·속성변경 기록. 저널 삭제 여부 |
| R3-BAM | PF가 없을 때 실행 증거 보완. fsutil·icacls·클리너 실행 기록 |
| R3-AF | Security 1102, System 104, 7036 서비스 변경, 클리너 잔여물 |
| R3-SCAN | 스캐너 히트 경로가 PF에 있는지, 없다면 부재 사유가 설명되는지 |
| R3-PROC/MEM | 메모리에 남은 모듈·문자열과 .pf 이름의 불일치 |
PF 단독으로는 Confirmed를 내릴 수 없다. 교차 축 하나 이상이 뒷받침해야 한다.
증거 캡처
- Prefetch 폴더 전체를 Date Modified 정렬 스크린샷 (숨김·확장자 표시 상태로)
- SysMain 서비스 상태 스크린샷(
services.msc) — 스레드 정지 의심 시 System Informer의 서비스 스레드 목록까지 - 의심 이름에 대한 파서 export(CSV·txt) — 실행 시각 8개 슬롯과 참조 파일 목록 포함
dir /ar결과나 보안 탭 Deny 항목 (읽기 전용·ACL 기법 의심 시)- OS 빌드와 부팅 시각 메모
흔한 실수
- "Prefetch에 있으니 실행 확정"이라고 단독으로 판정한다.
- SysMain 상태 확인 없이 "PF가 없으므로 Clean"이라고 한다.
- 파서 하나만 쓰고 부재를 주장한다. 두 도구 규칙을 적용한다.
- 폴더만 보고 파서를 생략한다. 실행 횟수와 참조 파일은 폴더 보기로 안 보인다.
Community. SS 현장에서 Prefetch 폴더가 비어 있을 때 사용자가 "SSD라서 껐다"고 설명하는 사례가 반복 보고된다. 서비스 상태 기록이 필수인 이유다.
.pf읽기 전용 트릭과 Prefetch ACL 거부도 커뮤니티 가이드에서 반복되는 우회다.
.pf를 메모장으로 비우거나 수정 시각을 되돌리는 우회, 파일리스·임시 exe 실행으로 "치트.pf가 없으니 깨끗하다"고 주장하는 사례도 보고된다. 내용이 빈.pf의 DATA_TRUNCATION 표기와 호스트 실행 파일의.pf가 각각 그 답이다.
Sources
- MS fsutil usn — deletejournal 구문
- libscca .pf 포맷 명세 — 실행 시각 8개·실행 횟수·참조 파일 구조
- libscca 이슈 #16: Windows 11 기기의 .pf 형식 미지원(2024-11)
- SANS ISC: Prefetch의 포렌식 가치 — 폴더 상한 1,024/128
- Securelist: Windows 11의 포렌식 아티팩트(24H2 타임스탬프 동작)
- 파서: PECmd · WinPrefetchView
Next
- 파일 변경 기록 → USN Journal
- 실행 증거 보완 → BAM / Registry
- 삭제 흔적 판독 → 안티포렌식
