$UsnJrnl


  응용 프로그램이 특정 파일의 변경 여부를 파악하기 위해 사용한다. 기본적으로 Windows 7부터 활성화가 되어 있으며 비활성화 되어 있을 경우, Fsutil로 활성화 시 킬 수 있다. UsnJrnl은 $Max 속성과 $J 속성으로 구성되는데 $MAX는 변경 로그의 기본 메타 데이터를 저장하며 $J속성은 실제 변경 로그 레코드를 저장하고 있다.

  여기서 $J의 각 레코드들은 USN(Updata Sequence Number)정보를 가지며, 이러한 USN 정보를 통해 각 레코드들의 순서를 구분한다. 실제 USN 값은 $J 속성 내에서의 레코드의 Offset 값을 가지고 있으며, USN 값은 MFT 엔트리의 $STANDARD_INFORMATION 속성에도 저장되어 있다. UsnJrnl은 MFT 엔트리의 10번째인 $Extend 디렉터리 안에 존재하고 있다. /$Extend/$UsnJrnl 와 같은 경로를 가지고 있다.

 기록 되는 로그 데이터의 양은 일반적으로 컴퓨터를 계속 사용할 경우 1~2일 정도의 로그가 남으며, 규칙적(하루 8시간)으로 사용할 경우 4~5일 정도의 로그가 남는다.


$UsnJrnl 구조


$Max 속성의 구조

  $Max 속성은 32 Byte의 고정된 크기를 가지며 해당 속성에 저장되는 정보는 아래와 같이 로그 데이터의 최대 크기, 그리고 $UsnJrnl 파일의 생성시간, 마지막으로 현재 저장된 레코드 중 가장 작은 USN 값을 갖으며, 해당 값을 통해 $J 속성 내 첫 번째 레코드로 바로 이동이 가능하다.


$J 속성의 구조

  $J 속성은 가변적은 크기를 가지며, 로그 레코드들이 연속적으로 나열된다. 또한 속성의 앞 부분은 0으로 채워진 "Sparse Area"를 가지고 있다. 아래의 그림은 내 PC의 $UsnJrnl:$J를 나타낸 것으로 0부터 0x57800000 전 까지는 모두 0으로 채워져 있는 것을 확인할 수가 있다. 이러한 구조를 가지는 이유는 운영체제가 $J 속성에 저장되는 로그 데이터의 크기를 일정하게 유지하려고 하기 때문이다.

  $J 속성은 새로운 로그 레코드들이 할당 될 때마다 속성 끝에 추가되며, 추가된 레코드들의 총 크기가 "Allocation Size"를 넘으면 추가 레코드들을 포함하여 전체 로그 데이터의 크기가 "Maximum Size"를 넘는지 확인한다. 만약 전체 로그 데이터의 크기가 "Maximum Size"를 넘는다면 로그 데이터의 앞 부분을 "Allocation Size" 만큼 0으로 채워 "Sparse Area"로 만든다.

  따라서 $J 속성의 논리적인 크기는 계속 커지지만 실제 데이터가 할당된 영역은 일정하게 유지되며, 일반적으로 0x2000000~0x23FFFFF의 로그 데이터를 저장한다.

  MFT Reference Numbr 대신 Parent MFT Reference Number를 사용하는 이유는 전자를 사용할 경우, 해당 파일이 삭제되었을 때 전체 경로를 못 얻을 수도 있기 떄문이다. 

<Reason Flag>

<Source Information>

<File Attribute>



출처 및 참고

F-INSIGHT-NTFS-Log-TrackerKorean.pdf