4-3.7) NTFS 주요 메타데이터 파일
2-12) NTFS 주요 메타데이터
메타데이터라는 용어는 사실 특정 데이터의 대한 정보를 제공하여 해당 데이터를 이해하고, 관리하는데 도움을 주는 것으로 다양한 형태로 존재하게 됩니다.
NTFS는 여러 메타데이터를 활용하여 파일 및 디렉토리의 정보를 관리하게 됩니다. 이런 메타 데이터의 종류와특징을 가볍게 알아보겠습니다.

1. $MFT (0번 MFT Entry)
$MFT는 우리가 이미 분석해본 것처럼 MFT Entry 를 담고 있는 파일입니다.

$MFT 메타 데이터 기본 레이아웃 NTFS에서 가장 중요한 파일이라 여겨지는 $MFT 파일로 MFT Entry 0번에 존재합니다.
NTFS는 Non-Resident 형식의 속성을 지원하며 Non-Resident 의 경우$DATA 속성의 Run List를 보면 결국엔 $MFT 파일의 클러스터를 보여주게 됩니다.
$MFT의 경우 $BITMAP 속성을 담고 있는데 이 파일에서 $BITMAP 속성은 MFT Entry의 할당을 관리하기 위해 사용됩니다.
$MFT 속성에서 $BITMAP (Attribute $B0)을 한번 살펴봅시다.

$MFT 파일 위치 : 128 (파티션 시작) + 8,533(클러스터 번호) X 8 (클러스터 당 섹터 수) = 68,392

1,943 클러스터를 한번 가봅시다. (128 + 1,943 X 8 = 15,672 섹터)

비트맵이라하면 2진수로 변환하면 이해가 매우 쉽습니다. FF FF 00 FF FF ~~~~ 7F 00 ~~~ > 1111(F) 1111(F) 1111(F) 1111(F) 0000(0) 0000(0) 1111(F) 1111(F) ~~~~~ 0111(7) 1111(F) (1이면 MFT Entry 가 사용 중, 0이면 MFT Entry 가 사용중이지 않음) 맨앞 FF 는 0~7 번 MFT Entry 가 사용중 그 다음 FF 는 8~15번 MFT Entry 가 사용중 그 다음 FF 는 16~23번 MFT Entry 가 사용중 그 다음 FF 는 24~31번 MFT Entry 가 사용중 그 다음 00 은 32~39번 MFT Entry 는 사용하지 않음 그 다음 00 은 40~47번 MFT Entry 는 사용하지 않음 ~ 그 다음 7F (44번째 bytes)은 44 X 8 인 352 부터 시작됩니다. 7F = 0111 1111 - 352번 MFT Entry 는 사용하지 않음, 353~359가 사용 중 인 것을 나타냅니다.
2. $MFTMirr(1번 MFT Entry)
MFT Entry의 처음 부분에 담긴 메타 데이터 파일들을 매우 중요하기 때문에 NTFS는 MFT Entry의 복사본을 두는데 이 파일이 그것을 담고 있다.
최소 4개의 MFT Entry이상의 복사본을 자신의 $DATA 속성에 담고 있습니다. 그러나 해당 메타 데이터 파일의 내용의 복사본을 또 가지는 것은 아닙니다.
단지 메타 데이터 파일의 MFT Entry 내용의 복사본을 가지고 있기 때문에 MFT Entry의 내용만 복구 시킬 수 있는 것이지요. 볼륨의 클러스터 크기가 MFT Entry 크기의 4배인 경우(클러스터크기 4KB) $MFTMirr 파일은 0~3번 MFT Entry의 백업본을 저장합니다.
만약 클러스터 크기가 4KB보다 크다면 $MFTMirr 파일은 한 클러스터에 들어갈 만큼의 MFT Entry의 백업본을 저장하게 됩니다. $MFT 에서 1번 MFT Entry 로 가봅시다. 오프셋 1024

$MFT의 복사본의 $DATA속성을 분석하면 2번 클러스터에 MFT 복사본 데이터가 있는것을 확인할 수 있으며 $MFTMirr 의 경우 $MFT와 달리 $Bitmap 속성이 없는 특징이 있습니다.
3. $LOG_FILE(2번 MFT Entry)
이 파일은 볼륨에서 일어나는 트랜잭션에 대한 정보를 담는데, 이 메타데이터는 추후에 따로 상세분석을 해보도록 합시다.
4. $Volume(3번 MFT Entry)
$VOLUME_INFORMATION 속성은 NTFS의 버전 정보를 담고 있는 속성이며 NTFS의 버전 정보를 담고 있습니다.
$VOLUME_NAME 이라는 속성으로 볼륨의 이름을 담고 있다. 이 속성이 담고 있는 볼륨의 UTF-16으로 인코딩 되어 있습니다. [Volume MFT Entry의 VOLUME _NAME 속성($60)]

VOLUME _INFORMATION 속성은 볼륨의 버전과 정보를 담고 있는 속성입니다. 버전은 메이저 버전과 마이너 버전 두 가지가 존재하는데, 볼륨을 포맷하면 OS별로 다른 값들이 저장됩니다. 그런데 너무 오래전 버전이긴 하네요!
[Volume MFT Entry의 VOLUME _INFORMATION 속성($70)]


5. $AttrDef (4번 MFT Entry)
4번 MFT Entry 를 분석하려고 봣더니 클러스터가 단편화되어 저장된거 같습니다. DATA runlist를 분석하면 되겠지만 FTK Imager를 이용하여 파일 내에서 오프셋 이동을 해보겠습니다.
먼저 MFT Entry 분석을 빠르게 해보겠습니다.

이동 한 뒤 물리 섹터를 확인하고 Active Disk Editor에서 살펴보겠습니다. 물리 섹터 번호 -> 68,400 섹터(환경마다 다를 수 있습니다.)

[$AttrDef 위치 : 68,400 섹터]
속성을 보면 특별한 속성 없이 $SI, $File_name, $DATA가 있습니다. 데이터 영역을 바로 확인해보겠습니다. 36번 클러스터를 가리키네요!

128 + 35 X 8= 408섹터 우리 눈에 익은 속성의 이름들이 표시되고 있습니다.

AttrDef 에는 모든 속성에 대한 여러 가지 정보를 담고 있습니다.(속성에 대한 Type ID, 이름 등)


- 속성 이름 : $STANDARD_INFOMATION - 속성 Type ID : 10 00 00 00 - Display Rule : 00 00 00 00 - Collation Rule : 00 00 00 00 - Flags : 40 00 00 00 00 > 20 00 00 00 : Index 담기는 속성 / 40 00 00 00 : Resident 형식만 가능 80 00 00 00 : Non-Resident, Resident 모두 가능 [참고] Collation Rule

NTFS의 모든 속성의 Type ID 값은 기본적으로 정해져 있지만, 이 항목을 통해 특정 속성의 Type ID를 자신이 원하는 값으로 다시 정의할 수 있다고 하네요!
6. 루트디레토리[.] (5번 MFT Entry)
루트디렉토리는 이미 여러번 분석해봤기 때문에 실습은 없이 특징만 알아보겠습니다.
최상위 디렉토리라는 것 외에는 일반적인 디렉토리와 다를 것이 없습니다.
$FILENAME이 "." 인 것은 이미 잘 알고 있을거라고 생각되네요!
볼륨이 이 디렉토리에 대한 Reparse Point를 가진다면 다른 이름으로 저장될 수 있습니다. 그에 대한 정보는 $MountMgrDatabase 속성을 조사하면 알 수 있다고 하네요.
특이한 점은 모든 메타 데이터 파일들로 루트 디렉토리에 포함되어 있는 구조로 되어 있다는 것입니다.
루트 디렉토리 MFT Entry 속성 Layout

7. Bitmap(6번 MFT Entry)
위에서 $MFT Entry 의 $bitmap 속성의 경우 MFT Entry의 사용 여부를 표시했다면 6번 MFT Entry 는 파일시스템의 클러스터에 사용 여부를 bitmap으로 표시하고 있습니다. [$BITMAP의 MFT Entry (68,404 섹터 환경마다 다를 수 있음)_FTK Imager로 섹터 번호 확인]

해당 BITMAP 데이터 영역을 가면 클러스터가 사용중임을 알 수 있는 BITMAP을 확인할 수 있습니다.

8. Boot (7번 MFT Entry)
파일로 부트 레코드 영역을 담고 있는 영역 입니다.
$DATA 속성은 언제나 Non-Resident 형식이며 Start LCN도 언제나 0번 클러스터로 고정됩니다.
볼륨의 0번 클러스터에 부트 레코드가 담겨 있기 때문에 NTFS는 볼륨의 모든 부분을 클러스터로 관리하고 있음을 알 수 있습니다. [$BOOT MFT Entry 위치 : 68,406 섹터] $BOOT의 DATA 속성을 보면 시작 클러스터를 가리키는 데 0을 알려줍니다. 즉, NTFS의 BR 위치를 알려주고 있네요!

9. $DATA(8번 MFT Entry)
이 파일의 $DATA 속성은 볼륨과 동일한 크기로 사용 중인 것처럼 설정되어 있지만, Reparse 형태로 되어 있기 때문에 실제 볼륨상의 어떤 클러스터도 내용을 담고 있지 않는다고 합니다.
배드 클러스터가 생길 때마다 NTFS는 해당 클러스터를 이 파일의 Cluster Run에 추가합니다.
이 파일에 연결된 클러스터들은 앞으로 절대 접근 하지 않습니다. [$BadClus 위치 : 68,408 섹터] - 베드 클러스터가 없어서 따로 연결된건 없는거 같습니다.

10. Secure (9번 MFT entry)
NTFS 파일 시스템에서
$Secure메타데이터 파일은 보안 디스크립터(Security Descriptors)를 저장하는 데 사용됩니다.보안 디스크립터는 파일 및 디렉토리에 대한 접근 제어 및 감사 정보를 포함하는 데이터 구조입니다.
$Secure파일은 이러한 보안 정보를 효율적으로 관리하고 저장하기 위해 사용됩니다.$Secure 파일: 보안 디스크립터를 중앙에서 관리하고 저장하는 NTFS 메타데이터 파일입니다. - 주요 구성 요소: $SDS, $SII, $SDH - 보안 디스크립터 구성 요소: Owner, Primary Group, DACL, SACL
사실 이건 윈도우 운영체제와 보안관련해서 밀접한 관련이 있는 파일로 이번 파일시스템 친해지기에서는 이런게 있구나 하는 정도만 하고 보고 넘어가도록 하겠습니다. (추후에 분석이 필요하면 그때 알아 보도록하죠!) [$Secure 위치 : 68,410 섹터]

11. UpCase (10번 MFT Entry)
NTFS 파일 시스템에서 사용하는 특수한 메타데이터 파일입니다. 이 파일은 대소문자 변환 테이블을 포함하고 있으며, 파일 시스템이 대소문자를 구분하지 않고 파일 이름을 비교할 수 있도록 돕습니다.
NTFS는 대소문자를 구분하지 않는 파일 시스템이지만, 대소문자를 보존하는 특성을 가지고 있기 때문에 이러한 변환 테이블이 필요합니다. [$UpCase 위치 : 68,412 섹터]

3번 클러스터로 가보도록 하겠습니다. (128 + 3 X 8 = 152) [152 섹터]

12. Extend (11번 MFT Entry)
NTFS 파일 시스템에서 "Extend" 메타데이터는 파일 시스템의 특정 기능과 구조를 지원하는 여러 중요한 시스템 파일들을 포함하는 MFT (Master File Table) 항목들을 지칭합니다. 이들 파일은 NTFS 파일 시스템의 동작과 관리에 필수적입니다.
Extend 메타데이터 파일들
$ObjId (Object ID):
각 파일 및 디렉토리에 고유한 식별자를 할당하는 데 사용됩니다.
분산 링크 추적 서비스에서 파일이나 디렉토리의 이동을 추적하기 위해 사용됩니다.
$Quota:
디스크 할당량 관리 정보를 저장합니다.
사용자나 그룹별로 디스크 사용량 제한을 관리하기 위해 사용됩니다.
$Reparse:
리파스 포인트 정보를 저장합니다.
심볼릭 링크, 정션 포인트, 볼륨 마운트 포인트 등의 특수한 파일 시스템 동작을 지원합니다.
$UsnJrnl (Update Sequence Number Journal):
파일 시스템의 변경 사항을 기록합니다.
데이터 복구, 파일 동기화, 파일 시스템 이벤트 추적 등의 기능을 지원합니다.
$Extend:
Extend 디렉토리는 위에 언급된 시스템 파일들을 포함합니다.
이 디렉토리는 NTFS 파일 시스템의 특정 메타데이터 파일들을 구조적으로 관리하는 데 사용됩니다.
[$Extend 위치 : 68,412 섹터]

윈도우의 NTFS 파일시스템 사용흔적을 분석할때 매우 중요한 몇몇 메타데이터 파일들은 다시 살펴보도록 합시다. $UsnJrnl, $Log_File 의 경우 추후에 상세 분석을 해보도록 하겠습니다. (분석에 많은 시간이 소모되며 분석에 익숙한 상태에서 해야 빠르기에 추후에 더 친해지기 / 놀아보기 시리즈에서 확인해보도록 합시다.)
Last updated