复合文档二进制格式(compound File binary Format:CFBF)基本上以扇区(sector)为单位,sector大小由文件头中的信息决定,文件头是固定大小为512的扇区:

CFBF本身的扇区类型分为以下几种:

1. CFBF本身定义好的数据结构,如Header,Directory Entry。

2. 扇区的映射表,称为FAT。以链表的形式记录了与扇区相连的扇区。

3. 扇区映射表的索引,包括Header._sectFat[109];这个实例中没有这种类型的扇区,只有当扇区映射表的数量超过了109时才会有。

4. 目录结构表,其SECT索引放在FAT中,由Header._sectDirStart决定起始的SECT。

5. 数据本身,有两种类型:一种为正常的Stream,其SECT索引放在FAT中,由SID#._sectStart决定起始的索引,另外一种为MiniStream,其SECT索引放在MiniFAT中,由SID#0._sectStart决定起始的索引。

SECT #-1(header)

Header
文件位置 数据长度 数据内容 对应的变量 含义 说明
0x00 8 DOCF 11E0 A1B1 1AE1 _abSig   CFBF格式的标志
0x08 16 0000 0000 0000 0000 0000 0000 0000 0000 _clid    
0x18 2 0x3E _uMinorVersion;    minor version of the format: 33 is written by reference implementation
0x1A 2 3 _uDllVersion;  扇区长度为512-byte. major version of the dll/format: 3 for 512-byte sectors, 4 for 4 KB sectors
0x1C 2 0xFFFE _uByteOrder;    0xFFFE: indicates Intel byte-ordering
0x1E 2 9 _uSectorShift;  512-byte/sector size of sectors in power-of-two; typically 9 indicating 512-byte sectors
0x20 2 6 _uMiniSectorShift;  64-byte/mini-sector size of mini-sectors in power-of-two; typically 6 indicating 64-byte mini-sectors
0x22 2 0 _usReserved;   reserved, must be zero
0x24 4 0 _ulReserved1;   reserved, must be zero
0x28 4 0 _csectDir; not used for 512-byte sectors must be zero for 512-byte sectors, number of SECTs in directory chain for 4 KB sectors
0x2C 4 1 _csectFat; 当前文件包含了一个Fat扇区 number of SECTs in the FAT chain
0x30 4 1 _sectDirStart SECT #1 是第一个文件夹扇区 first SECT in the directory chain
0x34 4 0 _signature; not used, transactions not supported signature used for transactions; must be zero. The reference implementation does not support transactions
0x38 4 0x00001000 _ulMiniSectorCutoff 4096 bytes maximum size for a mini stream; typically 4096 bytes
0x3C 4 0x00000002 _sectMiniFatStart SECT#2 is first MiniFAT sector first SECT in the MiniFAT chain
0x40 4 0x00000001 _csectMiniFat 1 MiniFAT sector in this file number of SECTs in the MiniFAT chain
0x44 4 0xFFFFFFFE _sectDifStart no DIFAT, file is < 7Mb first SECT in the DIFAT chain
0x48 4 0 _csectDIF no DIFAT sectors in this file number of SECTs in the DIFAT chain
0x4C 4 00000000 _sectFat[0] SECT#0 is the first FAT sector the SECTs of first 1 FAT sectors
0x50 432 FFFFFFFF ... (continues with FFFFFFFF) _sectFat[1..108] free FAT sectors FAT扇区的索引,说明哪些SECT是FAT扇区。

Sector #0:

FAT
文件位置 数据长度 数据内容 对应变量 含义 说明
0x200 4 0xFFFFFFFD N/A

_sectFat[0]指向SECT #0,也就是当前扇区.FAT扇区的标志。

0xFFFFFFFD说明这个扇区为SECTs的索引. 本身代表了FAT中的第0个SECT,也就是扇区本身。
0x204 4 0xFFFFFFFE N/A _sectDirStart指向SECT #1,表示后面已经没有SECT了。 这个位置代表了FAT中的第1个SECT。
0x208 4 0xFFFFFFFE N/A _sectMiniFatStart指向SECT #2,表示后面已经没有SECT了。 这个位置代表了FAT中的第2个SECT。
0x20C 4 0x4 N/A   这个位置代表了FAT中的第3个SECT。
0x210 496 0xFFFFFFFF N/A 空闲的SECT索引。  

SECT #1:

_sectDirStart = 1, 说明这个扇区为目录区,一个目录的数据结构大小为128-byte,所以每个扇区可以包含4个目录。

Directory Entry用到的枚举类型如下:

typedef enum tagSTGTY {
  STGTY_INVALID     = 0,       // unknown storage type
  STGTY_STORAGE     = 1,       // element is a storage object
  STGTY_STREAM      = 2,       // element is a stream object
  STGTY_LOCKBYTES   = 3,       // element is an ILockBytes object
  STGTY_PROPERTY    = 4,       // element is an IPropertyStorage object
  STGTY_ROOT        = 5        // element is a root storage
} STGTY;
typedef enum tagDECOLOR {
  DE_RED            = 0,
  DE_BLACK          = 1
} DECOLOR;

SID 0
文件位置 数据长度 数据内容 对应变量 含义 说明
0x400 64 L"Root Entry" _ab[32] 文件夹名称,Root文件夹专用名 Unicode格式的字符串,也是文件夹的名称,包含'/0',所以最长为31个字符。
0x440 2 0x16 _cb   _ab[32]中实际用到的字节(byte)数,包含'/0'.
0x442 1 5 _mse STGTY_ROOT,说明当前的Entry为Root,仅能有一个STGTY_ROOT类型 文件夹类型,如STGTY_STORAGE、STGTY_STREAM
0x443 1 1 _bflags DE_BLACK DECOLOR的枚举类型。
0x444 4 0xFFFFFFFF _sidLeftSib 没有左兄弟 当前Entry的左边的兄弟节点的SID。
0x448 4 0xFFFFFFFF _sidRightSib 没有右兄弟 当前Entry的右边的兄弟节点的SID。
0x44C 4 1 _sidChild SID为1的Entry为第一个子节点 当前节点的子节点的SID。仅当_mse=STGTY_STORAGE or STGTY_ROOT时有效。
0x450 16 0067 6156 54C1 CE11 8553 00AA 00A1 F95B _clsId   唯一标识符,仅当_mse=STGTY_STORAGE or STGTY_ROOT时有效.
0x460 4 0 _dwUserFlags 未定义 自定义标志位,仅当_mse=STGTY_STORAGE or STGTY_ROOT时有效。
0x464 8 0000 0000 0000 0000 _time[0] 未设置 目录创建时间,仅当_mse=STGTY_STORAGE时有效。
0x46C 8 801E 9213 4BB4 BA01 _time[1]   目录修改时间,仅当_mse=STGTY_STORAGE时有效。
0x474 4 3 _sectStart SECT #3为数据的起始扇区。在Root中表示这个扇区存放的是MiniStream Stream的起始扇区,仅当_mse=STGTY_STREAM时有效。
0x478 4 0x240 _ulSizeLow 数据的总长度。 Stream的字节数,仅当_mse=STGTY_STREAM时有效。
0x47C 4 0 _ulSizeHigh   对512字节长度的扇区无效,高64位用来表示4k长度扇区的数据长度。
SID 1
文件位置 数据长度 数据内容 对应变量 含义 说明
0x480 64 L"Storage 1" _ab[32] 文件夹名称。 Unicode格式的字符串,也是文件夹的名称,包含'/0',所以最长为31个字符。
0x4C0 2 0x14 _cb   _ab[32]中实际用到的字节(byte)数,包含'/0'.
0x4C2 1 1 _mse STGTY_STORAGE,说明当前的节点为Storage类型 文件夹类型,如STGTY_STORAGE、STGTY_STREAM
0x4C3 1 1 _bflags DE_BLACK DECOLOR的枚举类型。
0x4C4 4 0xFFFFFFFF _sidLeftSib 没有左兄弟 当前Entry的左边的兄弟节点的SID。
0x4C8 4 0xFFFFFFFF _sidRightSib 没有右兄弟 当前Entry的右边的兄弟节点的SID。
0x4CC 4 2 _sidChild SID为2的Entry为第一个子节点 当前节点的子节点的SID。仅当_mse=STGTY_STORAGE or STGTY_ROOT时有效。
0x4D0 16 0000 0000 0000 0000 0000 0000 0000 0000 _clsId   唯一标识符,仅当_mse=STGTY_STORAGE or STGTY_ROOT时有效.
0x4E0 4 0 _dwUserFlags 未定义 自定义标志位,仅当_mse=STGTY_STORAGE or STGTY_ROOT时有效。
0x4E4 8 0000 0000 0000 0000 _time[0] 未设置 目录创建时间,仅当_mse=STGTY_STORAGE时有效。
0x4EC 8 0000 0000 0000 0000 _time[1]   目录修改时间,仅当_mse=STGTY_STORAGE时有效。
0x4F4 4 0 _sectStart STORAGE不包含Stream,只能包含Storage Stream的起始扇区,仅当_mse=STGTY_STREAM时有效。
0x4F8 4 0 _ulSizeLow 数据的总长度。 Stream的字节数,仅当_mse=STGTY_STREAM时有效。
0x4FC 4 0 _ulSizeHigh   对512字节长度的扇区无效,高64位用来表示4k长度扇区的数据长度。
SID 2
文件位置 数据长度 数据内容 对应变量 含义 说明
0x500 64 L"Stream 1" _ab[32] 文件夹名称。 Unicode格式的字符串,也是文件夹的名称,包含'/0',所以最长为31个字符。
0x540 2 0x12 _cb   _ab[32]中实际用到的字节(byte)数,包含'/0'.
0x542 1 2 _mse STGTY_STREAM,说明当前的节点为Stream类型 文件夹类型,如STGTY_STORAGE、STGTY_STREAM
0x543 1 1 _bflags DE_BLACK DECOLOR的枚举类型。
0x544 4 0xFFFFFFFF _sidLeftSib 没有左兄弟 当前Entry的左边的兄弟节点的SID。
0x548 4 0xFFFFFFFF _sidRightSib 没有右兄弟 当前Entry的右边的兄弟节点的SID。
0x54C 4 0 _sidChild Stream没有子节点 当前节点的子节点的SID。仅当_mse=STGTY_STORAGE or STGTY_ROOT时有效。
0x550 16 0000 0000 0000 0000 0000 0000 0000 0000 _clsId   唯一标识符,仅当_mse=STGTY_STORAGE or STGTY_ROOT时有效.
0x560 4 0 _dwUserFlags 未定义 自定义标志位,仅当_mse=STGTY_STORAGE or STGTY_ROOT时有效。
0x564 8 0000 0000 0000 0000 _time[0] 未设置 目录创建时间,仅当_mse=STGTY_STORAGE时有效。
0x56C 8 0000 0000 0000 0000 _time[1]   目录修改时间,仅当_mse=STGTY_STORAGE时有效。
0x574 4 0 _sectStart _ulSizeLow < _ulMiniSectorCutoff,所以Stream数据被放在MiniFAT中,从第0个MiniSector开始 Stream的起始扇区,仅当_mse=STGTY_STREAM时有效。
0x578 4 0x220 _ulSizeLow 数据长度,小于Header._ulMiniSectorCutoff Stream的字节数,仅当_mse=STGTY_STREAM时有效。
0x57C 4 0 _ulSizeHigh   对512字节长度的扇区无效,高64位用来表示4k长度扇区的数据长度。

第三个Directory Entry为空。

SECT #2:

由Header._sectMiniFatStart = 2 我们知道当前SECT为MiniFAT。

MiniFAT
文件位置 数据长度 数据内容 对应变量 含义 说明
0x600 4 0x00000001 N/A SID2._sectStart = 0,所以当前值为下一个MiniSector的索引 当前minisector的下一个索引,下同
0x604 4 0x00000002 N/A 下个MiniSector为MiniSECT #2,下同  
0x608 4 0x00000003 N/A 下个MiniSECT=3  
0x60C 4 0x00000005 N/A 下个MiniSECT为5  
0x610 4 0x00000006 N/A    
0x614 4 0x00000007 N/A 下个MiniSECT=7  
0x618 4 0x00000008 N/A    
0x61C 4 0xFFFFFFFFE N/A 数据结束  
......   0xFFFFFFFFF N/A 空闲的索引  
           

SECT #3

SID0._sectStart指明了当前SECT为MiniStream sector。

000800:  4461 7461 2066 6F72  2073 7472 6561 6D20    Data for stream
000810:  3144 6174 6120 666F  7220 7374 7265 616D    1Data for stream
000820:  2031 4461 7461 2066  6F72 2073 7472 6561    1Data for strea
. . .
000A00:  7461 2066 6F72 2073  7472 6561 6D20 3144    ta for stream 1D
000A10:  6174 6120 666F 7220  7374 7265 616D 2031    ata for stream 1

结束

转载于:https://www.cnblogs.com/tzleo/archive/2012/04/12/2444399.html

微软复合文档二进制格式实例分析相关推荐

  1. 宏病毒的研究与实例分析02——复合文档格式分析

    文章目录 复合文档二进制解析 复合文档数据结构解析 准备工作 基础知识 Header FAT Directory 补充 宏代码数据结构解析 说明 目前主流杀软在处理宏病毒时,都是直接删除含有宏病毒的文 ...

  2. 微软OFFice复合文档

    劳拉"-神秘的微软办公软件文件格式 在复合文档中,可以有很多目录,每个目录下面可以有子目录,目录和子目录中包含了"存储",一个存储就相当于磁盘上的一个文件,整个复合文档就 ...

  3. 手工重建复合文档(.doc;xls,ppt)文件头,修复文件全过程

    最近学习了复合文档的格式,在修复复合文档头方面做了不少实践,有了一些心得,经过梳理,做了个例子,把思路和过程介绍给大家,希望能解决你的不时之需! 例子中用的文件如下图:名为"实验文档&quo ...

  4. 复合文档的二进制存储格式研究(word,xls,ppt...)

    本文是研究DOC文件格式的第一部分.office中的doc等文件在外层都遵循复合文档格式,而真正的doc内容主要是(也有其它流和仓库)作为复合文档的一系列流而存在.下面为转载的文章正文,讲解复合文档格 ...

  5. 复合文档格式(五) - 短流、短流容器流和短扇区分配表

    一.概述 上一篇学习了主扇区分配表和扇区分配表:http://blog.csdn.net/lipinganq/article/details/76785471 在复合文档头中的第56 - 59的4个字 ...

  6. 微软语音AI技术与微软听听文档小程序实践 | AI ProCon 2019

    演讲嘉宾 | 赵晟.张鹏 整理 | 伍杏玲 来源 | CSDN(ID:CSDNnews) [导语]9 月 7 日,在CSDN主办的「AI ProCon 2019」上,微软(亚洲)互联网工程院人工智能语 ...

  7. 微软语音 AI 技术与微软听听文档小程序实践 | AI ProCon 2019

    演讲者 | 赵晟.张鹏 整理 | 伍杏玲 出品 | CSDN(ID:CSDNnews) [CSDN 编者按]9 月 7 日,在CSDN主办的「AI ProCon 2019」上,微软(亚洲)互联网工程院 ...

  8. popper.js——tooltip文档及源码分析

    popper.js之tooltip文档及源码分析 popper说明 由于popper.js这个名字比较大众化,有必要说明一下具体指的是哪一个: 没错就是你想的这个: https://popper.js ...

  9. office 里的链接如何显示成图片_微软Office文档 | Office小程序介绍(一)

    微软中国Office 365 for WeChat团队开发了四款好用方便的小程序--「微软Office文档」「微软听听文档」「微软AI识图」「微软海报」.它们的受众已经十分庞大,但相信仍旧有不少人与其 ...

最新文章

  1. 在ASP.NET2.0中的的UrlRewrite
  2. 协议地址结构_通信之路——用最简洁的文字告诉你互联网协议TCP/IP
  3. 添加chorme插件时出现“程序包无效”
  4. 页面静态化2 --- 使用PHP缓存机制来完成页面静态化(上)(ob_flush和flush函数区别用法)...
  5. 【机器学习】机器学习中必知必会的 8 种降维技术,最后一款超硬核!
  6. 视图、存储函数、存储过程、触发器:MySQL系列之五
  7. Dynamics CRM 开启图表的3D效果展示
  8. Linux——VIM多选缩进及高级命令
  9. 机器学习—数据挖掘之灰色预测算法
  10. Zmodem协议由浅入深
  11. Python之身份证号码的校验
  12. 向量点乘(即内积)和叉乘(即外积、向量积)区别与意义分析
  13. 问题解决:Unable to establish SSL connection.
  14. 有没有ai绘画教程?什么软件能实现ai绘画?
  15. 【PythonPlanet】二手房产成交数据分析
  16. 精准电流走向分析|用笔记本电脑的供电电路描述MOS管的两大功能:开关作用和隔离功能
  17. nvidia驱动版本查询
  18. 通过复制粘贴输入网址
  19. python谱聚类算法_Python机器学习高级算法!谱聚类(Spectal Clustering)算法分析和实例详解...
  20. UCI 机器学习数据集

热门文章

  1. 设为首页和加入收藏js
  2. Notepad++软件的下载与安装步骤(图文详解)
  3. unicode学习笔记
  4. vim配置之目录结构
  5. linux中搭建java开发环境
  6. 测试总结(部分)---转载
  7. 如何拥有一个有意义的人生
  8. 给实践者的算法学习指南
  9. Web 开发的 JavaScript 框架资料收集(15款)
  10. 汇编语言---王爽 (实验 8)分析一个奇怪的程序