Office文档是目前应用最普遍的文档格式,但不少人都没有为office文件创建完善的安全防御措施,也没有养成进行文件备份的良好习惯,因此一旦出现操做失误、病毒破坏、系统故障等状况,就有可能形成当前正在编辑的word、excel文档和access数据库等受到损坏,下次没法打开。那么一旦遇到这类文档被破坏或者丢失咱们是否就一筹莫展了呢,固然不是,咱们能够借助专业知识和小工具进行受损文档修复。linux
Office文档格式一直以来都是微软公司的技术机密,至今不曾向外界公布。那么咱们如今要作的是修复受损的文档,若是真的对office文件数据结构一无所知的话那么最终也只能止步于“傻瓜式”的文档修复工具水平。想要提升本身的文档修复水平,在最大程度上挽救丢失的数据,那就必须对office文档二进制格式有所了解,下面咱们以word文档为例子,给你们介绍word文件内部结构和office文档格式的部分秘密。为何说是部分呢,由于所有的office文档格式可能只有微软本身才知道了。算法
Laola文件格式是微软复合文档结构的二进制格式。按照微软的命名来讲,这种文档结构应该叫作“复合文档二进制结构(Compound File Binary Format)”。但微软官方并无公开关于这种文档结构的相关内容,大量***经过对word、Excel文件的逆向分析以及办公软件的跟踪,基本上破解了“复合文档二进制结构”的组成和算法。但这些并非微软的官方文档,有存在差别的可能性,而且微软有权随时改变这一算法结构,所以人们有必要使用另外的名称“laola”来描述这一结构。数据库
国内最先分析“复合文档二进制结构”的是反宏病毒技术人员,但国际上在宏病毒没出现前针对微软复合文档二进制结构的分析就已经开始了。进行这种分析的根本目的是为了在其余操做系统下(这里主要指的是linux和其余开源操做系统下)可以开发出可读写微软办公软件使用的文档。
“复合文档”是微软引入的一种在文件内部存放结构化信息的方法。例如:咱们写一篇文章,若是这篇文章没有任何格式信息和嵌入图像,那么使用没有任何结构的文本格式就能够了,可是一篇完善的文章里可能包含段落、格式、字体、颜色、插图等,这样简单的无格式文本就没法知足须要了。因此须要在文件的内部存放不少结构,包括段落的文字、字体、甚至段落自己信息等。针对这种需求、以及电子数据表、演示制做等软件的须要,微软开发了一种“文件中的文件系统”,也就是“复合文档”结构。安全
在复合文档中,能够有不少目录,在每一个目录下能够有子目录,目录和子目录包含了“存储”,一个存储至关于磁盘上的一个文件,整个复合文档就造成了一个相似于磁盘上的目录和文件所组成的树状结构。若是在视窗环境下使用复合路径,能够利用操做系统提供的功能对复合文件进行读写。
与硬盘划分扇区的方法相似,全部使用laola文件格式的文件由512 B的数据块组成(有兴趣的能够验证一下,全部的word、excel或其余office文件大小都是512B的倍数),数据块的序号从-1开始,以下图所示。
序号为-1的块是整个文件的文件头块,存放了复合文件的一些总体信息,结构见下图:
在512 B的数据块基础上,复合文件中包括了两种最基本的结构:
第一种是由512 B的大块链接起来的大块链。若是对以文件分配表“FAT”为基础的文件系统熟悉的话,能够很容易的理解大块链的概念,只要知道一个大块链的开始块序号,经过大块映像图就能够找到这一条大块链的全部内容。一个典型的大块映像图以下图所示:
从图中能够看到,若是一个大块链的开始序号是0的话(该处的内容是5),那么这个大块链包括:序号为0的数据块、序号为5的数据块(该处的内容是7)、序号为7的数据块(该处的内容是9)、序号为9的数据块(该处的内容是0b)、序号为0b的数据块(该处的内容是-1,表示这是该链的最后一个数据块)。
对于比较小的结构,若是以512 B为单位的话会形成比较大的空间浪费,因此专门使用一个大块链来存放比较小的数据块,小于4096 B的数据结构使用小块链来表示,小块链的组成和寻址方式和大块链很是相似,惟一不一样的是小块链里面对小块的寻址不是在整个复合文件范围内的,而是在某一个特定的大块链范围内,这个大块链的开始块序号会在之后的更新中叙述。
目录链:是复合文件最基本的数据链,描述了复合文件的目录结构信息。目录链的开始在头块中能够找到。目录链中包括了复合文件的目录信息,每个目录项的大小是128 B,因此 目录链的一个块能够包括4个目录项,第一个目录项是根目录项,名字叫“根入口(Root Entry)”,任何复合文件里这都是第一个目录项。一个典型的根目录项以下图所示:
下面是目录项的结构说明:
因为上面的数据结构并非来源于微软的官方文档,其中包含了不少猜想的成分,因此不少内容暂时没法判断其意义,有些结构说明可能与微软原意不一样,不过咱们利用这个结构对微软的大量文档进行分析,至今还没有发现有明显错误。
在基本的laola文件结构基础上,字处理文档、电子数据表文档具备不一样的内部目录结构,下面介绍一个典型word文件内部目录结构
a.doc
—1 Table:一些数据表
—CompObj:通用的对象
—ObjectPool:对象池,是一个目录,包括word文档中嵌入的图像、声音或者其余对象
—WordDocument:实际的文字和格式化信息就存放在这里
—SummaryInformation:摘要信息
—DocumentSummaryInformation:其余的摘要信息数据结构