## 개요
윈도우 에서는 프로그램의 실행 속도를 빠르게 하기 위해서 캐싱될 데이터를 하드디스크에 미리 저장해 놓는 용도로 사용되는 기능이다. 슈퍼 패치도 유사하게 실행될 프로그램이 사용하는 파일과 데이터를 메모리에 빠르게 적재할 수 있도록 하는 기능이다. 부팅을 빠르게 해준다는 점에서 큰 의미가 있지만, SSD가 상용화되는 요즘 추세에는 그 사용이 효율적이라고 말할 수는 없겠다.
하지만 포렌식 관점에서 바라보았을 때 프리패치와 슈퍼패치를 이용한다면 최근에 어떤 프로그램을 실행 했는지에 대한 정보를 확인할 수 있다. 이를 확인할 수 있는 여러 방법이 있지만 가장 흔하면서도 많이 이용되는 것이 프리패치&슈퍼패치다.
프리패치가 널리 활용되는 이유로는 간접적인 정보를 통해 논리적으로 파일이 실행되었음을 이끌어내야 하는 다른 아티팩트와는 다르게 직관적으로 언제 특정 프로그램을 실행했고, 몇 번 실행했는지 확인할 수 있기 때문이다.
> [!ALERT] Superfetch 가 뭔데요?
> 슈퍼패치는 최근 SSD 보급률이 워낙 좋아졌기 때문에 따로 다루지 않을 예정이다. 추가적인 내용 글이 있으면 좋겠다는 의견들이 있으면 그때 다뤄 보도록 하겠다.
## 파일 경로 및 설정 방법
**프리패치 파일 경로**
```
C:\Windows\Prefetch\*.pf
```
![[Untitled 32.png]]
> [!question] 왜 지워진 파일이 있나요?
> 프리패치는 최대 128개의 파일만을 저장하고, 추가 업데이트가 있을 시 오래된 프리패치를 삭제한다.
**프리패치 설정 레지스트리 경로**
```
컴퓨터\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
```
![[Untitled 33.png]]
이 때 키 값에 따라 여러 의미를 가진다
- 0 : prefetch 비활성화
- 1 : 응용 프로그램 캐싱만 사용
- 2 : 부트 캐싱만 사용
- 3 : 응용 프로그램 및 부트 캐싱 사용 (Default)
## 프리패치 파일 구조
파일 구조는 자체적으로 카빙을 하고 싶거나, 분석 도구를 만들어 볼 사람의 경우 참고하면 되겠다. 필수적으로 알아야 하는 내용이 아니고, 관련 도구를 이용해서 충분히 파싱할 수 있으니 목적에 따라 걸러서 보도록 하자.
> [!NOTE] 공부 방법 추천**
> 근데 아티팩트를 파싱하는 도구를 한번쯤 만들어보면 전체적인 구조를 이해하는데 도움이 되고 코딩 실력이나 이래저래 도움이 많이 되니 개인적으로는 해보는 것을 추천한다.
>
**파일 헤더**
| | | |
|---|---|---|
|Offset|Size|Description|
|0x00|4|Version|
|0x04|4|Signature : “SCCA”|
|0x08|4|Unknown|
|0x0C|4|프리패치파일 크기|
|0x10|60|파일 이름|
|0x4C|4|파일 이름에 대한 해시|
데이터 종류는 버전 별로 상이하다. 각 버전별 프리패치 데이터가 갖고 있는 구조체 정보를 나열해 보았다.
- **17version**
| Offset | Size | Description |
| ------ | ---- | ------------------------------------ |
| 0 | 4 | File metrics array 오프셋 |
| 4 | 4 | file metrics 엔트리 갯수 |
| 8 | 4 | Trace chains array 오프셋 |
| 12 | 4 | Number of trace chains array entries |
| 16 | 4 | 파일이름 오프셋 |
| 20 | 4 | 파일 이름 길이 |
| 24 | 4 | Volumes information 오프셋 |
| 28 | 4 | 볼륨 갯수 |
| 32 | 4 | Volumes information 크기 |
| 36 | 8 | 마지막 실행 시각 (FILETIME) |
| 44 | 16 | Unknown |
| 60 | 4 | 실행 횟수 |
| 64 | 4 | Unknown |
- **23version**
|Offset|Size|Description|
|---|---|---|
|0|4|File metrics 배열 오프셋|
|4|4|metrics 엔트리 갯수|
|8|4|Trace chains 배열 오프셋|
|12|4|Trace chains 배열 갯수|
|16|4|파일 이름 오프셋|
|20|4|파일 이름 크기|
|24|4|Volumes information 오프셋|
|28|4|볼륨 갯수|
|32|4|Volumes information 크기|
|36|8|Unknown|
|44|8|마지막 실행 시각(FILETIME)|
|52|16|Unknown|
|68|4|실행 횟수|
|72|4|Unknown|
|76|80|Unknown|
- **26version**
|Offset|Size|Description|
|---|---|---|
|0|4|File metrics 배열 오프셋|
|4|4|File metrics 배열 갯수|
|8|4|Trace chains 배열 오프셋|
|12|4|Trace chains 배열 엔트리 갯수|
|16|4|파일 이름 오프셋|
|20|4|파일 이름 길이|
|24|4|Volumes information 오프셋|
|28|4|볼륨 갯수|
|32|4|Volumes information 크기|
|36|8|Unknown|
|44|8 x 8 = 64|마지막 실행 시각(여러개) <br>0 인 경우 가장 최근 실행 시각과 같음|
|108|16|Unknown|
|124|4|실행 횟수|
|128|4|Unknown|
|132|4|Unknown|
|136|88|Unknown|
- **30version**
30 버전 중에서도 유형이 두개로 나뉘는데 하나는 26버전과 동일하게 나타난다.
위에서 다뤘으니 여기서는 다루지 않고, 다른 유형만 다루도록 하겠다.
|Offset|Size|Description|
|---|---|---|
|0|4|File metrics 배열 오프셋|
|4|4|File metrics 배열 갯수|
|8|4|Trace chains 배열 오프셋|
|12|4|Trace chains 배열 엔트리 갯수|
|16|4|파일 이름 오프셋|
|20|4|파일 이름 길이|
|24|4|Volumes information 오프셋|
|28|4|볼륨 갯수|
|32|4|Volumes information 크기|
|36|8|Unknown|
|44|8 x 8 = 64|마지막 실행 시각(여러개) <br>0 인 경우 가장 최근 실행 시각과 같음|
|108|8|Unknown|
|116|4|실행 횟수|
|120|4|Unknown|
|124|4|Unknown|
|128|88|Unknown|
## 프리패치 내 데이터
그럼 아마 이 글을 읽는 사람들이 궁금해 할 정보에 대해서 소개할 차례이다. 앞의 내용을 모두 읽었다면 프리패치가 어떤 조건에서 생성이 되는지 알았을 것이다. 이번 장에서는 프리패치 파일 안에는 어떤 데이터가 있는지 소개해 보도록 하겠다. 소개 부분에서 프리패치는 파일을 언제 실행했는지 알 수 있다고 했는데, 이 정보를 비롯해 부가적으로 확인할 수 있는 정보는 다음과 같다.
분석하는 목적에 따라 봐야하는 정보가 다르다. 단순히 어떤 프로그램을 실행 했다는 정보가 필요하다면 실행 횟수와 실행 시각 정보들을 위주로 보면 된다. 예를 들어 악성 코드를 특정 프로그램이 실행한 경우 어떤 DLL 을 참조해서 실행했는지 직접 리버싱해 보지 않아도 알 수 있으므로 어떤 프로그램뿐만 아니라 연관된 프로그램까지 실행되는 것을 알 수 있겠다.
- 실행 파일 이름
- 실행 파일 경로
- 실행 횟수
- 마지막 실행 시각
- 최초 실행 시각
- 사용하는 DLL
- 볼륨 이름 및 VSN
- …
> [!NOTE]
> 모든 정보를 적지는 않았다. 가장 주요하다고 생각되는 부분들을 적었고, 모든 정보를 알고 싶다면 파일 구조에 대해 읽어보고 오자.
>
## 팁
**[[ADS(Alternative Data Stream)]]**
ADS로 실행파일이 붙어 있는 경우 ADS에 대한 프리패치 파일이 생성된다.
```
C:\Windows\System32\sample.exe:evil.exe
C:\Windows\Prefetch\sample.exe:evil.pf
```
## 분석 도구
**WinPrefetchView**
> [!info] View the content of Windows Prefetch (.pf) files
> Description Each time that you run an application in your system, a Prefetch file which contains information about the files loaded by the application is created by Windows operating system. The information in the Prefetch file is used for optimizing the loading time of the application in the next time that you run it.
> [https://www.nirsoft.net/utils/win_prefetch_view.html](https://www.nirsoft.net/utils/win_prefetch_view.html)
## Conclusion
윈도우 아티팩트 중 가장 유용하게 쓰는 아티팩트가 아닌가 생각이 든다. 뭔가 명확하게 남아있기도 하고, 얻을 수 있는 정보가 많으니, 케이스 분석할 때 필수적으로 작성해야 하는 설치된 응용프로그램과 연결지을때도 유용하다. 매칭되는 응용 프로그램이 몇번 실행되었는지, 어떤 dll을 참조하는지 기호에 맞게 분석하면 좋다.
앵간한 분석 도구에서는 프리패치를 분석해주는게 기본 옵션으로 들어가 있는 경우가 많다. autopsy 에서 해주는지는 잘 기억이 안나지만,,,,(안해줬던거 같다) 기타 많이 사용하는 유료 도구에서는 거의다 지원을 해주니 별 생각없이 출력해주는 결과만 읽은 기억이 있을 것이다. 때로는 출력해주는 정보가 전부라는 함정에 빠질 때가 있는데 항상 전체 중 보기 편하게 만들어주는게 “툴”의 결과물이라는 것을 잊지 않고 분석에 임하면 좋을 것 같다.