写在前面:这是我最近在做的一个小课题,按照研究进度不定期更新。主要是学习前人的研究思路,自己开发的内容会比较少。

  1. 复合文档的概念
    复合文档不仅包含文本,而且包括图形、电子数据表格、声音、视频等其他信息。使用面向对象技术,将非标准信息(如图像、声音)作为独立的、自包含式对象包含在文档中。
    符合文档将数据分成许多流(Steams),流存储在不同的Storages里。符合文档采用NTFS(NT File System)格式。
    流又分成更小的数据扇区(sectors)。数据扇区可能包含控制数据或用户数据。整个文件由一个头结构(Header)结构以及Sectors组成,头结构确定了Sectors的大小,每个Sector的大小相同。
  2. Office文档格式
    Office文档官方说明
    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文件。
  3. Office文档解析
    Office文档解析可用Microsoft官方解析可视化工具Offvis来进行。下载Offvis并安装。Offvis下载
    可以看到Office被解析成二进制格式。

导航窗格显示原始文件内容,每行均显示当前偏移量、一个十六进制数字链,及其文本表示形式(如果有)。结果窗格显示包含当前数据结构的名称、值、偏移位置、大小和类型的分析结果。下面的屏幕截图显示可视化工具中包含"Hello, world"文本的 .doc 文件的一部分。其中选择了字母"w"。这会导致可视化工具突出显示相应的十六进制数字和数据结构。


将解析后的代码段另存为.zip格式,可以得到一个压缩文件夹,打开文件夹,可以看到文档的内容被存储在不同的文件里。
这里涉及到一个新名词:OPC-Open Package Convention开放打包协定,是一种基于zip+xml定义的文件存储格式。
docm文件进行如上操作后得到的压缩文件夹如下图:

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

Office文档2007前后的版本格式不同。Office 2007之前的版本格式为OLE文件,在此基础上Office 2007之后的版本加入了XML文件格式。这种新的文件格式称为Office Open XML,文档结构更为清晰。

Office
2007之前的版本可以看作二进制文件。用Microsoft的Offvis十六进制编辑器可以打开示例文件,清楚地观察到OLE文档结构。其中十六进制文件头为D0 CF 11 E0 A1 B1 1A E1,这是固定的OLESS文档格式文件头。

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

以pptx文件为例。.pptx文件是包含许多“部件”(通常为UTF-8或UTF-16编码)或XML文件的zip文件(包)。该包还可能包含其他媒体文件,如图像。该结构根据OOXML标准ECMA-376第2部分中概述的开放式包装惯例进行组织。位于Microsoft Powerpoint文件的ppt文件夹中,内部的文件数量和类型将根据演示文稿中的内容而有所不同,但总会有[Content_Types]
.xml,一个或多个关系(.rels)部件和ppt演示部件(presentation.xml)。通常,还将存在至少一页幻灯片文件,以及幻灯片主页文件和做幻灯片的幻灯片格式文件。

每个PK包都必须有一个[Content_Types] .xml,在包的根目录中找到。此文件包含包中所有部件的内容类型的列表,每个部分及其类型必须列在[Content_Types] .xml中。

每个PK包都包含一个关系文件rels,用于定义其他部分与包外部资源之间的关系。这将文件之间的关系与内容分开,使得在不更改引用目标的源的情况下更改关系变得容易。对于OOXML包,_rels文件夹中始终存在关系部分(.rels),用于标识包的起始部分或包关系。例如,以下定义了演示文稿内容的起始部分的标识:

<Relationship   Id=“rId1”Type =“http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument”Target =“ppt / presentation.xml”/>。

对于app.xml和core.xml,.rels中通常也存在关系。除了PK包的关系部分之外,作为一个或多个关系的源的每个部分将具有其自己的关系部分。每个这样的关系部分都在零件的_rels子文件夹中找到,并通过将“.rels”附加到零件的名称来命名。通常,主要内容部分(presentation.xml)具有自己的关系部分(presentation.xml.rels)。它将包含与内容其他部分的关系,例如slideMaster1.xml,notesMaster1.xml,handoutMaster1.xml,slide1.xml,presProps.xml,tableStyles.xml,theme1.xml,以及外部链接的URL。

PPTX文件的基本解析依据以下流程:

1)      
读取 /[Content_Types].xml 文件,获取到所有文件的类型;需要了解
OPC 中关于 ContentTypes 的内容。

2)      
读取 /_rels/.rels  Package Relationship 文件,获取 presentation.xml 文件的位置,比如 /ppt/presentation.xml;需要了解
OPC 中关于 Relationship 的内容以及 PML 的基本内容。

3)      
读取 /ppt/presentation.xml 文件以及其关联的
Relationship 文件 /ppt/_rels/presentation.xml.rels,得到该PPT所有页面文件的存储位置,比如 /ppt/slides/slide1.xml,以及
slideMaster(母版)文件的存储位置,比如 /ppt/slideMasters/slideMaster1.xml,以及
slideLayout(板式)等相关文件的存储位置;需要了解 PML 中关于
Presentation 的定义,也就是 PML 的 XSD 中定义的 CT_Presentation 类型。

4)      
读取 /ppt/slides/slide1.xml 文件内容以及其关联的
Relationship/ppt/slides/_rels/slide1.xml.rels,可以得到该页面的所有元素信息;

恶意Office文档解析——1. Office文档格式解析相关推荐

  1. Office 2003 打开RMS权限保护文档时出错

    公司内装了RMS服务器,12月11日突然出现问题,Office 2003 打开RMS权限保护文档时出错,截屏如下图. 网上找不到相关文献,开始以为是RMS服务问题,重装RMS服务器问题依旧,百思不得其 ...

  2. java计算机毕业设计计算机office课程平台MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计计算机office课程平台MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计计算机office课程平台MyBatis+系统+LW文档+源码+调试部署 本源码技 ...

  3. 文档管理服务器 office,文档管理控件WebOffice的产品架构原理——一张图就能解释...

    WebOffice是流行于国内市场的文档管理控件.20多年来,经华尔太科技研发团队不断迭代升级,WebOffice已更新至2019版本,最新版永久突破谷歌Chrome.火狐FireFox.EDGE等浏 ...

  4. Office Online Server 在线编辑Office文档,安装部署

    一.Office Online Server介绍 Office Online Server是 Office Web Apps Server 的升级版本,安装环境必须为两台Windows Server ...

  5. 电脑安装了WPS之后,文档无法用原来的office打开,右键新建的文档是wps类型的而不是office类型的解决方案

    前言:因为我身边很多小伙伴都遇到自己的电脑已经安装了office,之后又安装了WPS,安装了WPS之后,每次打开文档都是默认用WPS打开,有时想右键新建一个office的文档,但是建立的都是WPS文档 ...

  6. Python 技术篇-利用Office VBA实现word文档转化为pdf文档实例演示

    # -*- coding: UTF8 -*- from win32com.client import *def switch_pdf(path, name):'''作用:将word文档转化为pdf文档 ...

  7. freemarker生成word文档无法用office打开问题

    错误原因: 利用freemarker生成的word文档利用notepad打开是xml格式.而正常的文档格式利用notepad打开是乱码,需要转换. 代码案例: import com.aspose.wo ...

  8. freemarker导出word文档——WordXML格式解析

    前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...

  9. php解析word,获得文档中的图片

    背景 前段时间在写一个功能:用原生php将获得word中的内容并导入到网站系统中.因为文档中存在公式,图片,表格等,因此写的比较麻烦. 思路 大体思路是先将word中格式为doc的文档转化为docx, ...

最新文章

  1. 如何通过代码连接SQL Server数据库
  2. 实现两个pawn的切换
  3. 使用maxwell实时同步mysql数据到kafka
  4. 使用find命令查找文件
  5. 全网史上最全IT,人工智能,网页开发资料免费送;新时代人人都需要的资料,不看后悔
  6. python跟谁学_学 Python 都用来干嘛的?
  7. arp 原理及查杀方式
  8. 【洛谷习题】又是毕业季II
  9. SOCKET编程详解
  10. (首个填坑)联想拯救者Y7000(自带win10 home) 安装Ubuntu16.04.6 + NVIDIA GTX1650驱动
  11. 最全的Windows进程详解!
  12. 2020年日历电子版(打印版)_2020年日历全年表黄历-2020年日历打印版下载 A4横版带农历--pc6下载站...
  13. react-native系列(24)API篇:屏幕宽高和屏幕像素密度
  14. Tracup|拒绝低效办公,8个Tips让你芜湖起飞,工作效率MAX
  15. 2020-03-10
  16. JS实现文档下载兼容谷歌、火狐、IE
  17. [681]小米手机安装charles证书,提示“没有可安装的证书”
  18. C#模仿腾讯QQ源码下载(附效果图)_张童瑶的博客
  19. C语言谁是凶手-思路详解
  20. win8(四)实例讲解win8(XAML+C#)开发--------课程表:Snapped模式和动态磁贴,徽章(badge)

热门文章

  1. webpack 打包(初学打包运行)
  2. 张平安:加快云上数字创新,共建产业智慧生态
  3. 本周热榜 · 《计算机自学指南》
  4. 电脑常识:中文模式和英文模式下的符号有何区别?有何应用?
  5. html左加右减按钮,左加右减自变量,上加下减常数项,大部分学生并没有真正理解!...
  6. tar.gz文件怎么解压缩_如何解压缩tar.gz文件
  7. 绥化学院2021聋人高考成绩查询,2020聋人高考形势分析
  8. arcgis 合并名字相同的要素_ArcGIS中各种合并要素异同
  9. DB2读取CLOB字段-was报错:操作无效:已关闭 Lob。 ERRORCODE=-4470, SQLSTATE=null
  10. 黑马超级远程桌面5.6(可以批量管理1000台VPS或微软mstsc连接的实用工具)