개요
Prefetch
프리패치(Prefetch) 란..?
Windows 내에서 프리 패칭은 부팅 혹은 응용 프로그램을 실행할 때 성능 향상을 위해 구현된 기능으로 부팅 혹은 응용 프로그램 실행 후 모니터링하여 이를 파일로 생성한다. 생성된 프리패치 파일은 이후 재부팅 혹은 응용 프로그램 재실행 시 속도 향상을 위해 사용된다.
기본적으로 프리패치 파일은 “%SystemRoot%\Prefetch” 경로에 위치한다.
Tools
- WinPrefetchView : 프리 패치 파일을 불러와서 GUI 를 사용하여 정보를 보여준다. 추가로 옵션 → 고급 옵션을 통해 프리 패치 파일을 따로 불러와 확인할 수 있다.
- PECmd : 프리 패치 파일 혹은 폴더 경로를 지정하여 분석한 결과를 json, csv, html 등으로 추출해주는 툴
ADS(Alternate Data Stream)
ADS 란...?
약자 그대로 또 다른 데이터 스트림을 생성하는 NTFS 파일시스템의 기능으로 맥킨토시 파일 시스템과 호환성을 위한 기능이다. FAT 형식의 파일 시스템에서는 지원하지 않고, 파일 용량에는 변화는 없어 보이지만 실제 하드 사용량은 증가한다.
다음 명령어를 사용하여 ADS 데이터를 생성할 수 있는데 이를 dir 명령어를 통해 확인해보면 실제 파일 크기는 0으로 보인다. 하지만 “/r” 옵션을 추가해주면 숨겨져 있던 ADS 데이터를 확인할 수 있다.
- echo “Input Data” > [File Name]:[ADS Name]
데이터는 “more < [File Name]:[ADS Name]:$DATA” 명령어를 통해 확인할 수 있다.
Prefetch & ADS
PowerPoint, Bandizip 등과 같이 ADS 데이터가 포함된 파일을 실행을 한다면 Prefetch를 통해 해당 파일에 포함된 ADS 정보가 저장되는 것을 확인할 수 있다. 이를 통해 실행한 파일이 외부에서 받아온 파일인지 확인할 수 있거나 만약 ADS에 악성 스크립트를 저장한 파일을 실행하여 감염이 되었다면 Prefetch를 통해 이를 확인할 수 있다.
개발
목적
과제 진행하면서 Prefetch 파일 내부에 ADS 정보를 추출할 필요가 있었는데 WinPrefetchView으로는 하나하나 확인하기 힘들고 PECmd로도 필요한 부분만을 추출하기 힘들어 간단하게 구현해보았다.
구현
PECmd를 사용하여 json 형식으로 추출하면 다음과 같은 형식을 확인할 수 있는데 여기서 중요한 부분은 바로 FilesLoaded 부분이다(vscode의 json 정렬 기능을 사용하여 확인하면 편하다.)
ADS가 저장된 파일을 실행했다면 해당 파일이 이 FilesLoaded 부분에 저장되기 때문에 이 부분을 사용하여 ADS 파일을 구분한다.
Source Code
import json
import sys
if len(sys.argv) != 3:
print("Usage : export_ads.py [source file] [export file]")
sys.exit()
file_path = sys.argv[1]
export = sys.argv[2]
jlist = []
ads = []
for line in open(file_path, 'r'):
jlist.append(json.loads(line))
for i in range(len(jlist)):
for j in range(len(jlist[i]["FilesLoaded"].split(','))):
if(jlist[i]["FilesLoaded"].split(',')[j].find(':') != -1):
ads.append({"ads": jlist[i]["FilesLoaded"].split(', ')[j]
, "SourceFileName": jlist[i]["SourceFilename"]
, "ExecutableName":jlist[i]["ExecutableName"]
, "size": jlist[i]["Size"]
, "count":jlist[i]["RunCount"]
, "last run":jlist[i]["LastRun"]})
with open(export, 'w') as f:
json.dump(ads, f, indent=2, ensure_ascii=False)
구현은 간단하게 FilesLoaded에 저장된 파일 목록 중 “:” 가 포함된 파일의 정보(SourceFileName, ExecutableName, size 등)를 json 파일로 추출하도록 작성하였다(필요하다면 다른 정보도 추출하도록 변경할 수 있다.) 코드
- 사용법 : export_ads.py [PECmd으로 추출한 json 파일 경로] [추출할 파일 경로]
실제로 추출하면 다음과 같은 형태로 정보가 저장된다.
Reference
- Prefetch
http://forensic-proof.com/archives/6103 - WinPrefetchView
https://www.nirsoft.net/utils/win_prefetch_view.html - PECmd
https://ericzimmerman.github.io/#!index.md - Source Code
https://github.com/le3mon/ads_parser