일전에 악성코드 분석하다가 Prefetch(이하 한글로 쓰죠~)에 대해서 완전 잘못알고 있다가 낭패를 본 경험이 있습니다

프리패치란 윈도우 부팅될때 윈도우가 사용할 파일들을 메모리에 올리는 것이고, 많은 윈도우 부팅시 지렁이(?) 지나갈 때 느리게 하는거군 이라고만 생각하고 있다가, 악성코드 리버싱 하는 도중에 Filemon 띄어놓고 있다가 pf파일을 만들길래 헉! pf만들어서 윈도우 부팅될때마다 실행되게 하려는구나! 라고 어처구니 없는 생각에 엄청난 삽질을 거듭했죠..;;

결론적으로 뭐 틀린말은 아니지만 위의 문단에서 가장 틀린 부분은 pf를 만든다고 윈도우 부팅될때마다 실행되는건 아니라는 것이지요. 프리패치는 사용자가 윈도우 사용중 어떤 특정 파일을 실행시킬때도 생성하게됩니다-제가 잘못 알고 있던 부분이죠-프리패치 이것도 구조가 꽤 복잡하고 뭐 그렇습니다.

먼저 prefetching이란 windows xp 이후부터 나오는 기술로 어원그대로 '先꺼내기(?)'정도로 해석할 수 있겠습니다.
 (비스타부터는 슈퍼패치라는 기술로 바뀌었어요~)
이때 Prefetching때 사용하는 파일이 프리패치파일이라고 하죠

1. Prefetching이란 Application들의 성능 향상을 위해서 구동에 필요한 데이터들을 메모리에 먼저 올려놓게 하는 것
2. Prefetch란 Prefetching시 사용하는 파일로 메모리에 올려놓으려는 정보를 담고 있는 파일을 말합니다

사용자 삽입 이미지

풀어서 설명하자면 하드디스크를 엑세스 하는 시간이 길어지면 길어질수록 '느리다'라고 할 수 있으니 그러한 작업을 최소화 하고자 데이터를 미리 메모리에 올리는 기술이라고 할 수 있습니다.
그림 아래로 내려갈수록 엑세스 속도가 느려지는 것을 확인할 수 있죠

(아.. 이 그림이 요기잉네? //컴퓨터 개론,구조,운영체제등등 다 포함되는 또 이 그림이야! 라고 하실만 하실테지만서도 이해를 돕고자..)





그렇다면 네이버 지식인님에서 자주 올라오는 "윈도우 부팅속도가 느린데 어떻게 해야하죠" 라는 답변에 "프리패치를 지우세요" 라고 답변 달아주시는 분들은 어떤생각 일까요?

물론, 윈도우는 한번이라도 실행했다면 해당 파일에 pf를 만듭니다. c:\windows\prefetch\에 들어가보시면 알겠지만, 윈도우 업데이트 받았던 것, 이런 파일도 내가 실행시켰던가? 라는 생각이 들 정도로 많은 파일들이 존재하죠

사용자 삽입 이미지

따라서, 프리패치를 지워주는 것이 어떻게 생각하면 좋을 수도 있겠죠;
위의 그림에서 보시면 알겠지만 프리패치 파일은 application_name-hash.pf 형태로 이루어져 있습니다.
(hash에 관한 정보는 다음에 올리겠습니다)

여하튼 프리패치 파일은 사용자의 삭제가 있기전까지는 절대로 지우지지 않습니다. 따라서 침해대응이나 포렌식 관련하여 중요한 정보가 된다고 합니다. 한가지 예로 침해사고가 발생시 해당 시간의 MAC 타임으로 파일들을 검색하였을 경우에 만들어진 프리패치가 있다면, 원본파일이 지워졌어도 공격자가 이런 것을 실행했었구나 얼추 계산할 수 있죠.


포스팅 내용은 이게 아니었는데 사설이 길었군요
그렇다면 본격적으로 프리패치 파일에 어떤 내용이 담겨있나 확인해보겠습니다
(사용된 이미지는 Windows XP SP2, 사용 프리패치는 노트패드로 하였습니다.)

먼저 Winhex로 해당 프리패치 파일을 오픈하였습니다.
1) 0x00 -> prefetch signature

사용자 삽입 이미지
위의 Drag된 8바이트 부분이 프리패치의 header signature 입니다. 시그니처이기 때문에 바뀔일이 없겠죠?


2) 0x58 -> 해당 파일을 실행하기 위해서 메모리에 올라와야할 파일들의 수
(바인딩 될 DLL도 있고 부수적으로 실행되야하는 exe파일, nls, ime, sdb등등)의 개수를 나타냅니다.
사용자 삽입 이미지
위의 값인 0x25 / 십진수로 바꾸면 총 36개의 파일들이 notepad 실행될 때 사용되네요


3) 0x64 -> 메모리에 올려야할 파일들의 목록이 있는 곳의 offset 값
사용자 삽입 이미지

Endian방식에 따라 00 00 29 38 offset 값으로 이동해보죠
사용자 삽입 이미지
어떤 파일들이 메모리에 올라와야 할지 확인할 수있습니다


4) 0x68 -> 메모리에 올라와야 할 파일들의 총 길이
사용자 삽입 이미지

뭐.. 예상하셨겠지만, OS에게 어디까지가 메모리에 올려야 할 부분이야 라고 알려줘야겠죠?
위의 Drag된 부분이 그 값이지요. 0x64 번지의 offset값이 가르치는 부분에서 떨어진 만큼의 값이니 이동해봅시다
(00 00 29 38 + 00 00 0F FA 부분으로 가시거나 00 00 29 38에서 go to offset 하셔서 current position으로 이동하셔도 되겠죠)
여하튼 00 00 39 32 로 이동하게 되는데 다음 그림처럼 끝 부분인 것을 확인할 수 있습니다.
사용자 삽입 이미지


5) 0x6C -> Volume Infomation Block
사용자 삽입 이미지

해당 부분은 사용되는 컴퓨터의 디스크 정보 부분입니다. 우선 이동해보죠
사용자 삽입 이미지

첫부분의 4Byte 00 00 00 28은 Volume Infomation Block의 offset값을 나타냅니다 0x28 을 십진수로 바꾸면 40이니
Drag된 부분이 Volume Infomation Block이네요.
해당 부분은 정리가 아직 덜 끝나서 몇일 후에 다시 포스팅 하기로 하고 한가지 부분만 살펴보고 넘어가겠습니다.
Volume Infomation Block부분만 따로 떼어서 0x08부분을 확인해보죠
사용자 삽입 이미지

결론부터 말씀드리면 위의 Drag한 8Byte 부분이 Volume 최초 생성 시간이 되겠습니다.
사용자 삽입 이미지
이 밖에도 Volume Serial Number, 폴더 경로의 offset, 폴더 경로의 수등 다양합니다. 해당 정보는 정리되는데로 포스팅 하겠습니다.


6) 0x78 -> 마지막 실행 시간
사용자 삽입 이미지
해당 8byte 부분이 XXX-hash.pf 의 XXX가 마지막으로 실행된 시간입니다.
마찬가지로 decode date로 돌려보면
사용자 삽입 이미지
위와 같은 시간을 얻을 수 있습니다.


7) 0x90 -> 실행 회수
사용자 삽입 이미지
vmware로 스냅샷 돌리면서 사용하니까 notepad를 4번밖에 사용안했네요 ㅎㅎ
이 걸로 내가 wow를 몇번이나 접속 했는지를 알아낼 수 있는!!!!....쿨럭(물론 더 좋은 방법도 많습니다)


물론 공부할때는 수동으로 이렇게 하나하나 보는 것이 더 도움이 되긴합니다만,
바쁜데 이렇게 사용할 수도 없는 노릇이고
그래서 역시나 이런 것을 자동으로 보여줄 수 있는 툴이 있죠

소개해 드릴 툴은 "WinPrefetchView"라는 툴입니다
사용자 삽입 이미지
해당 툴은 자동으로 c:\windows\prefetch 부분에 있는 pf파일을 읽어옵니다(다른곳에 있는 pf는 못읽어요)
위의 그림에서 1번 부분이 프리패치 파일 목록이며
2번 부분이 해당 프리패치에 기록된 선택된 application이 실행될 때 메모리에 올려진 부분이며
3번은 프리패치 파일 선택 후 우 클릭 Properties를 선택했을 때 나타나는 부분입니다.


참~! 그래도 프리패치를 사용하고 싶지않다 하시는 분들은
KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters EnablePrefetcher 값을
0으로 설정해주시면 됩니다.
0 : 사용안함
1 : Application 만 사용
2 : Boot 할 때 사용되는 것만 사용
3 : 그냥 둘 다 사용 <-- 이게 디폴트 설정값이죠


프리패치때문에 삽질했던 기억 때문에 포스팅해봤는데
다른분들한테 도움이 되었으면 좋겠네요 ㅎㅎ

Posted by 궁상박군
: