1. FAT( File Allocation Table )


FAT은 디지털 카메라 등에 장착되는 대부분의 메모리 카드와 수많은 컴퓨터 시스템에 널리 쓰이는 컴퓨터 파일 시스템 구조이다. FAT 파일 시스템은 상대적으로 간단하기 때문에 플로피 디스크, 플래시 메모리 카드, 디지털 카메라 및 다른 수많은 휴대용 기기에서 흔하게 볼 수 있다. FAT의 성능은 다른 대부분의 파일 시스템에 견주어 좋지 않은 평을 받는다. 그 까닭은 운영 시간을 낭비하게 만드는 너무나도 단순한 자료 구조를 이용하고 조그마한 파일이 많이 있으면 디스크 공간을 잘 활용하지 못하기 때문이다.



2. FAT32


2기가바이트 이상의 하드디스크를 지원하며, 윈도우 95 OSR2부터 이 파일 시스템을 사용할 수 있다.

FAT32에서는 하나의 파일은 최대 4기가바이트 - 1바이트의 용량을 가질 수 있다. 하나의 파티션이 최대 8테라바이트의 용량을 가질 수 있고, 최대 268,435,437개의 파일을 담을 수 있다. 윈도우 98, 윈도우 Me와 같은 구형 운영체제나, 리눅스, OS X와 같은 운영 체제에서 윈도우와 호환성이 필요할 때, 또는 디지털카메라, 게임기 등에서도 이용된다.



3. FAT32 파티션 구조


FAT32의 파티션 구조는 아래 그림과 같으며 여기서는 Boot Sector의 구조에 대해 알아보고 실제 데이터가 있는 위치까지 추적하는 방법에 대해 알아보자.


Boot Sector

(VBR) 

Reserved 

FAT 

FAT Mirror

Root

Directory 

Data

Area 


Boot Sector는 MBR 구조와 같이 특정 오프셋 별로 가리키는 의미가 다르다.


① Boot Code : 0 ~ 2 byte

② BIOS Parameter Block : 3 ~ 8 byte

③ Boot Code와 Error Message : 90 ~ 509 byte

④ 시그니처 2byte : 510 ~ 511 byte



이제 FAT32의 BR 영역에 대해 알아보자.( 사용하지 않는 영역에 대해서는 따로 언급하지 않겠다. )


FAT 32의 BR 구조는 위와 같이 나타낼 수 있다. 각 영역의 의미는 다음 표와 같다.


의미 

내용 

 Jump Boot Code

 Boot Strap Code로 점프하기 위한 부분이다.

OEM Name 

 OEM 회사를 나타내는 문자열. FAT32는 MSDOS 5.X

Byte Per Sector 

 한 섹터가 몇 byte로 구서되어 있는지를 나타낸다. 기본 512 byte

SP 

 클러스터를 구성하는 섹터의 수. 기본적으로 8개의 섹터를 사용

RS( Reserved Sector ) 

 예약된 섹터의 개수

FAT 개수 

 FAT의 개수를 나타낸다. FAT32는 기본 2개

Media Type 

 볼륨이 어떤 미디어 매체를 이용하는지를 나타낸다.

Total Sector 32 

 파티션 상의 총 섹터 개수

FAT Size 32 

 FAT 영역의 섹터 수. 단, FAT 1개에 대한 크기

File System Version 

 FAT32의 버전 정보

Root Directory Cluster 

 루트 디렉터리의 시작 위치

File System Information 

 FSInfo 구조체에 대한 정보가 어디에 저장되어 있는지를 나타낸다.

 BR 기준 보통 1번 섹터에 저장된다.

Boot Record Backup Sector

 BR이 백업된 섹터 번호를 나타낸다. 기본 값으로 6을 사용한다.

Volume ID 

 볼륨 시리얼 번호를 나타낸다.

Volume Label( 1, 2 ) 

 볼륨의 이름을 기록

File System Type 

 해당 파일 시스템의 타입을 나타낸다. FAT32의 값을 저장한다.


Reserved 영역은 예약된 파일시스템에 대한 정보를 구조체로 저장하고 있으며, BR에 대한 백업 본을 저장하고 있다. FAT 영역의 경우 클러스터의 상태 값을 가지고 있는 영역으로써, 각각의 클러스터 정보는 4byte로 나타나게 된다.



- FAT 영역

① 4byte는 미디어 타입을 나타내며, F8 FF FF 0F는 하드디스크를 나타낸다.

② 4byte는 파티션의 상태를 나타낸다. 파티션의 상태는 보통 FF FF FF FF로 나타나게 된다.

③ 4byte는 루트 디렉터리의 클러스터 정보를 나타낸다.

④ 실제 데이터의 연속된 클러스터 공간할당 영역을 나타낸다.



4. 루트 디렉터리 추적


FAT32.vhd.zip

위 실습 파일을 다운로드 하여 압축을 푼다. 그리고 HxD의 '기타설정 > 디스크 이미지 열기' 메뉴로 열고 첫 번째 파티션의 시작 위치로 이동하면 다음과 같은 화면을 볼 수 있다.

실제 데이터 정보를 담고 있는 루트 디렉터리의 위치를 알아내기 위한 정보만 짚고 넘어가자.



FAT32의 BR 영역에서 필요한 정보만 분석해보면 아래 표와 같다.


의미 

내용 

BS 

0x0200 

SP 

0x04 

RS 

0x19F6 

FAT 개수 

0x02 

Total Sector 32 

0x00062800 

FAT Size 32 

0x00000305 

Root Directory Cluster 

0x02

File System Information 

0x01

Boot Record Backup Sector 

0x06


루트 디렉터리로 가기 위해서는 FAT Area의 위치를 알아야 한다. FAT Area의 주소는 다음과 같이 구할 수 있다.

128 ( BR 주소 ) + 6,646( Reserved Sector( 0x19F6 ) ) = 6,774 섹터


6,774번 섹터로 이동하게 되면 FAT의 구조를 볼 수 있다. 아래 그림에서 00으로 채워진 공간은 사용하지 않는 FAT Area 영역이다.



루트 디렉터리로 가기 위해서는 FAT 주소에 FAT 크기의 2를 곱한 값을 더해주면 된다. 2를 곱해주는 이유는 FAT의 개수가 기본적으로 2개이기 때문이다.

6,774 + ( 773( 0x0305 ) * 2 ) = 8,320 섹터




8,320 섹터로 이동하게 되면 우리가 원하던 데이터에 대한 정보를 저장하고 있는 루트 디렉터리를 볼 수 있다. 이제 루트 디렉터리의 구조에 대해 알아보자.



- Name : 파일에 대한 이름을 나타낸다. 첫 번째 byte가 0xE5로 시작되면 삭제된 파일을 나타낸다. 삭제된 파일을 나타내는 0xE5를 다른 문자열로 바꾸면 해당 파일은 복구할 수 있다. 0x00이면 사용하지 않는 영역이다.

- Extension : 파일 확장자

- Attr : 파일에 대한 속성이다.

- Reserved : 예약된 영역

- Create Time Tenth : 생성 시간을 1/100초 단위까지 측정. 0~199의 값을 사용

- Create time : 파일이 생성된 시간을 나타낸다. 시간 변환은 A6 93이라는 정보가 저장되어 있다고 하면, 93 A6( 리틀엔디안 방식 )을 2진수로 변환하여 각각의 2진수를 우측에서 좌측으로 5자리, 6자리, 5자리씩 끊어주면 된다. 초단위의 경우 5비트를 사용한다. 즉, 0 ~ 31까지 표현할 수 있기 때문에 60초를 표현하기 위해 2를 곱해주어야 한다. 

- Create Date : 파일이 생성된 날짜를 나타낸다. 날짜 변환은 82 48이라는 정보가 저장되어 있다고 하면, 48 82( 리틀엔디안 방식 )를 2진수로 변환하여 각각의 2진수를 우측에서 좌측으로 7자리, 4자리, 5자리로 끊어주면 된다. 년단위의 경우 기준이 1980년이기 때문에 계산한 값에 1980을 더해주면 된다.

- Last Accessed Date : 파일에 마지막 접근된 날짜

- Starting Cluster Hi : 파일에 대한 클러스터 상위 값

- Last Written Time : 파일에 대한 마지막 수정시간

- Last Written Date : 파일에 대한 마지막 수정 날짜

- Starting Cluster Low : 파일에 대한 클러스터 하위 값

- File Size : 파일에 대한 크기


8,320 섹터에 있는 실제 데이터를 루트 디렉터리 클러스터 오프셋 별로 분석해보면 NCS.txt 파일과 DISK.jpg 파일이 존재한다는 것을 알 수 있다. NCS.txt 파일을 살펴보면 파일의 크기는 0x0D로 13 바이트이고, 파일의 생성 시간은 0x7490으로 14시 36분 16초다. 그리고 생성 날짜는 각각 0x4A9C로 2017년 4월 28일 임을 알 수 있다.


마지막으로 실제 데이터가 있는 위치를 찾아가기 위해서는 다음과 같이 계산하면 된다.

Cluster Hi + Cluster Low = 00 00 + 00 08 = 8

( 8 - 2 ) * 4 ( SP ) = 24

8,320 + 24 = 8,344



Hello world!! 라고 데이터가 저장되어 있음을 확인할 수 있다.

Posted by Imp3rio