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 |