详细页面
OFFICE办公文档EXCEL-WORD等碎片重组及修复数据恢复业务
信息来源:本站原创 发布时间:[2017-10-28 13:46:00 ] 阅读次数:

   对于一个Microsoft Office文件,其实质是一个Windows复合二进制文件(Windows Compound Binary File),文件的头Header是固定的512字节,Header记录文件最重要的参数。Header之后可以分为不同的Sector,Sector的种类有FAT、Mini-FAT(属于Mini-Sector)、Directory、DIF、Stroage等五种。为了方便称呼,我们规定每个Sector都有一个SectorID,Header后的Sector为第一个Sector,其SectorID为0。


一个Header的部分截图及包含的信息如下,比较重要的用粗体表示。

Header的前8字节Byte[],也就是整个文件的前8字节,都是固定的0xD0 0xCF 0x11 0xE0 0xA1 0xB1 0x1A 0xE1,如果不是则说明不是复合文件。

从008H到017H的16字节,是Class Id,不过很多文件都置的0。

从018H到019H的2字节UInt16,是文件格式的次要版本。

从01AH到01BH的2字节UInt16,是文件格式的主要版本。

从01CH到01DH的2字节UInt16,是固定为0xFE 0xFF,表示文档使用的是Little Endian(低位在前,高位在后)。

从01EH到01FH的2字节UInt16,是Sector大小的幂,默认为9(0x09 0x00),即每个Sector为512字节。

从020H到021H的2字节UInt16,是Mini-Sector大小的幂,默认为6(0x06 0x00),即每个Mini-Sector为64字节。

从022H到023H的2字节UInt16,是预留的,必须置0。

从024H到027H的4字节UInt32,是预留的,必须置0。

从028H到02BH的4字节UInt32,是预留的,必须置0。

从02CH到02FH的4字节UInt32,是FAT的数量。

从030H到033H的4字节UInt32,是Directory开始的SectorID。

从034H到037H的4字节UInt32,是用于事务的,必须置0。

从038H到03BH的4字节UInt32,是最小串(Stream)的最大大小,默认为4096(0x00 0x10 0x00 0x10)。

从03CH到03FH的4字节UInt32,是MiniFAT表开始的SectorID。

从040H到043H的4字节UInt32,是MiniFAT表的数量。

从044H到047H的4字节UInt32,是DIFAT开始的SectorID。

从048H到04BH的4字节UInt32,是DIFAT的数量。

从04CH到1FFH的436字节UInt32[],是前109块FAT表的SectorID

目录结构:

复合文档中其实存放着很多内容,这么多内容需要有个目录,那么Directory就是这个目录。从Header中我们可以读取出Directory开始的SectorID,我们可以Seek到这个位置(0x200 + sectorSize * dirStartSectorID)。Directory中每个DirectoryEntry固定为128字节,其主要结构如下:


从000H到040H的64字节,是存储DirectoryEntry名称的,并且是以Unicode存储的,即每个字符占2个字节,其实可以看做是UInt16。

从041H到042H的2字节UInt16,是DirectoryEntry名称的长度(包括最后的“”)。

从042H到042H的1字节Byte,是DirectoryEntry的类型。(主要的有:1为目录,2为节点,5为根节点)

从044H到047H的4字节UInt32,是该DirectoryEntry左兄弟的EntryID(第一个DirectoryEntry的EntryID为0,下同)。

从048H到04BH的4字节UInt32,是该DirectoryEntry右兄弟的EntryID。

从04CH到04FH的4字节UInt32,是该DirectoryEntry一个孩子的EntryID。

从074H到077H的4字节UInt32,是该DirectoryEntry开始的SectorID。

从078H到07BH的4字节UInt32,是该DirectoryEntry存储的所有字节长度。

摘要信息又分为两类,一类是DocumentSummaryInformation,另一类是SummaryInformation,分别包含不同种类的摘要信息。通过上述的代码应该能获取到Root Entry下有一个叫“05DocumentSummaryInformation”的Entry和一个叫“05SummaryInformation”的Entry。


对于DocumentSummaryInformation,其结构如下


从018H到01BH的4字节UInt32,是存储属性组的个数。

从01CH开始的每20字节,是属性组的信息:

对于前16字节Byte[],如果是0x02 0xD5 0xCD 0xD5 0x9C 0x2E 0x1B 0x10 0x93 0x97 0x08 0x00 0x2B 0x2C 0xF9 0xAE,则表示是DocumentSummaryInformation;如果是0x05 0xD5 0xCD 0xD5 0x9C 0x2E 0x1B 0x10 0x93 0x97 0x08 0x00 0x2B 0x2C 0xF9 0xAE,则表示是UserDefinedProperties。

对于后4字节UInt32,则是该属性组相对于Entry的偏移。

对于每个属性组,其结构如下:


从000H到003H的4字节UInt32,是属性组大小。

从004H到007H的4字节UInt32,是属性组中属性的个数。从008H开始的每8字节,是属性的信息:

对于前4字节UInt32,是属性编号,表示属性的种类。

对于后4字节UInt32,是属性内容相对于属性组的偏移。

蓝梦软件下载中心:www.disksoft.org

关闭】 【返回