1. 드라이브 내 파일 위치 탐색
앞서 2장에서는 드라이브 내 Root Directory에 접근하는 방법을 확인하였다. Root Directory는 아래의 과정을 통해 접근할 수 있다.
① HDD에 접근
② LBA 1에서 기본 정보들 확인, LBA 2 ~ 33중 원하는 Partition 확인 후 해당 위치로 이동
(Number of Partition Entry, Size Of Partition Entry, First LBA)
③ 해당 Partition 정보 확인 후 Start $MFT 확인 및 이동
(Bytes per Sector, Sector per Cluster, Start $MFT, Cluster per MFT Record)
④ $MFT의 $DATA 항목(Attribute Type : b’\x80’) 에서 Run List 확인
(MFT Entry Size, $MFT – Run List)
⑤ $MFT(#5)의 $Index Allocation 항목(Attribute Type : b’\xA0)에서 Run List 확인
($MFT(#5)- Run List, Root Directory 도착)
1.1 Resident 파일의 경우
Resident 파일은 Attribute 내에 정보를 가지고 있기 때문에, 데이터 확인 과정에서 별도의 Run List를 구성할 필요가 없다. 탐색에 사용할 파일은 ‘C:\AMD\Q.txt‘ 이다. 해당 파일은 아래의 <그림 4-1>을 통해 확인 할 수 있는데, 총 8 Bytes의 정보를 포함하고 있다.
해당 파일은 Root Directory에서 AMD 디렉토리를 찾은 다음, 디렉토리 내부의 Q.txt Address로 이동하면 내부의 Attribute 중에 $Data 항목에서 내용을 확인 할 수 있을 것이다. 앞에서 Root Directory의 위치가 Cluster 813 / LBA 6504 임을 확인 하였으니, 이를 통해 AMD로 이동할 수 있다.
위의 <그림 4-2>를 확인해 보면 MFT Reference Address가 있는데, 이는 0x1DBDF(HEX) / 121823(DEC) 인데, 이는 앞서 언급한 것과 마찬가지로 $MFT Entry(#121823)이라는 의미이다. 그러므로 $MFT Entry(#121823) 의 위치는 $MFT(#0)의 위치 + 121823 * MFT Entry Size 를 통해 계산할 수 있다. $MFT(#0)의 위치는 Cluster 786432이고, MFT Entry는 LBA 2개 이므로,
$MFT Entry(#121823)의 위치 = 786432 * 8 + 121823 * 2 = LBA 6535102
이다. 이는 아래의 <그림 4-3>에서도 확인할 수 있다.
<그림 4-4>는 AMD 디렉토리의 정보를 가지고 있는 Attribute들의 정보를 보여주고 있다. 해당 위치에는 여러 파일들의 정보가 있는데, 이 중 Q.txt는 <그림 4-4>의 하단에 위치해 있고, <그림 4-5>에서 정보를 확인할 수 있다.
<그림 4-4>의 8번째부터 Q.txt에 대한 정보가 시작이다. 8~13번째가 Address에 대한 정보이므로, MFT Entry (#0x7F5F(HEX) / #32607(DEC)) 로 이동하여 파일의 자세한 정보를 얻을 수 있다. 해당 Address로 이동한 후, $Data 항목을 확인하니 아래의 <그림 4-6>의 정보를 확인하였다.
Resident Data Length가 8인데, Res Offset가 24이므로, 총 32바이트 중 24번째 Bytes 부터 총 8 Bytes의 값을 Data로 가진다. Root Directory의 위치부터 시작하여 AMD 라는 이름의 디렉토리 위치를 확인하였고, Q.txt 파일 위치를 확인한 후 내부의 정보를 확인 할 수 있었다. 이번에는 좀 더 많은 디렉토리 경로를 가진 Non Resident 파일을 확인하여 Resident 파일과 어떤 부분이 다른지 비교 할 것이다.
1.2 Non Resident 파일의 경우
이번에 탐색할 파일은 C:\AMD\AMD-Software-Adrenalin-Edition-22.10.1-MinimalSetup-221003_web\setup.exe 이다. <그림 4-3>에서 AMD-Software-Adrenalin-Edition-22.10.1-MinimalSetup-221003_web(이하 AMD-Software)으로 분기하는 것으로 탐색할 수 있다. AMD-Software 파일의 정보는 아래 <그림 4-7>에서 확인할 수 있다.
위 파일은 Setup.exe파일로 가기 위한 경로이기 때문에, 파일의 위치만 확인하고 넘어갈 수 있다. 위의 정보를 바탕으로 MFT Entry(#0x1DBE0(HEX) / #121824(DEC)로 이동하여 같은 방법으로 Setup.exe 정보를 확인하면 아래의 <그림 4-8>와 같은 정보를 확인할 수 있다.
목표로 하는 파일의 기본정보에 도달하였으므로, 파일의 상세 정보를 확인하기 위해 MFT Entry(#0x1DBE3(HEX) / #121827(DEC))로 이동해야 한다. 이동 후 내부 Attribute 중 $Data 항목을 확인하면 해당 파일의 정보가 어디에 위치해 있는지 Run List를 구성하여 확인 할 수 있다.
Run List를 구성하였으므로, cluster 6246497로 이동하여 확인할 수 있다.
<그림 4-9>을 통해 위에서 확인한 Cluster 시작 번호와, 총 개수가 <그림 4-10>과 일치하는 것을 확인할 수 있다.
1.3 파일 복제
예시로 사용할 파일은 다음과 같다
위에서 설명해 둔 방법들을 활용하여 $Data를 찾으면
위의 내용을 확인할 수 있는데, 여기서 Run Data를 구하면 아래 <그림 4-13>과 같다. 그리고 파일의 크기는 0xE8E(HEX) / 3726(DEC) Bytes 이다.
위의 Cluster와, 파일의 크기를 확인하여 아래의 코드를 작성하였다.
위의 과정을 통해 디스크에 저장되어 있는 파일 데이터를 복제할 수 있다.
1.4 삭제된 파일 복구
다음은 삭제된 파일의 복구에 대한 내용인데, 기본적인 내용은 위의 파일 복제와 비슷하지만, 파일이 삭제되면 필요에 따라 Cluster를 다른 파일에 할당하는 경우가 생길 수도 있다. 이런 경우 파일을 복구할 수 없다. 본 문서에서 다루는 파일의 복구는 해당 파일의 데이터가 보존되어 있는 경우에 한한다. 상술해 둔 방법들을 통해 AMD 파일 내의 setup.exe 를 복구하려고 한다. 우선 파일을 삭제하고 데이터의 변화를 확인하였다. AMD- Software 내부에서 여전히 Setup.exe 파일에 대한 정보를 포함하고 있었고, 이를 통해 해당 파일의 Address 값을 통해 이동하였다. MFT Entry 내부에서 MFT Entry Header가 가진 정보 중 Flag라는 항목이 있는데, 이 항목은 파일의 상태를 나타내는 값으로, 삭제가 되면 1 ~ 3이 아닌 다른 값을 가지게 된다. 아래의 <그림 4-16>를 통해 비교해 볼 수 있다.
<그림 4-16>에서 아래에 있는 값이 삭제된 setup.exe의 MFT Entry Header이다. 삭제 후 0으로 값이 변경 된 것을 확인 할 수 있다. 삭제 후에도 이름이 남아서 어떤 파일에 대한 Address 정보인지 확인 할 수 있었다. 이후 Run List 정보가 동일하여 다음의 코드를 통해 데이터를 확인하였다.
삭제 직후에는 바로 코드를 통해 지정된 위치의 값을 읽어와서 기존의 데이터와 일치하는 파일을 생성하였으나, 시간이 경과함에 따라 시스템에서 새로운 파일을 해당 Address와 영역에 할당하여 기존의 Entry정보로는 더 이상 파일에 접근할 수 없게 되었다.
시간의 경과에 따라 시스템에서 새롭게 파일을 할당하는 경우들이 빈번히 발생하기 때문에, 파일의 삭제 후 바로 복구하지 않으면 복구율이 떨어지는 문제가 발생하게 된다.