hdhwang 2022. 6. 3. 01:36

1. 확장 파티션

1.1. 확장 파티션의 개념

MBR4개의 파티션을 표현 할 수 있다. 그러나 사용자들은 그것보다 더 많은 파티션들을 필요로 할 때가 있다. 이러한 경우에는 더 많은 파티션을 위해 MBR 내의 1, 2, 3 엔트리들은 그대로 사용하고 마지막 엔트리를 확장 파티션으로 만드는 것이다.

주 파일시스템 파티션(primary file system partition)MBR의 엔트리에서 지정한 한 파티션이고, 그 파티션은 파일시스템이나 다른 구조화된 데이터를 포함한다. 주 확장 파티션(primary extended partition) 또한 MBR 엔트리에서 지정한 한 파티션이고, 이 파티션에 추가적인 파티션들을 포함시킬 수 있다. 주 파일시스템 파티션과 확장 파티션을 [그림 1]에서 볼 수 있다.

[그림 1] 3개의 주 파일시스템 파티션들과 한 개의 주 확장 파티션으로 구성된 도스 디스크

 

부 파일시스템 파티션(secondary file system partition)은 윈도우에서 논리 파티셔니라고 부르며, 주 확장 파티션 내부에 위치한다. 그 파티션에서는 파일시스템이나 다른 구조화된 데이터를 포함한다. 부 파일시스템 파티션은 그것들이 확장 파티션 내에 있다는 것을 제외하고는 MBR에서 설명한 파티션들과 같다. 부 확장 파티션(secondary extended partition)은 한 개의 파티션 테이블과 한 개의 부 파일시스템 파티션을 포함한다. 부 확장 파티션들은 부 파일 시스템 파티션을 둘러싸고 부 파일시스템 파티션의 위치와 다음 부 확장 파티션의 위치를 표현한다.

 

[그림 2] 확장 파티션의 구조

 

논리 드라이브도 파티션이므로 그 정보를 기록해야 한다. 그러나 MBR의 파티션 테이블 엔트리는 주 파티션과 확장 파티션에서 모두 사용 또는 사용할 것이기 때문에 논리 드라이브의 정보를 기록할 수 없다. 그래서 확장 파티션 내의 EBR(Extended Boot Record)에 따로 기록을 하는 방식을 사용한다. , 논리 드라이브는 주 파티션이나 확장 파티션과는 다르게 MBR에 정보가 기록되는 것이 아니라, EBR이라는 독립된 공간에 따로 기록이 되는 것이다.

EBR의 기본적인 구조 자체는 MBR과 동일하다. 단지 코드 영역과 같은 부분들은 필요가 없기 때문에 사용되지 않고, 파티션 테이블 엔트리 부분만 사용한다.

[그림 3] 확장 파티션이 포함된 디스크 구조

 

확장 파티션 구조체는 MBR과 같지만, 이러한 구조체들은 연결 리스트 형태로 구성되어 있다. 시작하는 섹터 주소가 디스크 시작이 아닌 디스크 특정 지점에서 상대적이기 때문에 파티션 테이블 엔트리들은 약간 다르다. 게다가 부 파일 시스템 파티션이 시작하는 섹터와 부 확장 파티션이 시작하는 섹터 상대 주소는 서로 다르다.

부 파일 시스템 엔트리의 시작 주소는 현재 파티션 테이블에서 상대적이다. 부 확장 파티션이 파일시스템 파티션들을 감싸고 있는 것처럼 일하기 때문에 이것은 직관적이라고 할 수 있다. 그래서 파티션들은 자신들에게서 상대적인 시작 주소를 갖는다. 부 확장 파티션 엔트리 시작 주소는 주 확장 파티션에서 상대적이다. [그림 4]를 통해 좀 더 확실히 이해하도록 하자.

[그림 4] 확장 파티션의 주소
 

LBA 모드를 기준으로 주 확장 파티션이 1000번째 섹터 위치라고 할 때 확장 파티션에 존재하는 1번째 파일 시스템은 해당 확장 파티션의 시작 주소를 기준으로 위치와 크기를 지정하게 된다. 1000번 섹터 기준으로 64번째 섹터부터 파일시스템이 위치하며, 크기가 3000개의 섹터의 걸쳐 기록 하고 있다. 2번째, 3번째 역시 각각의 확장 파티션을 기준으로 시작 위치가 정해지는 것을 확인 할 수 있다. 그러나 파일 시스템이 64번째부터 시작 되는지 의문이 될 것인데 0~63번째 까지는 예약된 영역으로 현재 사용되지 않는다. 파일 시스템에 따라서 unallocated 영역의 크기가 달라지기도 하므로 BR 파티션 테이블을 참조하여 파일시스템 영역으로 이동해야 한다. unallocated 영역은 0으로 채워져 있기도 하지만 쓰레기 값이 있을 수도 있다.

부 확장 파티션의 시작 섹터 기준은 저장장치의 0번 섹터(절대 위치)이다. 부 파일 시스템이 시작되는 섹터 위치의 기준은 부 파일 시스템을 포함하고 있는 부 파티션의 시작 섹터이다.

1.2 MBR 데이터 구조체

도스 파티션 테이블은 MBR과 각 확장 파티션의 첫 번째 섹터에 존재하며, 그것들은 같은 512바이트 구조체를 사용한다. 446바이트는 어셈블리 부트 코드를 위해 예약되어 있다. 부트 코드는 컴퓨터를 시작할 때 사용해야 하므로 MBR내에 존재해야 한다.

테이블은 4개의 16바이트 엔트리이며, 파티션 타입을 포함하고 있다. 도스 파티션의 확장파티션 타입은 다음과 같다.

타입 설명
0x05 마이크로소프트 확장, CHS
0x0F 마이크로소프트 확장, LBA

2. 확장 파티션 정보 확인

디스크의 정보를 확인하는 도구는 Microsoft Management Console, HxD, winhex 등이 있다. 본 문서에서는 Microsoft Management Consolewinhex를 이용하여 디스크 정보를 확인한다.

2.1 Microsoft Management Console을 이용한 디스크 정보 확인

Microsoft Management ConsoleWindows에 내장된 도구로 제어판 관리도구 컴퓨터 관리 디스크 관리를 통해 실행 할 수 있다.

[그림 5] Microsoft Management Console을 이용한 디스크 정보 확인

시스템에 존재하는 디스크 정보를 정리하면 다음과 같다.

  디스크0 디스크1 디스크2
  파티션0 파티션0 파티션0 파티션1 파티션2 파티션3 파티션4 파티션5 파티션6
파일시스템 NTFS NTFS NTFS NTFS NTFS NTFS NTFS NTFS NTFS
사이즈 931.52GB 107.34GB 50MB 50MB 50MB 50MB 50MB 50MB 80MB
파티션 Primary Primary Primary Primary Primary Extended Extended Extended Extended

 

2.2 Winhex를 이용한 디스크 정보 확인

winhex 도구의 Tool Open Disk를 실행하여 디스크를 오픈한다. Windows Vista 이후의 운영체제에서는 사용자 계정 컨트롤(UAC)이 동작하므로, 프로그램 동작 시에 관리자 권한이 필요하다.

디스크를 오픈하면 첫 번째 섹터에 MBR이 위치한다.

[그림 6] 디스크의 MBR 확인
 
 

MBR영역의 파티션 테이블 엔트리를 확인하여 파티션 레코드 구조를 파악 할 수 있다.

  파티션 0 파티션 1 파티션 2 파티션 3
부팅 플래그 0x00(부팅 불가) 0x00(부팅 불가) 0x00(부팅 불가) 0x00(부팅 불가)
시작 CHS 주소 0x21 0x20 0x00 0x06 0x3A 0x7F 0x0C 0x14 0xDF 0x13 0x2D 0x3F
파티션 타입 0x07(NTFS) 0x07(NTFS) 0x07(NTFS) 0x0F(확장 파티션)
CHS 주소 0x06 0x39 0x7F 0x0C 0x13 0xDF 0x13 0x2C 0x3F 0xFF 0xFF 0xFE
시작 LBA 주소 0x800 0x19800 0x32800 0x4B800
섹터 크기 0x19000 0x19000 0x19000 0x129CD000

 

파티션 0 ~ 2는 주 파티션으로 각 파티션의 위치를 가리키고 있다. 그러나 파티션 3은 확장 파티션으로 부 확장 파티션 테이블의 위치를 가리키고 있다. 부 확장 파티션 엔트리 시작 주소인 309248섹터에는 부 확장 #1 파티션 테이블이 위치한다.

[그림 7] 부 확장 #1 테이블

  파티션 0 파티션 1
부팅 플래그 0x00(부팅 불가) 0x00(부팅 불가)
시작 CHS 주소 0x13 0x0E 0x60 0x19 0x27 0xBF
파티션 타입 0x07(NTFS) 0x05(확장 파티션)
CHS 주소 0x19 0x26 0xBF 0x20 0x20 0x40
시작 LBA 주소 0x800 0x19800
섹터 크기 0x19000 0x19800
 

부 확장 #1 테이블에는 부 파일 시스템 #1과 부 확장 #2를 가리키는 파티션 테이블을 포함한다. 부 확장 파티션 엔트리 시작 주소인 413696섹터(시작 섹터 주소(309248) + 상대 섹터 주소(104448))에는 부 확장 #2 파티션 테이블이 위치한다.

[그림 8] 부 확장 #2 테이블

  파티션 0 파티션 1
부팅 플래그 0x00(부팅 불가) 0x00(부팅 불가)
시작 CHS 주소 0x19 0x08 0xE0 0x20 0x21 0x40
파티션 타입 0x07(NTFS) 0x05(확장 파티션)
CHS 주소 0x20 0x20 0x40 0x26 0x1A 0xC0
시작 LBA 주소 0x800 0x33000
섹터 크기 0x19000 0x19800
 

부 확장 #2 테이블에는 부 파일 시스템 #2과 부 확장 #3을 가리키는 파티션 테이블을 포함한다. 부 확장 파티션 엔트리 시작 주소인 518144섹터(시작 섹터 주소(309248) + 상대 섹터 주소(208896))에는 부 확장 #3 파티션 테이블이 위치한다.

[그림 9] 부 확장 #3 테이블
 
  파티션 0 파티션 1
부팅 플래그 0x00(부팅 불가) 0x00(부팅 불가)
시작 CHS 주소 0x20 0x02 0x61 0x26 0x1B 0xC0
파티션 타입 0x07(NTFS) 0x05(확장 파티션)
CHS 주소 0x26 0x1A 0xC0 0x31 0x23 0x14
시작 LBA 주소 0x800 0x4C800
섹터 크기 0x19000 0x28800
 

부 확장 #3 테이블에는 부 파일 시스템 #3과 부 확장 #4를 가리키는 파티션 테이블을 포함한다. 부 확장 파티션 엔트리 시작 주소인 622592섹터(시작 섹터 주소(309248) + 상대 섹터 주소(208896))에는 부 확장 #4 파티션 테이블이 위치한다.

 

[그림 10] 부 확장 #4 테이블

 
  파티션 0
부팅 플래그 0x00(부팅 불가)
시작 CHS 주소 0x26 0x3B 0xE0
파티션 타입 0x07(NTFS)
CHS 주소 0x31 0x23 0x14
시작 LBA 주소 0x800
섹터 크기 0x28000
 

부 확장 #4 테이블에는 부 파일 시스템을 포함하며, 이후 부 확장 파티션 테이블을 갖지 않으므로 마지막 파티션임을 알 수 있다.

확인한 파티션 테이블 엔트리를 통해 파티션 레코드 구조를 파악 할 수 있다.

  디스크0 디스크1 디스크2
  파티션0 파티션0 파티션0 파티션1 파티션2 파티션3 파티션4 파티션5 파티션6
파일시스템 NTFS NTFS NTFS NTFS NTFS NTFS NTFS NTFS NTFS
사이즈 931.52GB 107.34GB 50MB 50MB 50MB 50MB 50MB 50MB 80MB
파티션 Primary Primary Primary Primary Primary Extended Extended Extended Extended

 

3. 자동화 도구 구현

3.1 클래스 및 함수 설계

ReadPartition 도구의 클래스는 단일 클래스로 이루어져 있다. 현재 시스템에 존재하는 디스크의 개수를 확인한 후, 디스크별로 할당된 파티션의 정보 출력을 수행한다.

함수 명 설명
HDD_count 현재 시스템에 존재하는 디스크 개수 확인
HDD_read 디스크 읽기
GetLocalPartition 디스크 내의 모든 파티션 검색
SearchExtPartition 확장 파티션 검색(재귀 호출)
GetPartitionTbl 디스크 내의 부트 레코드에서 파티션 테이블 저장
PrintPartitionInfo 파티션 테이블의 속성 출력

3.2 도구 테스트

구현된 도구를 통해 파티션 정보 확인을 수행한 결과 정상적으로 동작하는 것을 확인하였다.

[그림 11] 파티션 정보 확인
 
ReadPartition.zip
0.01MB

Appendix. 참고 문헌

  1. 브라이언 캐리어, 주필환, “파일시스템 포렌식 분석”, 케이앤피IT, 2010.
  2. 정준석, “임베디드 개발자를 위한 파일시스템의 원리와 실습”, 2006.
  3. 캐플 블로그, “MBR 이야기 - MBR EBR 의 파티션 테이블 엔트리 정보의 해석”, http://cappleblog.tistory.com/590