OLE > Header & Data
- Sector 단위(한 섹터 당 512 byte)
- 헤더 영역이 고정 512 byte, 데이터 영역은 파일크기-512
- 데이터 영역에 Sector ID로 접근을 할 때는 헤더크기 빼고 계산
- 결론: 파일시스템이랑 유사함 아니 거의 똑같은거같음(?)
- Storage & Stream 으로 구성
- Storage: 폴더 개념
- Stream: 파일 개념
Header
- Magic ID
- OLE Signature
- 8 byte(0x00~0x07)
- \xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1
- CLSID
- OLE Class Identifier
- 16 byte(0x08~0x17)
- Minor Version
- 2 byte
- Major Version
- 2 byte
- Byte Order
- 2 byte
- \xFE\xFF : Little Endian
- \xFF\xFE : Big Endian
- Sector Shift (BBAT)
- 2 byte
- \x09\x00 ( 일반적으로 )
- 1 Sector의 크기 (2의 제곱수로 나타냄. 9면 2^9 = 512 - 일반적인 크기)
- Small Sector Shift (SBAT)
- 2 byte
- \x06\x00 ( 일반적으로)
- SBAT Sector 1개 크기 ( 2^6 = 64 )
- Reserved1
- 2 byte
- Reserved2
- 4 byte
- Reserved3
- 4 byte
- Number of Big Block Allocation Table Depot
- 4 byte
- BBAT Depot 개수. 109 이상일 경우 Extra BBAT 참조
- Root Storage Sector ID
- 4 byte
- Root Entry 시작 섹터 번호
- 헤더 다음으로 먼저 읽어야 할 부분
- 헤더 다음 섹터부터가 0번 (헤더 0번 아님) → 이값*Sector Size + Header Size가 시작 섹터 index
- 0x02 > 2*512+512 = 1536(0x0600)
- 0x0600이 루트 엔트리 시작이 됨
- Reserved4
- 4 byte
- Max Small Stream Size
- 4 byte
- \x00\x10\x00\x00 (일반적으로)
- 해당 값의 사이즈보다 작은 스트림을 읽을 땐 SBAT 참조(Small Stream)
- SBAT Depot Start Sector ID
- 4 byte
- Small Block Allocation Table Depot 시작 섹터 번호. SBAT Depot을 찾을 수 있는 값
- SBAT Sector Count
- 4 byte
- Small Block Allocation Table 크기 값
- 몇 개의 섹터를 차지하는 지에 대한 값(1 이면 1*512 = 512)
- Start Block of Extra Big Block Allocation Table
- 4 byte
- \xFE\xFF\xFF\xFF (BBAT 개수 109개 이하)
- Extra BBAT 시작 섹터 번호. Number of Big Block Allocation Table 값이 109개가 넘으면 여기 참조
- Extra BBAT 인덱스 확인 가능
- Number of Extra Big Block Allocation Table
- 4 byte
- \x00\x00\x00\x00 (BBAT 개수 109개 이하인 경우)
- Extra BBAT 개수
- BBAT가 120개면 이 값이 11이 됨(BBAT 기본이 109)
- BBAT Depot
- 436 byte
- 시작 인덱스부터 헤더 인덱스 끝(0x1FF)까지 BBAT 엔트리 저장
- 4 byte씩 Sector ID 가지고 있으며 BBAT 109개 이상이면 Start Block of Extra Big Bloc Allocation Table 참조
- FF는 없는거
BBAT(Big Block Allocation Table)
OLE는 한 Sector에 512 byte밖에 저장 못함 → 512 byte가 넘는 크기의 데이터를 저장하기 위해서 나눠서 저장을 해야하고, 이 저장된 데이터들을 연결(?)하는 인덱스들을 저장하는 테이블이 BBAT
OLE 내부 스트림 위치 정보 저장.
파일의 크기가 커질수록 BBAT의 크기도 커짐
BBAT Depot = BBAT가 저장된 저장소
- BBAT를 읽기 위해서 BBAT Depot을 모두 읽어야함. BBAT가 어디 저장되어있는지 알아야함
-
- 현재 BBAT Depot에 0x3밖에 없음. 그러면 그 위치의 한개 섹터만 읽으면 BBAT를 모두 읽는것임
- (0x3+0x1)*0x200 = 0x800 (1 더한 이유는 섹터 ID로 접근할때는 헤더를 빼야해서)
- 0x800~0xA00까지가 BBAT 영역
- 0xFFFFFFFD: 특수블록
- 0xFFFFFFFE: End of Chain
- 0xFFFFFFFF: 의미 x
- 그 외의 값: next, 연결된 다음 섹터 ID(4 byte)
- Root Storage Sector ID가 0x2 였음
- 시작 BBAT는 0x800+(0x2*0x4) = 0x808
- 0x4를 곱하는 이유는 BBAT에 저장된 값이 다음 섹터를 가리키는 4 byte이기 때문
- 주소 0x808 >> 0x4
- 0x800+(0x4*0x4) = 0x810
- 주소 0x810 >> 0x5
- c0x800+(0x5*0x4) = 0x814
- 주소 0x814 >> 0x13
- 0x800+(0x13*0x4) = 0x84C
- 주소 0x84C >> 0xFEFFFFFF (현재 리틀엔디언 표기형식임)
- End of Chain
SBAT(Small Block Allocation Table)
Max Small Stream Size 보다 작은 스트림을 읽을 때 참조하는 테이블. 기본 섹터는 512 byte인데 작은 섹터는 한개에 64 byte. 이 작은 스트림의 연속된 인덱스(?)를 가지고 있는 테이블이 SBAT
Small Sector의 정보는 Root Storage에 있으므로 Small Stream을 읽으려면 Root Storage를 통해 확인함
'잡지식' 카테고리의 다른 글
windows 7 x64에서 vmware tools 설치 오류 (0) | 2021.09.04 |
---|---|
centOS 7에서 wireshark 빌드(tshark 최신 버전 사용하기) (2) | 2021.08.11 |
맨날천날 까먹는 윈도우 보내기 추가(?) (0) | 2021.07.17 |
[PyShark] FileCapture(only_summaries=True) 첫번째 패킷 먹히는 경우 (0) | 2021.02.23 |
거지같은 dpkg/lock 오류 (0) | 2020.09.03 |