저장소 공간 관리 란?
Windows 에서 개인 사용자 들도 대용량의 데이터를 관리 할 수있는 기능을 제공하는데 소프트 웨어 RAID의 일종이다.
저장소 공간 관리와는 반대로 기업 및 기관에서 사용하는 대용량 데이터 관리 프로그램인 NAS(Network Attached Storage) 시스템은 하드웨어 RAID의 일종입니다.
Pool Storage System 이란?
여러개의 독립된 물리디스크를 하나의 풀로 묵어서 하나의 대용량 저장 공간을 구현한 시스템
저장소 공간 관리 기능에서 생성된 Disk를 Pool Disk 라고 이야기 합니다.
Pool Disk 를 만들기 위해서 먼저 20GB 크기의 vhd 파일 2개를 생성해 보겠습니다.
Pool Disk 제작에 사용하기 위해서는 초기화 까지 완료 되어있어야 합니다.
아래의 과정을 진행하면 2개의 vhd파일을 제작 할 수 있습니다.
[ 디스크 관리(diskmgmt.msc) -> 동작 -> VHD 만들기 -> 위치 지정 후 크기 20GB 생성 -> 디스크 초기화 -> MBR선택 ]
위의 작업을 2번 진행 하면 아래와 같이 vhd 파일이 2개 생성 된 것을 확인 할 수 있습니다.

볼륨 할당을 하게 되면 Pool Disk 를 만들수 없기 때문에 할당은 하지 않습니다.
이제 저장소 공간 관리를 이용해서 Pool Disk를 만들어 보겠습니다.
저장소 공간 관리 -> 새 풀 및 저장소 공간 만들기 -> 풀 만들기 -> 이름, 드라이브 문자, 파일시스템, 복원 유형 선택(저장소 공간, E: , NTFS , 단순) 를 진행하고 나서 디스크 관리를 들어가서 확인해 보면 아래와 같이 출력됩니다.

저장소 공간 관리에 가보면 아래와 같이 출력이 됩니다.

생성한 Pool Disk 이름은 저장소 공간 입니다.
저장소 공간 물리 디스크를 HxD로 불러 와서 분석을 진행해 보겠습니다.

대부분의 디스크의 1섹터는 512바이트로 0x200의 크기를 가지고 있었지만 최신 디스크 에서는 0x1000 으로 4096 바이트가 1섹터를 가지고 있습니다.
1섹터가 Pool Disk 에서는 4096바이트 라는것을 생각하면서 분석을 진행해 보면 아래와 같습니다.
0번 섹터는 MBR/GPT 파티션이 존재 하는데 GPT 파티션으로 Pool Disk가 생성 되었습니다.
0x1C6~0x1C9 를 보면 0x01 이 있는 것으로 보아 1번 섹터부터 디스크가 시작되는 것을 확인 할 수 있습니다.

1번 섹터에서는 EFI 파티션을 확인 할 수 있으며 파티션 엔트리 시작 섹터 주소가 들어있는 값인 0x1048~0x104F 를 확인해 보면 0x02로 2번섹터 부터 파티션 엔트리가 시작됩니다.
2번 섹터로 가보면 총 2개의 파티션 엔트리가 있는 것을 확인할 수 있습니다.

각각의 파티션의 첫 16바이트는 해당 파티션의 GUID 값을 가지기 때문에 값을 확인해 보면 아래와 같습니다.
GUID 값 확인 사이트 : https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs
1번 파티션 : E3C9E316-0B5C-4DB8-817D-F92DF00215AE : Microsoft Reserved Partition(MSR)
2번 파티션 : EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 : Basic Data Partition
1번 파티션은 예약된 파티션이기 때문에 볼 필요가 없습니다.
2번 파티션의 시작 섹터는 0x8100 = 33024 섹터 입니다.
33024 섹터에 가보면 NTFS가 있는 것을 확인 할 수 있습니다.

이런식으로 저장소 관리라는 이름의 물리디스크는 바로 GPT 파티션 뒤에 VBR이 존재 하지만.. 각각의 디스크(20GB)는 구조가 조금 바뀌어 있습니다.
바뀐 구조를 확인해 보기 위해서 20GB 물리디스크를 한번 확인해 보겠습니다.
앞서 20GB 파일은 MBR로 제작을 했기 때문에 MBR 영역을 확인 할 수 있습니다.

1번 섹터에서는 EFI 파티션을 확인 할 수 있습니다.

파티션 테이블 엔트리는 2번 섹터부터 진행 하는 것을 확인 할 수 있습니다.

2개의 파티션 테이블 엔트리가 존재 하는 것을 확인할 수 있고 각각의 파티션 테이블은 아래와 같은 섹터에 존재 합니다.
1번 파티션 테이블 : 0x22 섹터 ~ 0x7FFF 섹터 : 34섹터 ~ 32767섹터
2번 파티션 테이블 : 0x8000 섹터 ~ 0x27FF7FF 섹터 : 32768섹터 ~ 41940991섹터
또한 1번 파티션 테이블의 이름은 Microsoft reserved partition 이라고 되어있습니다.
예약된 파티션이라고 되어있기 때문에 2번째 파티션 테이블인 32768섹터로 가면 될 것 같습니다.
32768섹터로 가보면 아래와 같이 Pool Disk 의 특유의 파일 구조가 눈에 보입니다.

위의 hex값을 확인해 보면 시그니처로 "SPACEDB" 라는 문자열을 확인 할 수 있는데 해당 시그니처는 Storage Space Structure 에 존재 하는 시그니처 입니다.
Storage Space Structure의 Layout을 확인해 보겠습니다.

Pool Disk에 존재 하는 각각의 Virtual Disk 는 위와 같이 MBR / GPT 이후에 SPACEDB-SDBC-SDBB-SDBB- ... -SDBB 가 따라 오게 됩니다.
SPACEDB , SDBC , SDBB 에 대해서 한번 알아 보겠습니다.
먼저 SPACEDB의 예시 HEX값과 구조를 한번 알아 보겠습니다.
Pool Disk 구조는 완전한 구조 분석이 아직 와ㅓㄴ아직 없어서 추후에 계속해서 연구를 진행해보겠습니다.


SPACEDB 메타데이터는 Pool Disk 구조 중에서 가장 맨 앞에 오는 영역입니다.
대부분의 Pool Disk 구조는 빅엔디안으로 표기가 진행됩니다.
SPACEDB 메타데이터에서는 저장소 공간의 GUID , SPACEDB의 GUID 등등 여러 값을 찾아 볼 수 있습니다.
SPACEDB 메타데이터를 기준으로 정확히 0x1000 뒤에 SDBC가 존재 합니다.
여기서는 8섹터 뒤입니다.

SDBC의 구조를 살펴 보겠습니다.

SDBC 메타데이터에서는 SDBB Modified Time, SDBB Entry Size 등등 여러 정보를 구할수 있습니다.
SDBB 메타데이터를 확인해 보면 SDBC 메타데이터에서부터 정확시 1섹터뒤에 존재 합니다.

아래의 구조를 확인 할 수 있습니다.

SDBB 메타데이터는 0x10의 Header와 0x30의 DATA를 하나의 구조로 가지고 있습니다.
위의 예제에서 3개의 SDBB 메타데이터가 Chainning으로 연결 되어 있습니다.
각각의 구조의 0x08~0x0B을 확인해 보면 전부다 0x08로 되어있습니다.
그 이유는 첫번째 체인 블록이 0x08이라는 위치를 가지고 있기 때문입니다.
그렇기 때문에 아래와 같은 구조로 Chainning을 진행해서 읽어올때는 Data #1 #2 #3를 한번에 연결해서 읽어오게 됩니다.

위와 같이 SDBB Chain을 해석 할 수 있습니다.
완벽한 분석이 되지 않았기 때문에 앞으로도 더 분석해 볼 필요가 있다고 생각합니다.
추후에 시간과 기회가 된다면 다시 이어서 연구해 보겠습니다.
'File Structure' 카테고리의 다른 글
BEncode Structure Analysis (0) | 2021.03.23 |
---|---|
PDF(Portable Document Format) File Structure Analysis (0) | 2020.03.02 |
ZIP File Structure Analysis (6) | 2020.02.12 |