office 复合文档数据结构解析“初探”

 

一、OLE(Object Linking and Embedding) 文件二进制结构

Office 文档(如:.doc、.ppt、.xls等)很多是复合文档(OLE文件),所有文件数据都是存储在一个或多个流中。每
个流都有一个相似的数据结构,用于存储元数据的数据结构。这些元数据有用户和系统的信息、文件属性、格式信
息、文本内容、媒体内容。宏代码信息也是以这种方式存储在复合文档中的。为了在 Office 文档文件中提取出宏代
码,以及进行其他相关安全研究,必须学会解析复合文档的二进制格式。


① 复合文档将数据分成许多流(Steams),流存储在不同的 Storages 里。

② 复合文档采用NTFS(NT File System)格式。
③ 流又分成更小的数据扇区(sectors),数据扇区可能包含控制数据用户数据

④ 整个文件由一个头结构(Header) 结构以及 Sectors 组成,头结构确定了 Sectors 的大小,每个 Sector 的大小相同。
 

二、准备

1、工具:offvis(如下) + 010editor

链接: https://pan.baidu.com/s/1ivh3VgkkIn3oUnpUP-7C8Q 提取码: e6u2

2、doc、docx 和 docm 文档

office 复合文档数据结构解析“初探”

 

三、关于 doc、docx、docm

Office文档主要基于三种格式:ole、xml、ooxml —— ooxml 以 xml 为基础,可以理解为 zip文件。
doc、xls、ppt 三种扩展名文档属于97-2003版Office,可解析出ole格式文件。
docm、xlsm、pptm 是启用宏的Office文档,存储 Visual Basic Applications(VBA)宏代码,可解析出 xml 文件。
docx、xlsx、pptx 三种扩展名文档可解析出 xml 文件。
 

1、 .doc 是一种普通的OLE文件(复合文件),可以包含宏代码,而.docx和.docm文件,实际上都是是压缩文件。二进制文件头数据截取如下,其中docx文件得输入一点内容,不然解析为空。

>> Office 2007 之前的版本可以看作二进制文件。其中十六进制文件头为 D0 CF 11 E0 A1 B1 1A E1,这是固定的 OLESS 文档格式文件头。

office 复合文档数据结构解析“初探”

>> Office
2007 之后的样本,可以发现文件头为PK。这代表着ZIP算法的发明者 Phil Katz。Office 2007之后的文档本质上是一个压缩包。由于文档中包含 ooxml 文件,因此不能用 offvis 进行解析,按下 offvis 的 Parser 按钮确实无法解析文件,这类文档可以通过解析出 .xml 和 .rels 来获取内容和逻辑关系。

office 复合文档数据结构解析“初探”

office 复合文档数据结构解析“初探”

每个PK包都必须有一个[Content_Types] .xml,在包的根目录中找到。此文件包含包中所有部件的内容类型的列表,每个部分及其类型必须列在[Content_Types] .xml中。
office 复合文档数据结构解析“初探”

2、将 docx.docx 文件重命名为 docx.zip ,然后以压缩包形式打开,可以看到文档的内容被存储在不同的文件里,文件的主要内容大部分都在 Word 目录中。这里涉及到一个新名词:OPC-Open Package Convention 开放打包协定,是一种基于 zip+xml 定义的文件存储格式。

office 复合文档数据结构解析“初探”

>> 这里面要理解三个概念:Part、Relationship、ContentTypes。
zip 中的每个文件都是一个 part,可以是任何格式,比如图片、xml等。
Relationship 是一种特殊的 Part,它描述了各个Part之间的依赖关系,存储在_rels文件夹中,存储为rels文件。
ContentTypes 在zip压缩包的根目录下,文件名为Content_Types.xml,它记录了 OPC 文件中除了他自己以外的所有文件的类型。

>> 比较重要的几个文件如下:

office 复合文档数据结构解析“初探”

3、利用同样方式打开 .docm 文件,发现内容大致相同。有的文章里说 .docm 的压缩包中会比 .docx 多一个 vbaProject.bin 的复合文件,用来记录 VBA 工程信息,这也是合理的。

office 复合文档数据结构解析“初探”

 

四、开始解析 OLE 文件数据格式

用 offvis 打开 doc 文件,可以看到清晰的文件结构。

office 复合文档数据结构解析“初探”

 

1、Header(文件头)

固定大小 512 字节,header 中记录着文件解析必需的所有参数,每个参数都很重要,自己标注了一下

office 复合文档数据结构解析“初探”

office 复合文档数据结构解析“初探”

2、FAT

FAT 实际记录了该扇区 sector 指向的下一个扇区的地址,成为一个索引表。数据在硬盘上的存储是离散的,需要有一个索引表能找到这些数据,索引表中存放着数据的起始地址(即扇区的起始地址)。

office 复合文档数据结构解析“初探”

一个 sector 只能存放一种类型的数据,但是复合文档怎么知道扇区中存储的是哪一种类型的数据?因而在复合文档的 FAT 数据中,除了表示扇区 ID 的数字,还有些特殊的数字 ID 表示一些特定的扇区。

office 复合文档数据结构解析“初探”

office 复合文档数据结构解析“初探”

一个扇区大小为512字节,一组FAT信息占据4个字节。因而一个FAT扇区中,最多能够存放128组FAT信息。可以利用 DIFAT列表把不同的FAT扇区串联起来。

office 复合文档数据结构解析“初探”

3、MiniFAT 和 FAT 解析类似

4、DirectoryEntries

复合文档从字面上理解就是很多内容放在一起复合形成文档,这么多内容当然需要有个目录,而 DirectoryEntries 就是这个目录。DirectoryEntries 起始的 SectorID 需要从 Header 读取,定位的方法: 512+ 扇区大小 * 扇区ID。DirectoryEntries 中每个DirectoryEntry 固定为 128字节,其主要结构如表所示:

office 复合文档数据结构解析“初探”

office 复合文档数据结构解析“初探”

 

 

 

 

 

 

 

 

 

 

参考:

知识星球博主 crazyman 的系列文章《宏病毒的研究与实例分析-2》

https://blog.****.net/qq_42855619/article/details/92852284

https://blog.****.net/chaoguodong/article/details/80402291