2014년 11월 19일 수요일

프리패치와 슈퍼패치(Prefetch and Superfetch)

Page info



프리패치 사용의 목적

SSD(좌측)와 HDD(우측)의 내부 모습
프리패치의 사용 목적을 이해하기 위해 우선 SSD와 HDD의 특징에 대해 간단히 알아보자. 

SSD(Solid State Drive)가 개발되기 이전에 거의 모든 컴퓨터에서 보조 저장 장치의 역할은 HDD(Hard Disk Drive)가 수행하였다. 각각의 내부 모습은 위 그림에서 확인할 수 있는데, 그림의 좌측은 SSD, 우측은 HDD의 내부 모습을 나타내고 있다. 

SSD가 I/O속도를 획기적으로 개선할 수 있었던 가장 큰 이유를 간단하게 요약하면 '데이터를 읽고 쓰는 과정에서의 물리적인 움직임을 전자/전기적인 신호로 모두 대체한'것에 있다고 할 수 있다. 


실제 HDD는 플래터(Platter)라고 하는 저장매체를 빠르게 회전시킨 후 헤드(Head)라는 I/O매개체를 원하는 곳으로 움직여 해당 위치의 데이터를 읽고 쓴다. 따라서, 플래터의 회전 속도와 헤드의 움직임 필요 여부에 따라 데이터 I/O속도가 크게 좌우되는데, 인간의 눈으로는 보기도 힘들정도의 굉장히 빠른 속도이지만 전기적인 신호로 제어되는 물리메모리(주기억장치)나 플래시메모리, SSD와는 비교가 힘들 정도로 느린 속도라 할 수 있다. 

그럼에도 불구하고 HDD가 전세계에 보급되어 주로 사용된 이유는, 대용량의 데이터를 안정적으로 저장할 수 있도록 설계되었기 때문이다. 보조 기억 장치의 주 목적은 전원이 차단된 후에도 안정적으로 데이터를 최대한 많이 저장해 두는 것이기 때문에 HDD는 수십년간 그 역할을 부족함 없이 수행해 왔다고 보아도 무방하다. 

다만, 극복할 수 없는 주기억장치(물리메모리)와의 속도 차이 때문에 윈도우는 스스로 운용속도를 향상시키기 위한 관리 정책들을 구성해 왔는데, 그 과정에서 프리패치의 개념도 생겨난 것이다. 

※ 뒷 부분에 다루겠지만, SSD의 I/O속도는 윈도우의 메모리 관리 정책이 유명무실할 만큼 빨라졌다. 이 때문에 실제로 SSD 사용시에는 프리패치의 사용이 자동으로 비활성화 되는 것을 알 수있다. 포렌식 조사관 입장에서는 아쉬운 면이 없지 않지만, 여전히 HDD의 사용이 만연하므로 관련 내용을 꼭 숙지할 수 있도록 하자.

이제 본론으로 돌아와 프리패치에 관해서 알아보자. 



프리패치(Prefetch)

프리패치는 윈도우 XP 이후 (2003, Vista, 2008, 7, 8, 8.1) 의 운영체제에서 제공하는 메모리 관리 정책으로, 실행파일을 메모리로 로딩할 때의 효율을 최대한 끌어올리기 위한 목적으로 개발되었다. 

앞서 다룬 것 처럼 데이터의 영구적인 저장을 위해 사용되는 보조기억장치는 I/O 속도는 주 기억 장치에 비하여 현저하게 느렸다(SSD의 보급 이전). 

이에, 윈도우는 프리패치 파일에 실행 파일이 사용하는 시스템 자원을 미리 저장하였다가 윈도우 부팅 시 프리패치 파일(.pf)을 모두 메모리에 로드한 후 실제 사용할 때에는 메모리 매핑만을 수행하여 사용할 수 있도록 하여 실행 속도를 다소 향상시켰다. 

프리패치가 저장되는 폴더 예시

포렌식 분석가 입장에서는 프리패치가 생성되는 이유만 정확하게 파악 하였다면, 더욱 중요한 것은 프리패치 파일이 포함하는 정보를 분석하는 일 일것이다. 프리패치 파일에 저장되는 정보 중 분석에 유용한 목록은 아래와 같다. 
  • 실행 파일 이름
  • 실행 파일의 실행 횟수
  • 실행 파일의 마지막 실행 시간
  • 프리패치 파일의 생성 시간(최초 실행 시간)
  • 실행된 볼륨의 정보
  • 실행파일 실행 시 참조하는 파일의 목록
프리패치 분석 도구 사용 예시
프리 패치는 주로 실행파일의 실행 여부를 입증하거나, 파일 시스템 분석에서는 찾을 수 없는 실행파일 관련 정보를 확인하고자 하는 목적으로 분석된다. 

프리패치 파일의 생성 시간은 연결되는 실행파일의 최초 실행 시간이라고도 볼 수 있으며, 프리패치 파일 내부에는 실행파일이 마지막으로 실행된 시각도 기록되어 있기 때문에, 시스템에서의 실행파일의 사용 이력을 파악하는 데에도 도움이 될 것이다. 

또한, 프리패치 내부의 참조 목록은 경우에 따라 유용하게 활용될 수 있는데, 문서 편집 프로그램의 경우 사용한 문서파일의 경로를 확인할 수도 있고, 압축 해제 프로그램에서는 압축 해제된 파일의 목록도 확인이 가능하다. 



부트 프리패치와 어플리케이션 프리패치, 그리고 슈퍼패치

프리패치 파일(.pf)은 크게 부트 프리패치와 어플리케이션 프리패치 두 종류로 나뉜다. 우선 부트 프리패치는 NTOSBOOT-BOODFAAD.PF라는 이름을 가지며, 단일 파일로 존재한다. 부트 프리패치는 이름처럼 시스템이 부팅되는 속도를 조금 더 빠르게 하기 위한 것으로 부팅 시 사용되는 시스템 자원을 파악하여 한곳에 모아놓는 역할을 한다.

어플리케이션 프리패치는 부팅 시점에 미리 사용하는 자원을 로드하여, 어플리케이션을 구동할 때 조금 더 빠르게 하는 목적이 있는데, 부트 프리패치는 어차피 부팅 시점에 자원을 로드함에 있어 한꺼번에 모아서 로드할 뿐인 것이다.

언듯 의미가 없어보이지만, HDD에 산재해있는 파일을 각각 로드하려면 디스크 헤드의 움직임이 그만큼 많아지고, 부팅 속도가 현저하게 저하될 수밖에 없다. 이 때 부트 프리패치를 로드하는 방식을 이용하면 헤드의 움직임을 최소화할 수 있는 것이다.

분석 관점에서 부트프리패치는, 시스템이 부팅될 때 로드되는 파일들의 목록을 확인할 수 있는 여지를 주기 때문에 유용하다. (물론 부트 프리패치 목록에 없다고하여 부팅시 로드되는 악성코드가 없다고 단정할 수 는 없다.)


반면, 어플리케이션 프리패치는 "[실행 파일  [파일 위치에 대한 해쉬].pf"와 같은 이름으로 생성되며, 실행파일이 구동될 때 메모리에 올라간 실행코드의 일부나 전부를 저장하기 위해 사용된다. 

이렇게 생성된 프리패치 파일은 운영체제 부팅시 미리 로드되며, 실행파일이 다시 실행될 때 HDD로의 접근을 최소화하여 구동 속도를 높히는 역할을 한다. 또한 Windows 2003, 2008과 같은 서버용 운영체제에서는 응용프로그램이 구동이 많지 않으므로 자동 비활성화되어 있다. 

하지만 프리패치의 사용은 메모리의 페이징 아웃 기법(오래 사용되지 않는 메모리 영역을 잠시 보조저장장치로 이동시켜 메모리 공간을 확보하는 기술)에 의해 제 기능을 못할 때가 있다. 정작 운영체제가 미리 로딩해 놓은 프리패치 파일이 페이징 아웃 되버리면, 다시 응용프로그램을 실행할 때 보조 저장장치의 페이지 파일(pagefile.sys)로부터 로딩을 해야 하는 모순이 생기는 것이다. 

이러한 문제를 개선하기 위해 Windows Vista부터 적용된 것이 슈퍼패치(Superfetch)라는 것으로 C:\Windows\prefetch 경로 내부의 .db확장자를 가지는 는 파일로 존재한다. 슈퍼패치는 사용자의 프로그램 사용 패턴(얼마나 자주, 언제, 얼마 동안)을 추가적으로 기록하여 자주 사용하는 프로그램일 경우 지속적으로 메모리 로드해 두는 것을 목적으로 존재하지만, 조사 관점에서도 더욱 유용하게 활용될 수 있다는 점을 기억하자. 


※Superfetch 압축 포맷관련 정보 : 

  • LZNT1 압축(RtlCompressBuffer, RtlDecumpressBuffer)
  • http://msdn.microsoft.com/en-us/library/ff552191(v=vs.85).aspx




SSD 이슈와 시스템의 프리/슈퍼패치 사용 여부

앞서 잠시 다뤘던 것과 같이 프리패치와 슈퍼패치는 기본적으로 보조기억장치와 주 기억장치의 속도 차이를 극복하기 위해 사용되는 기술 이므로 보조 기억 장치의 속도가 빠르다면 불필요한 기술이라고도 볼 수 있다.

이에 따라, 윈도우 7이상의 운영체제에서는 SSD를 사용할 경우, 메모리 관리 기술을 자동으로 최적화하는 기능이 추가되었다. 실제로, SSD가 사용된 시스템을 조사하다보면 프리패치 파일이 발견되지 않아 당혹스러웠던 경험을 공유하는 분석가들이 많이 생긴것이 사실이다.

하지만 Windows 7이상의 모든 운영체제에서 프리패치나 슈퍼패치를 비활성화 하는 것은 아닌 것으로 보인다. 운영체제의 세부적인 버전 별로 자동 설정 여부가 다른 것으로 확인되므로, 우선적으로 프리패치와 슈퍼패치의 존재 여부를 확인한 후, 존재하지 않는다면, 아래 레지스트리와 서비스의 설정 상태를 확인하여 의도적으로 삭제한 것인지 원래 존재하지 않는 것인지를 판단하여 복구 여부를 결정하는 절차로 분석을 진행할 수 있도록 하자. 

  • 관련 레지스트리 
    • HKLM\SYSTEM\ControlSet00#\Control\Session Manager\Memory Management\Prefetch Parameter\EnablePrefetcher
    • HKLM\SYSTEM\ControlSet00X\Control\Session Manager\Memory Management\Prefetch Parameter\EnableSuperfetch
    • 각각의 키의 값은 아래의 의미를 가진다.
      0 : 사용 하지 않음.
      1 : 응용프로그램 캐싱만 사용
      2 : 부트 캐싱만 사용
      3 : 응용프로그램/부트 캐싱 모두 사용(기본 설정)
      .
  • 관련 서비스
    • 아래 서비스의 동작 여부를 확인하여 
    • Event Log | Windows Event Log (Prefetch 생성에 영향)
    • Task Scheduler (Prefetch 생성에 영향)
    • Superfetch (Superfetch 생성에 영향)



분석 대상(Target)

※ 아래의 내용은 PFP-List와 연동되는 정보로, PFP에서 확인 및 분석에 직접적인 활용이 가능합니다.
   (PFP ManualPFP DownloadPFP home)

prefetch

Target Path(Location)
%SystemRoot%\prefetch\*.pf
Check List
Check whether specific program is running or not
And execute time
Related Tools
[Public] Prefetch and Superfetch(Windows)
WinPrefetchView
WFA

Prefetch 파일의 경로와 관련 분석 도구




superfetch
Target Path(Location)
%SystemRoot%\prefetch\*.db
Check List
Pattern of specific program execution
Related Tools
[Public] Prefetch and Superfetch(Windows)
SuperfetchList
SuperfetchTree

Superfetch 파일의 경로와 관련 분석 도구


댓글 2개:

  1. 좋은 정보 공유 감사합니다

    답글삭제
  2. 글 몇줄만 제 블로그에 인용하며 명확한 출처를 남겼습니다.

    답글삭제

질문이나 조언은 언제든 환영입니다.
악의적 댓글이나 무조건적인 비방은 삼가주세요.