1. OLE File이란
1-1) OLE File
-> MS 오피스인 워드, 엑셀, 파워포인트의 문서 포맷으로 사용
-> 내부가 하나의 작은 하드 디스크와 같은 파일 시스템 구조
-> 폴더 및 파일의 개념 존재
Storage(폴더)와 Stream(파일)
✍🏻 OLE File Format을 통해 상위 하위 호환성
-> 워드는 최신이나 구버전 호환이 가능함
-> 구 버전은 work book으로 저장
-> 신 버전은 book으로 저장
1-2) OLE File Image
1-2)-1. Root Strorage
헤더 다음으로 가장 먼저 읽어야 할 항목임.
파일 내에 존재하는 모든 스트림과 스토리지를 포함하고 있는 최상위 폴더이고
Small Stream(Small Sector)을 저장하고 있음.
⇒ BBAT를 참조하여 헤더의 Root Storage Sector ID와 연결된 섹터들을
⇒ 전부 합친다면 파일 전체적인 구조를 파악할 수 있음.
2. OLE 파일 구조
2-1) Header Section & Data Section Block Image
→ OLE File 구조는 크게 Header Section과 Data Section으로 나눔.
*속도를 좀 더 높이기 위해 시프트 연산자(Click)를 사용함.
2-2) Header Section(=Header Block)
→ File Signature, Sector Count, Sector Size, Start Sector ID 등
→ OLE 파일을 구성하고 있는 주요 정보들이 저장되어 있음.
2-3) Data Section(=Data Block)
2-3)-1. Data Section 구성요소
2-3)-2. BBAT(Big Block Allocation Table)
File Sector
OLE 파일은 Sector 단위로 이루어져 있음.
마찬가지로 OLE 파일을 구성하고 있는 데이터들도 전부 Sector(부분) 단위로 구성됨.
1 Sector 크기는 512(0x200)바이트임. 512바이트(Click)를 초과하면
한 개 Sector에 데이터를 모두 저장할 수 없기 때문에 나눠서 저장을 해야함.
예를 들어 4480바이트 크기 데이터는 9 Sector에 각각 512바이트씩 나눠서 저장함.
BBAT(Big Block Allocation Table)
BBAT는 나눠서 저장한 데이터들을 연결하는 연결고리 저장소임.
데이터들은 항상 순차적으로 섹터에 저장하지 않기 때문에
반드시 BBAT를 참조하여 직접 연결해줘야만 함.
BBAT에는 참조하는 섹터에 연결된 다음 섹터 번호가 저장되어 있음.
데이터를 이루는 섹터는 단일 연결구조로 구성됨.
File의 크기가 2560바이트일 경우
헤더 영역은 고정 512바이트임.
데이터 영역은 파일 크기에서 헤더 크기만큼 뺀 2560-512 = 2048 바이트로 구성.
⇒ 나중에 데이터 영역에 Sector ID로 접근할 때 헤더 크기는 빼고 계산해야 함.
2-3)-3. SBAT(Small Block Allocation Table)
파일 헤더에 나와있는 Max Small Stream Size보다
크기가 작은 스트림을 읽을 땐 BBAT가 아닌 SBAT를 참조해야 함.
SBAT는 BBAT와 똑같은 메커니즘임.
Small Sector 한 개 크기는 64바이트임. 만약 256바이트 스트림을 저장할 경우
4개의 Small Sector에 각각 64바이트씩 저장해야 함.
⇒ Small Stream(Small Sector)는 루트 스토리지에 저장되어 있음.
⇒ 따라서 Small Stream을 읽기 위해서는 Root Storage의 BBAT를 통해 먼저 읽어야 함.
3. Header Information
3-1) Header Information
OLE File에서 가장 먼저 읽어야 할 부분은 Header임. Header에는 OLE File에 대한 다양한 정보를
저장하고 있음. Header Section에는 파일의 시작 위치부터 1 Sector(512Bytes)만큼이다.
Hex Viewer 또는 Microsoft에서 제공하는 OffVis를 통해 확인할 수 있음.
3-2) Magic ID
→ OLE File 반복 Signature.
→ 기본 OLE File의 이 값은 절대 0xE11AB1A1E011CFDO(Little Endian(Click))
3-3) CLSID
3-4) Minor Version
3-5) Major Version
3-6) Byte Order
3-7) Sector Shift(BBAT)(Click)
3-8) Small Sector Shift(SBAT)
3-9) Reserved1
3-10) Reserved2
3-11) Reserved3
3-12) Big Block Allocation Table Depot 개수
3-13) Root Storage Sector ID
3-14) Reserved4
3-15) Max Small Stream Size
3-16) SBAT Depot Start Sector ID
3-17) SBAT Sector Count
3-18) Start Block of Extra Big Block Allocation Table
3-19) Number of Extra Big Block Allocation Table
3-20) BBAT Depot
3-21) Header Information
4. BBAT(Big Block Allocation Table)
5. SBAT(Small Block Allocation Table)
6. Root Storage Sector ID
7. Stream Object
BBAT의 시작주소 + (Star Sector ID의 값 * DWORD(0x04)) = Next Sector
0x800(2048) + (0x09(9) * 0x04(4)) = 2084(0x824)
...
0xFEFFFFFF까지
5. Convert File to Hex
6. How to convert byte arrays to Hex
7. OLE 파일 구조와 비슷한 FTA File System