본문 바로가기

My Study/Programming&Theory

GetFileTime 신뢰도

이것저것 작업을 하고 있는데 문득 든 생각.. NTFS 상에서 해당 파일의 메타데이터 영역 즉, MFT Entry 영역에서 

$STANDARD_INFORMATION 영역에 있는 시간 값과 유저에서 호출되는 GetFileTime 을 사용해 얻는 시간 값이 다를 수가 있을까??.. 만약 다를 수 있다면 GetFileTime 은 신뢰해선 안되는걸까??..


사실 이런 생각한 이유가 어떤 글을 읽고 든 생각이었는데 아무튼.. 내가 잘못 읽었던거같다.


길게 설명할 건 없으니 분석한 내용을 짧게 설명하고 결론을 내겠다.

1. GetFileTime은 내부적으로 NtQueryInformationFile 를 호출한다. 

(커널에서 또 호출되므로 NtQueryInformationFile 커널코드 설명)


2. NtQueryInformationFile는 내부적으로 GetFileTime 첫번째 인자로 넘어온 파일 핸들을 ObReferenceObjectByHandle 사용해 파일 오브젝트 주소를 얻는다.(FILE_OBJECT)


3. 얻은 파일 오브젝트를 관리하는 디바이스 오브젝트 주소를 구한다.(IoGetRelatedDeviceObject 사용)

당연히 해당 디바이스를 생성한 드라이버는 FltMgr..!


4. 그리고 얻은 파일 오브젝트와 디바이스 오브젝트를 가지고 FastIoQueryBasicInfo 호출


이제 모든 처리는 IRP를 받은 파일시스템드라이버가 알아서 한다. 파일 시스템 드라이버에선 당연히 해당 파일 메타데이터 영역의 $STANDARD_INFORMATION 영역에서 시간 값을 가져온다. (UTC +0시간임)


그리고 우리가 윈도우 탐색기 상에서 보이는 시간은 레지스트리에 존재하는 타임존 시간에 맞춰져서 UTC+9 해서 보이는 것이다.


끝..


결론 : GetFileTime 함수는 믿어도된다.  ( 후킹만 안되어있다면.. ;; )

비록 1+1=2와 같은 답을 알면서도 해본 뻘짓이지만 1%라도 해깔리는 부분은 증명을 해야한다.