연재 순서
Creative Commons License

첫번째 글: NTFS 파일 시스템

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

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

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

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의 정보를 포함하고 있다.

<그림 4-1> 파일 Q.txt와 그 내부 정보

해당 파일은 Root Directory에서 AMD 디렉토리를 찾은 다음, 디렉토리 내부의 Q.txt Address로 이동하면 내부의 Attribute 중에 $Data 항목에서 내용을 확인 할 수 있을 것이다. 앞에서 Root Directory의 위치가 Cluster 813 / LBA 6504 임을 확인 하였으니, 이를 통해 AMD로 이동할 수 있다.

<그림 4-2> Root Directory에서 15번째에 위치한 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-3> WinHex 에서 확인할 수 있는 Entry(#121823)의 정보

<그림 4-4>는 AMD 디렉토리의 정보를 가지고 있는 Attribute들의 정보를 보여주고 있다. 해당 위치에는 여러 파일들의 정보가 있는데, 이 중 Q.txt는 <그림 4-4>의 하단에 위치해 있고, <그림 4-5>에서 정보를 확인할 수 있다.

<그림 4-4> Root Directory\AMD에 위치한 파일들의 정보

<그림 4-5> Root Directory\AMD\Q.txt에 대한 기본 정보

<그림 4-4>의 8번째부터 Q.txt에 대한 정보가 시작이다. 8~13번째가 Address에 대한 정보이므로, MFT Entry (#0x7F5F(HEX) / #32607(DEC)) 로 이동하여 파일의 자세한 정보를 얻을 수 있다. 해당 Address로 이동한 후, $Data 항목을 확인하니 아래의 <그림 4-6>의 정보를 확인하였다.

<그림 4-6> MFT Entry(# 32607)의 Attribute 중 $Data 항목 정보

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>에서 확인할 수 있다.

<그림 4-7> AMD-Software 파일의 기본 정보

위 파일은 Setup.exe파일로 가기 위한 경로이기 때문에, 파일의 위치만 확인하고 넘어갈 수 있다. 위의 정보를 바탕으로 MFT Entry(#0x1DBE0(HEX) / #121824(DEC)로 이동하여 같은 방법으로 Setup.exe 정보를 확인하면 아래의 <그림 4-8>와 같은 정보를 확인할 수 있다.

<그림 4-8> Setup.exe 파일의 기본 정보

목표로 하는 파일의 기본정보에 도달하였으므로, 파일의 상세 정보를 확인하기 위해 MFT Entry(#0x1DBE3(HEX) / #121827(DEC))로 이동해야 한다. 이동 후 내부 Attribute 중 $Data 항목을 확인하면 해당 파일의 정보가 어디에 위치해 있는지 Run List를 구성하여 확인 할 수 있다.

<그림 4-9> MFT Entry(#0x1DBE3(HEX) / #121827(DEC))의 $Data & Run List

Run List를 구성하였으므로, cluster 6246497로 이동하여 확인할 수 있다.

<그림 4-10> WinHex에서 확인한 Cluster 6246497의 정보

<그림 4-9>을 통해 위에서 확인한 Cluster 시작 번호와, 총 개수가 <그림 4-10>과 일치하는 것을 확인할 수 있다.

1.3 파일 복제

예시로 사용할 파일은 다음과 같다

<그림 4-11> 데이터 복제에 사용할 예시 파일. Non Resident.txt

위에서 설명해 둔 방법들을 활용하여 $Data를 찾으면

<그림 4-12> Non Resident.txt의 $Data Attribute

위의 내용을 확인할 수 있는데, 여기서 Run Data를 구하면 아래 <그림 4-13>과 같다. 그리고 파일의 크기는 0xE8E(HEX) / 3726(DEC) Bytes 이다.

<그림 4-13> <그림 4-12>의 Run List

위의 Cluster와, 파일의 크기를 확인하여 아래의 코드를 작성하였다.

<그림 4-14> <그림 4-13>의 Run List를 확인하기 위한 테스트 코드

위의 과정을 통해 디스크에 저장되어 있는 파일 데이터를 복제할 수 있다.

<그림 4-15> <그림 4-14>의 코드 실행 결과. 데이터는 모두 0xE8E Bytes 이다.

1.4 삭제된 파일 복구

다음은 삭제된 파일의 복구에 대한 내용인데, 기본적인 내용은 위의 파일 복제와 비슷하지만, 파일이 삭제되면 필요에 따라 Cluster를 다른 파일에 할당하는 경우가 생길 수도 있다. 이런 경우 파일을 복구할 수 없다. 본 문서에서 다루는 파일의 복구는 해당 파일의 데이터가 보존되어 있는 경우에 한한다. 상술해 둔 방법들을 통해 AMD 파일 내의 setup.exe 를 복구하려고 한다. 우선 파일을 삭제하고 데이터의 변화를 확인하였다. AMD- Software 내부에서 여전히 Setup.exe 파일에 대한 정보를 포함하고 있었고, 이를 통해 해당 파일의 Address 값을 통해 이동하였다. MFT Entry 내부에서 MFT Entry Header가 가진 정보 중 Flag라는 항목이 있는데, 이 항목은 파일의 상태를 나타내는 값으로, 삭제가 되면 1 ~ 3이 아닌 다른 값을 가지게 된다. 아래의 <그림 4-16>를 통해 비교해 볼 수 있다.

<그림 4-16> Flag 값이 다른 두 파일

<그림 4-16>에서 아래에 있는 값이 삭제된 setup.exe의 MFT Entry Header이다. 삭제 후 0으로 값이 변경 된 것을 확인 할 수 있다. 삭제 후에도 이름이 남아서 어떤 파일에 대한 Address 정보인지 확인 할 수 있었다. 이후 Run List 정보가 동일하여 다음의 코드를 통해 데이터를 확인하였다.

<그림 4-17> 삭제된 Setup.exe의 데이터 복제를 위한 코드

삭제 직후에는 바로 코드를 통해 지정된 위치의 값을 읽어와서 기존의 데이터와 일치하는 파일을 생성하였으나, 시간이 경과함에 따라 시스템에서 새로운 파일을 해당 Address와 영역에 할당하여 기존의 Entry정보로는 더 이상 파일에 접근할 수 없게 되었다.

<그림 4-18> Setup.exe의 Address 였던 곳에 새롭게 할당된 파일의 정보

시간의 경과에 따라 시스템에서 새롭게 파일을 할당하는 경우들이 빈번히 발생하기 때문에, 파일의 삭제 후 바로 복구하지 않으면 복구율이 떨어지는 문제가 발생하게 된다.

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

Gyu-Hwi Park

2022-12-13 02:00

Read more posts by this author