Office文件结构解析

文章目录

  • Office文件
    • Office2007之前的版本
    • Office2007及之后的版本
    • OOXML = OPC + \*ML
      • OPC
      • *ML
    • docx文件的解析流程

Office文件

之前在项目开发过程中,进行文件类型判断时,发现doc和docx文件的结构是不同的,很是好奇,特来深究一番。

doc和docx、xls和xlsx、ppt和pptx的不同,其原理都是一样的。
doc是Office 2007之前的版本;docx是Office 2007之后的版本。下面详细介绍一下:

参考文档:

Office恶意文件解析与混淆研究 - 知乎 (zhihu.com)
Office 文件解析入门 - 柯幽 - 博客园 (cnblogs.com)

Office2007之前的版本

可以看作二进制文件,文件前八个字节为 D0 CF 11 E0 A1 B1 1A E1
Office文件结构解析_第1张图片
这种文档格式是OLESS(OLE Structured Storage),微软采用的是OLE1.0的文档规范。可以用微软自带工具OffVis打开文档,直观地查看OLESS文档结构,可以发现它是由四部分组成。

OffVis下载地址: http://go.microsoft.com/fwlink/?LinkId=158791
Office文件结构解析_第2张图片
在OLESSHeader中,有个clsidNull,它一般常用来区分各种CVE编号。注意OLESS中CLSID的存放位置和Rtf中的不同,Rtf中存放在\objdata控制字中。

CLSID:ClassID,类标识符,用作特定COM类的唯一标识符。是一个128位(16字节)的整数。
Office文件结构解析_第3张图片

Office2007及之后的版本

在原有Office文件格式的基础上加入了XML文件格式,这种新的文件格式称为OOXML(Office Open XML),相比于之前的Office文档结构更加清晰。

文件前四个字节为 50 4B 03 04,即PK…,PK代表ZIP算法的发明者(Phil Katz)。
Office文件结构解析_第4张图片

OOXML = OPC + *ML

OPC

OPC:一种基于zip+xml定义的文件存储格式。一个OPC文件,不管文件后缀是什么,本质上就是一个zip文件,可以用任何常见的解压软件进行解压。

XML:Extensible Markup Language,可扩展标记语言,和HTML很像。不过XML被用来传输和存储数据,而HTML是被用来显示数据

上面的docx文件本质上就是一个OPC文件,我们将一个其后缀改成zip,然后解压,解压后的文档目录如下:
Office文件结构解析_第5张图片
_rels下有一个文件:.rels

docProps下有两个文件:app.xml和core.xml

word下的文件如图:
Office文件结构解析_第6张图片
OPC中有三个重要的概念:

  • Part:zip中的每一个文件都是一个Part,它可以是任何格式。在Office文件中,各种 Markup Language 定义的内容就作为 XML 存储在Part中。
  • Relationship:一种特殊的Part,它描述了各个Part之间的依赖关系。OPC协议规定所有的Relationship都必须存储在名为 _rels 的文件夹中,且其中的文件名都必须以.rels为后缀。

​ 示例中_rels\\.rels的内容如下:
在这里插入图片描述
​ 示例中word\\_rels\\document.xml.rels的内容如下:
在这里插入图片描述
每一个Relationship节点都代表一个依赖关系,各属性的意义如下:

属性名 是否必须 说明
Id 唯一标识符,在当前文件中是唯一的,不同文件中可以重复
Type Target 的文件类型
Target 目标 Part 的路径,可以用相对路径也可以用绝对路径
TargetMode 目标的类型,值可以是 Internal 或者 External (默认是Internal),表示 Target 是OPC文件内部的还是外部的
  • ContentTypes:在zip解压后的根目录下,名为[Content_Types].xml,它记录了该OPC文件中除了它自己以外的所有文件的类型。示例中 [Content_Types].xml 的内容如下:
    Office文件结构解析_第7张图片

可以发现有两种标签:DefaultOverride。Default 指明了拥有文件后缀名和文件类型的对应关系,Override 指明了某一个文件的文件类型。

以第一句Default为例,它表示,所有后缀是png的文件都是image/png类型的文件。

在OPC中,不建议根据文件后缀名来判断一个文件的类型,而应该根据ContentTypes文件中记录的信息来判断。

*ML

*ML:* Markup Language,标记语言,是一种用XML来描述数据的语言。

*ML 全名 说明
PML Presentation Markup Language PPT 中各种数据的描述
WML Wordprocessing Markup Language Word 中数据的描述
SML Spreadsheet Markup Language Excel 中数据的描述
DML Drawing Markup Language Office 所有格式中都可以使用,用来描述矢量图形,图表等
SharedML Shared Markup Language 描述了文档属性,音视频,图片,文档主题等内容,它被所有Office文件使用

docx文件的解析流程

  1. 读取 [Content_Types].xml 文件,获得所有文件的类型;
  2. 读取 _rels\.rels 这个Relationship 文件,获取 document.xml 文件的位置,即 word\document.xml
  3. 读取 word\document.xml 文件以及其关联的 Relationship 文件 wprd\_rels\document.xml.rels,得到该Word所有文件的存储位置,如word中插图所在文件夹为word\media

你可能感兴趣的:(Office,microsoft)