본문 바로가기

Forensics/Disk Forensics

$UsnJrnl

NTFS 파일시스템에서 발생하는 모든 파일 및 디렉터리의 변경사항을 기록해 놓은 로그이며 $UsnJrnl 파일명 안에 2개의 스트림($J, $Max)으로 나누어 저장되어 있다.

 

$J는 변경 로그를 저장하고 있으며 $Max는 변경 로그의 기본 메타데이터로 32byte이다.

 

Windows 7부터 활성화가 되어 있으나 비활성화되어 있을 경우 fsutil 명령어로 활성화시킬 수도 있으며 이 명령어로 $UsnJrnl 크기를 변경할 수 있다.

fsutil usn createjournal m=1000 a=100 i:
fsutil usn [createjournal] m=<MaxSize> a=<AllocationDelta> <VolumePath>

 

$UsnJrnl 파일은 처음에는 비어있는 파일로 생성되며 볼륨에 변경사항이 생길 때마다 레코드에 변경을 기록한다. $UsnJrnl 파일은 보통 34MB를 최대 로그 사이즈로 가지며 하루 8시간 사용하는 경우 4~5일 정도의 로그가 저장된다.

 

1. $Max 속성

$Max 속성은 로그 데이터 최대 크기, $UsnJrnl 파일 생성시간, 현재 저장된 레코드의 가장 작은 USN 값을 저장하고 있으며 이 값을 이용하여 $J 속성의 첫 번째 레코드로 이동할 수 있다.

Offset Size Stored Information Detail
0x00 8 Maximum Size 로그 데이터의 최대 크기
0x08 8 Allocation Size 새로운 데이터가 저장될 때 할당되는 영역의 크기
0x10 8 USN ID $UsnJrnl 파일의 생성시간(FILETIME)
0x18 8 Lowest Valid USN 현재 저장된 레코드 중 가장 작은 USN 값

이를 통해 $J 속성 내 첫 번째 레코드로 바로 이동 가능

 

2. $J 속성

$J 속성은 로그 레코드를 연속적으로 저장하며, 아래 그림과 같이 속성의 앞부분에는 0으로 채워진 "Sparse Area"가 존재한다. 새로운 로그 레코드는 $J 속성의 끝부분에 추가된다.

여기서 $J의 각 레코드들은 USN(Update Sequence Number) 정보를 가지며, 이러한 USN 정보를 통해 각 레코드들의 순서를 구분한다. 실제 USN 값은 $J 속성 내에서의 레코드의 Offset 값을 가지고 있으며, USN 값은 MFT 엔트리의 $STANDARD_INFORMATION 속성에도 저장되어 있다.

 

$UsnJrnl은 MFT 엔트리의 10번째인 $Extend 디렉터리 안에 존재하고 있다.

Offset Size Stored Information Detail
0x00 4 Size of Record 레코드 크기
0x04 2 Major Version 2(현재 일반적으로 사용되는 Change Journal Software의 버전은 2.0)
0x06 2 Minor Version 0
0x08 8 MFT Reference Number 현재 변경 이벤트가 적용되는 파일 혹은 디렉터리의 MFT Reference Number
0x10 8 Parent MFT Reference Number 현재 변경 이벤트가 적용되는 파일 혹은 디렉터리와 부모 디렉터리의 MFT Reference Number

$MFT 정보와 조합하여 전체 경로 획득 가능
0x18 8 USN Update Sequence Number
0x20 8 TimeStamp(FILETIME) 이벤트가 발생한 시각(UTC +0)
0x28 4 Reason Flag 변경 이벤트 정보 플래그
0x2C 4 Source Information 변경 이벤트를 발생시킨 주체에 대한 정보
0x30 4 Security ID 보안 ID
0x34 4 File Attributes 변경 이벤트의 대상이 되는 객체에 대한 정보

일반적으로 대상이 파일인지 디렉터리인지 구분
0x38 2 Size of Filename 객체 이름 정보의 크기
0x3A 2 Offset to Filename 객체 이름 정보의 레코드 내 위치
03C N Filename 현재 변경 이벤트가 적용되는 객체(파일 혹은 디렉터리)의 이름

 

디지털 포렌식 관점에서 보면 데이터 복구가 필요하면 $LogFile을 이용하여야 하고 전반적인 이벤트 변경 정보가 필요하면 $UsnJrnl 파일을 이용하여야 한다. 밑의 표는 두 파일의 비교표이다.

구분 $UsnJrnl $LogFile
기록 정보 파일/디렉터리 변경 원인 정보 기록 파일/디렉터리 변경 이전/이후 상태 정보의 기록
데이터 복구 가능 여부 불가능 가능
위치(Default) 운영체제 볼륨에만 존재 모든 볼륨에 존재
논리적 파일 크기 계속 증가 고정
비할당 영역 이전 레코드 기록 존재 이전 레코드 기록 없음
파일에 할당된 클러스터 수 (Maximum size + allocation delta)/Cluster 내에서 가변적 불변

'Forensics > Disk Forensics' 카테고리의 다른 글

GPT(GUID Partition Table)  (0) 2025.02.09
NTFS  (0) 2025.02.04
FAT  (0) 2025.02.03
파티션과 MBR  (0) 2025.02.03
파일시스템 관련 기본개념  (0) 2025.01.26