예약된 영역, FAT 영역 다음에는 데이터 영역이 온다. 데이터 영역에 저장되는 데이터는 크게 파일의 메타 정보(파일 이름, 크기, 타입, 시간 정보, 시작 클러스터 위치 등)을 저장하고 있는 디렉터리 엔트리라는 구조와 실제 파일 데이터로 나눠볼 수 있다. 다음은 데이터 영역을 간단히 나타낸 것이다.

위의 그림은 루트 디렉터리 내부에 서브 디렉터리가 하나 일때를 가정하여 나타낸 것이다. 루트 디렉터리는 FAT12/16의 경우에는 FAT 영역에 바로 따라 온다. 하지만 FAT32는 그 위치가 고정되어 있지는 않고, 예약된 영역 부트 섹터 내부의 BPB의 값(44~47;Root Directory Cluster Offset)을 통해 그 위치를 나타낸다. 하지만 FAT32도 일반적으로 FAT 영역에 따라 나온다. (지금까지 분석해온 FAT의 경우 모두 FAT 영역 다음의 첫 클러스터에 위치하였다.)

루트 디렉터리가 FAT 영역 다음의 첫 클러스터에 오지만 FAT 엔트리 0, 1번이 예약되어 사용되지 않기 때문에 첫 클러스터의 번호는 FAT 영역을 기준으로 했을 때 2번이 된다. (잘 이해가 되지 않는 분들은 앞의 글을 읽고 오기 바란다.) 루트 디렉터리는 우리가 탐색기로 루트(C:)를 클릭했을 경우 나타나는 폴더 및 파일의 정보를 담고 있다.

폴더 및 파일의 정보는 디렉터리 엔트리라는 구조를 통해 나타낸다. 각각의 폴더 및 파일은 하나 이상의 디렉터리 엔트리를 통해 표현되며, 그 크기는 32 바이트이다. 다음은 디렉터리 엔트리의 데이터 구조이다.


디렉터리 엔트리는 위의 그림과 같이 이름, 확장자, 속성, 생성 날짜 및 시간, 마지막 접근 시간, 마지막 수정 날빠 및 시간, 시작 클러스터 위치, 논리적 파일 크기 정보를 가지고 있다. 폴더를 표현할 경우 확장자가 없으므로 확장자는 표현하지 않는다. 루트 디렉터리에 위치한 특정 파일이나 폴더에 접근하고자 하는 경우 루트 디렉터리의 디렉터리 엔트리를 검색하면서 해당 파일 이름을 찾는다.

파일 이름을 가진 디렉터리 엔트리를 찾았다면 시작 클러스터 정보(Starting Cluster Hi + Starting Cluster Low)를 얻어 해당 위치부터 파일 크기 만큼 파일을 획득하면 될 것이다. 하지만 파일은 항상 데이터 영역의 연속된 클러스로 표현되지 않고 조각날 수 있기 때문에 이러한 조각난 파일 정보는 FAT 영역에서 시작 클러스터부터 따라가면서 원하는 클러스터 만큼 획득하면 된다. 파일 크기에 해당하는 클러스터를 획득한 경우에 마지막 클러스터에는 파일 슬랙이 존재할 수 있으므로 정확한 파일 데이터만 얻고자 한다면 파일 크기 만큼만 떼어내면 될 것이다.

하위 디렉터리를 탐색하고자 한다면 파일과 마찬가지로 하위 디렉터리 이름을 가진 디렉터리 엔트리를 얻어, 하위 디렉터리가 위치한 클러스터로 이동하면 될 것이다. 이동하게 되면 다시 그 클러스터에는 하위 디렉터리의 폴더 및 파일의 정보를 담고 있는 32 바이트의 디렉터리 엔트리가 연속적으로 나올 것이다.

우리가 탐색기를 열어 확인하는 파일의 이름, 확장자, 시간 정보 등은 데이터 영역의 실제 파일을 통해 얻어오는 정보가 아니라 디렉터리 엔트리만 탐색하여 얻는 정보이다. 그렇다면 숨긴 파일, 읽기 전용 파일, 시스템 파일 등은 어떻게 구분하는 것일까? 그것은 디렉터리 엔트리의 속성을 통해 가능하다. 다음은 디렉터리 엔트리의 속성(offset 11)에 나올 수 있는 값이다.

 값 (Binary)  설명
 0000 0001  Read only
 0000 0010  Hidden file
 0000 0100  System file
 0000 1000  Volume label
 0000 1111  Long file name
 0001 0000  Directory
 0010 0000  Archive

여기서 한가지 궁금한 점이 있을 것이다. 위의 디렉터리 엔트리 구조에 의하면 파일 이름을 표현하기 위해 8 바이트를 사용한다. 그렇다면 8 바이트보다 긴 파일 이름은 어떻게 표현할까? 눈치 빠른 독자라면 속성에 “0000 1111″을 갖는 긴 파일 이름 속성이 있다는 것을 발견하였을 것이다. 긴 파일의 경우에는 긴 파일 이름 (Long File Name) 엔트리를 추가적으로 사용한다. 디렉터리 엔트리에 대한 자세한 내용은 이전 글을 참조하기 바란다.

이처럼 복잡한 폴더 구조도 루트 디렉터리를 기점으로 탐색해 나가게 되면 쉽게 모든 파일을 탐색할 수 있을 것이다. 탐색하여 원하는 파일을 찾은 경우 해당 파일은 시작 클러스터 위치를 통해 FAT 영역을 확인하여 연결된 파일 데이터를 획득 한 후 슬랙 영역을 제거하면 논리적인 파일을 얻을 수 있다.

 

Tagged with:
 
  • david777seven

    안드로이드 sd 영역에서는 0×30 , 0×00 이라는 속성값도 존재하는데 어떤 값일까요?

    • proneer

      0×30 은 비트 + 마스크 연산하셔서 나올 수 있도록 구성하면 해당 속성을 가진 파일이 됩니다. 다만, 0×00에 대해서는 직접 확인해봐야 할 것 같네요. 좋은 정보 감사합니다.

  • http://www.facebook.com/people/박상호/100002191726106 박상호

    어떡해 -> 어떻게 요 ㅋㅋㅋ

    • http://www.facebook.com/proneer Jinkook Kim

      오….예리하군…ㅋㅋ

      • http://www.facebook.com/people/박상호/100002191726106 박상호

        다시 정독 중이라는.. -0-ㅎ