※ 해당 글에 대해 무단 재배포 및 상업적으로 사용하실 수 없습니다.
HFS+
소개
• Hierarchical
File System Plus의
약자
• HFS의 개량 버전
• 애플 메킨토시 컴퓨터 및 기타 MAC
OS를 사용하는 시스템의 파일 시스템
• 파일이나 폴더 이름에 UTF16으로 인코딩
• NTFS와 마찬가지로 n-forked
파일 시스템
• 32
bit의 Allocation Mapping Table 이용
※ n-forked : 하나의 파일 시스템 오브젝트에 여러 개의 임의의 길이의 데이터를
연관시킬 수 있음
HFS+ 구조
테스트 환경
• OS :
Mac OS X 10.8 ver
• 분석 HDD : SCSI HDD 10GB
• File
System : HFS+
• Mount
Pointer : /Volumes/TEST
• Create
File : test(text file)
• Data
: hello Mac
Volume Header
• 예약된 영역(1024
byte)는 사용 안함
• 섹터 2개 이후 Volume Header가 위치
• HFS+의 시그니처, 볼륨 정보, Catalog File 정보 등
• 대체 볼륨 헤더로 알려진 볼륨 헤더의 복사본은 볼륨이 끝나기
전에 1024바이트부터 저장
• 볼륨 헤더는 5개의 특별한 파일, 파일 시스템 페이로드를 액세스 하는 데 필요한 파일
시스템
구조를 저장
• the
catalog file / the extents overflow file / the allocation file / the attributes
file /
the startup file 등의
정보를 찾아가는데 필요한 정보를 기록
• 파일의 정보를 찾기 위해서 Catalog
File를 분석
Volume Header 구조
<Volume Header>
<Block Size>
- Block Size 확인(Big Endian)
<Catalog File>
- Volume Header에서의 Catalog File의 위치 확인
- HFSPLUSForkData 구조로 속성 파일의 위치와 크기 기록
- Catalog File의 첫번째 시작은 0x00008650
- 계산
방법 : catalog
file start block *
block
size = Offset
=> 0x8650 * 0x1000 = 0x8650000
- Catalog
File의 Offset은 해당 파티션의 시작 위치를 기준
- 섹터 단위로 이동 하기 위해서 해당 값을 계산
- 계산 방법 :
0x8650000 ->
10진수 변환 ->
140836864 / 512 =
275072
- 파티션의 시작 위치 +
Catalog File 위치 // Sector 단위
=> 409640
+ 275072 =
684712 sector
- 해당 섹터에 Catalog
File의 정보가 기록되어 있음
Catalog File
• B-tree
파일로 구성되어 있음
• Header
Node, Index Node, Leaf Node로
구성
• 첫 번째 Node는 Header Node
• 각 파일이나 폴더에서 Catalog
File 고유의 Catalog Node ID 가 할당됨(CNID)
• catalog
File에서 기본 node 크기 4KB, Mac OS x에서는 8KB
• 파일의 계층 구조 저장(위치, 크기)
• 일반적으로 root
node 위치, leaf record 개수, first leaf node 위치, last leaf node,
node size 등을 확인
Catalog File 구조
<Catalog File> <Header Node> <Node 구조>
<Catalog File>
<Node Descriptor>
- Node 분석시 먼저 Node Descriptor의 Type 확인
- Header Node에서 확인 및 레코드 수 3개 확인
※ Node 분석시 항상 Node의 종류부터 확인해야 함
값 |
종류 |
-1 |
Leaf node |
0 |
Index node |
1 |
Header Node |
2 |
Map Node |
<종류에 따른 값>
<B-tree Header Record>
- Node의 Header 정보에서 Root Node의 노드 번호와 Node size를 확인
- Root
Node로 이동
- 계산 방법 : root
node * node size = (Catalog File 기준)offset
=> 0x03 *
0x2000 / 512 => 48 + 현위치(684712)
= 684760
Root Node 구조
<Root Node>
- Index
Node 정보는 Record에 순차적 기록
- Node
ID를 보고서 해당 Node의 위치를 파악
- “TEST”의 Child Pointer로 이동하면 만든 test 파일의 Node를 확인 가능
- Node
4번 위치로 이동 방법
=> 0x04
* 0x2000 / 512 +
684712(기준점) = 684776 sector
Leaf Node 구조
<Leaf Node>
<Node Descriptor>
- Leaf
Node의 Type은 -1(0xFF)
- Leaf
Node는 파일과 디렉터리의 기본 정보와 데이터의 위치를 기록
- HFSPlusCatalogFile, HFSPlusCatalogFolder로 구분하여 분석
- HFSPlusCatalogFolder의 크기는 88
byte
- HFSPlusCatalogFile의 크기는 248
byte
<"tset"파일의 Record>
- test파일의 Record를 확인
- test는 file이므로 HFSPlusCatalogFile로 분석
- test 고유한 CNID : 0x5E
- test의 start block : 0x01004A
- test의 data 위치 계산 방법 : start block * block size / sector
size = offset
=> 계산 : 0x1004A *
0x1000 / 512 = 524880 sector
- offset
+ 파티션의 시작 위치
=> 계산524880
+ 409640 = 934520 sector
- 934520
sector로 이동시 test의 데이터 확인 가능
"test" 파일의 데이터 확인