연재 순서
Creative Commons License

첫번째 글: NTFS 파일 시스템

두번째 글: NTFS 파일 시스템 partition data 1

세번째 글: NTFS 파일 시스템 partition data 2

네번째 글: 드라이브 내 파일 탐색

1.1. $MFT 탐색

위의 정보들을 활용하여 $MFT에 할당된 cluster를 확인해볼 수 있다. 그러기 위해 우선 헤더를 분석하고, 그 다음 내부의 Attribute 들의 정보를 확인해야 한다. Header에 FixUp이 있는 부분들은 우선적으로 FixUp을 통해 무결성을 확인하고 값을 교환해 준 다음, 다른 부분들을 확인해야 한다.

<그림 3-1> $MFT(#0)의 Entry data 중 일부 (LBA 3221225472)

1.2 FixUp 수행 방법

FixUp은 상술한 것과 마찬가지로 무결성 확인을 위해 배치해 두는 것이다. 미리 설정해 둔 값을 마커로 사용하여 데이터에 문제가 없음을 확인한 후 원래 값으로 되돌려주는 작업을 수행한 후 해당 섹터의 데이터를 사용해야 한다.

<그림 3-2> FixUp 에시. 0~FFF까지의 데이터 중 일부이다.

위의 <그림 3-2>는 Fixup을 보여주기 위해 가져온 데이터이다. 위의 데이터에서 Fixup Offset을 통해서 FixUp의 수행방법을 확인할 수 있다. 여기서는 값을 계산하는 것이 아니기 때문에 Little Endian을 유지하여 표기하도록 하겠다.

① 우선, 노란색으로 표시해 둔 것은 FixUp Offset으로 FixUp을 수행할 값들의 위치를 알려준다. ② 그다음으로 초록색으로 표기한 것은 FixUp count인데, 이는 FixUp과 연관된 숫자의 개수가 9개라는 것을 알려준다. 화살표 이후 처음 있는 0x6702 ③ 화살표를 따라서 가면 0x6702라는 숫자가 있는데, 이는 하단의 8군데의 숫자들과 같은 값을 가지는데, 이 부분이 동일하지 않으면 무결성을 통과하지 못한다. ④ 만약 ③을 통과하게 되면 그 후 주황색 상자들을 사용할 차례인데, 이 숫자들로 파란색 박스의 숫자들을 순서대로 대체하면 FixUp을 수행한 원본 자료가 된다.

<그림 3-3> $MFT(#0)의 Header Data

<표 1> MFT Entry Header 구조

<표 2> Resident Attribute Header 구조

<그림 3-4> $MFT(#0)의 $Standard Information

<그림 3-5> $MFT(#0)의 $Name

<그림 3-4>, <그림 3-5> 모두 8번째 byte 값이 0 인 것으로 Resident Type 인 것을 알 수 있다. Attribute Length를 통해 다음 Attribute 위치를 확인 할 수 있다.

<그림 3-6> $MFT(#0)의 $Data

<표 3> Non Resident Attribute Header 구조

<그림 3-7> Run List 예시. 해당 파일의 용량으로 4군데의 Cluster 묶음을 할당하였다.

<그림 3-7>을 보면 Attribute Type이 $Data인 경우 중에서 Run List를 가진 경우의 정보를 확인 할 수 있다. Run List는 2가지의 정보를 가지고 있는데, 하나는 정보가 시작되는 Cluster 번호이고, 나머지는 할당 된 Cluster의 개수이다. <그림 3-7>의 두번째에 나오는 파란색의 박스들을 보면, 1 Byte의 숫자가 b’\x43’이라고 되어있고, 그 뒤에 3 Bytes 한 박스, 4 Bytes 한 박스가 있다. 1 Byte의 숫자 중 16의 자리와 1의 자리로 구분해서 볼 때, 16의 자리 숫자는 시작하는 클러스터 번호를 나타내는데 필요한 바이트의 크기를 의미하고, 1의 자리 숫자는 클러스터의 개수를 나타내는데 필요한 바이트의 크기를 의미한다. 그리고, 바로 뒤에 이 바이트들은 바로 뒤에 따라 나오는데, Cluster count에 해당되는 정보가 먼저 나오고, 그 다음 Cluster number가 나온다. 위의 자료들을 확인하면 하단의 <그림 3-8>과 같이 볼 수 있다.

<그림 3-8> $MFT(#0)의 Run List 분석 결과

각 클러스터 구간별 시작하는 위치는, 이전 클러스터들의 시작값 들의 누적 합으로 구할 수 있다. 예를 들어, 3번째의 Start Cluster 위치는

786432 + 8945109 + 5452865 = 15195406

이다. 위의 과정을 통해 $MFT(#0)이 어디에 할당되어 있는지를 확인 할 수 있었다. <그림 3-3>의 Header를 확인한 이후, FixUp을 수행하고, <그림 3-3>의 First Attribute Offset을 따라 56번째 Byte 값인 b’\x10’ 부분부터 시작하여 Attribute Type이 Data 인 곳으로 이동하였고, Run List를 확인하여 $MFT(#0)에 할당된 Cluster를 확인 할 수 있었다. 이는 모든 파일과 디렉토리에 대한 $MFT 배열을 파악한 것이다.

1.3 Index 탐색

Root Directory 내부의 파일을 탐색하기 위해 Root Directory의 Index 정보를 확인해야 한다. Root Directory는 두번째 글의 <표 2>에서 보여준 것처럼, $MFT Entry(#5)에 해당한다. 각 Entry에 2개의 LBA를 할당하므로, $MFT(#0)을 기준으로 10개의 LBA 뒤에 해당 Entry가 존재한다. 그러므로 해당 위치를 이동하기 위해서는 Cluster 786432 + Entry #5를 계산해야 하는데, 이는 LBA 7864328 + 52에 해당한다. LBA 6291466으로 이동하여 데이터를 확인해 보면 아래와 같다.

<그림 3-9> $MFT Entry(#5) Root Directory(LBA 6291466 ~ 6291467)의 일부

<그림 3-10> $MFT Entry(#5) Root Directory의 데이터 중 Attribute Type이 $Index Allocation인 경우

$MFT(#0)의 경우와 동일하게, Attribute Type과 Attribute Length를 확인하여 $Index Allocation로 이동한 후, Run List를 분석하여 Root Directory 위치를 확인 할 수 있다. 확인하면 cluster 813, cluster count = 2를 구할 수 있다. 해당 Cluster는 Root Directory와 그 내부에 들어있는 파일들의 정보를 가지고 있다. 이를 통해서 C 드라이브에 있는 파일들의 목록과 그 파일들의 정보들을 확인 할 수 있다.

###1.4 Root Directory 탐색

앞서 얻은 cluster 813으로 이동하면 INDX로 시작하는 Signature를 확인할 수 있다.

<그림 3-11> Cluster 813 / LBA 6504의 데이터. Root Directory의 기능을 가진다.

<표 4> Index Header

두 번째 글의 <표 2>를 참고하여 <그림 3-11>에서 Index Header를 분석할 수 있다. 여기에도 FixUp을 우선적으로 수행해주어야 한다. 이후 아래의 <표 5>를 참조하여 Index Node Header를 분석해야 한다.

<표 5> Index Node Header

<표 1>의 구조를 통해 Index Offset이 b’\x40’인 것으로 확인 되었다. 그러므로 Index Entry는 Index Node Header의 시작점인 b’\x18’에서 offset만큼 떨어진 b’\x58’에서 시작인 것을 알 수 있다.

이제 <표 2>의 정보들을 참고하여 Index Entry Size만큼 구간을 나누어서 위의 정보들을 확인하고, Name Offset 이후의 정보를 통해 해당 파일의 이름을 확인할 수 있다. MFT Reference Address는 $MFT(#0)을 기준으로 MFT Entry 상의 번호를 나타낸다. MFT Entry는 LBA를 2개씩 할당하여 사용하기 때문에, Root Directory로부터 원하는 파일을 찾아가기 위해서는 각 단계마다 MFT Reference Address 들을 확인하여 해당 Entry로 이동하고, 원하는 파일에 도달한 경우 해당파일의 Attribute를 확인하여 $Data 항목을 참조하면 내용을 확인 할 수 있다.

<표 6> Index Node Header

다음 장에서 Resident 파일과 Non Resident 파일의 경우를 나누어 파일 탐색하는 과정을 통해 MFT Entry를 활용하여 파일의 데이터에 접근하는 과정을 확인 할 수 있다. 또한 이후 파일의 복제나, 삭제된 파일의 확인 및 복구하는 과정을 확인 할 수 있다.

크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 국제 라이선스에 따라 이용할 수 있습니다.
Gyu-Hwi Park's profile image

Gyu-Hwi Park

2022-12-12 09:00

Read more posts by this author