MS-DOC文件文本提取研究*

2014-09-13 12:44黄步根
计算机工程与科学 2014年8期

黄步根,伏 娟

(1.江苏警官学院计算机信息与网络安全系,江苏 南京210012;2.淮安市公安局,江苏 淮安 223005)

MS-DOC文件文本提取研究*

黄步根1,伏 娟2

(1.江苏警官学院计算机信息与网络安全系,江苏 南京210012;2.淮安市公安局,江苏 淮安 223005)

关键词搜索广泛应用于情报分析、搜索引擎和计算机取证,对MS-DOC文件进行关键词搜索可能漏判,明明存在的关键词却找不到。微软复合文档结构由一系列流组成,流以扇区为单位存储,通过目录结构和扇区分配表对流及其存储空间进行管理。MS-DOC文件中的文本存储在WordDocument流中,文本存储不一定连续,通过Table流记录分块情况。关键词可能跨越不相邻扇区,即使在相邻扇区,一个关键词可能一部分是压缩存储,另一部分是非压缩存储,这些都是关键词搜索漏判的原因。根据Table流中的分块信息提取WordDocument流中的文本,并统一编码格式,进而进行关键词搜索,就可以避免漏判。

复合文档;文本提取;关键词;搜索;计算机取证

1 引言

对MS-DOC文件进行关键词搜索可能漏判,明明存在的关键词却找不到。原因是MS-DOC文件文本分块存储,且有快速保存的complex格式和非快速保存的non-complex格式。根据分块信息提取文本,并统一编码格式,就可以解决漏判。

2 复合文档结构

MS-DOC文件采用复合文档结构[1]。复合文档的存储空间以扇区(Sector)为单位进行管理。复合文档包括多种信息,是由文字、图片、声音、视频等信息复合而成的,仿照FAT32文件系统管理存储内容,存储的内容为一系列流(Stream),流的管理对应FAT32系统中的目录管理,流的存储不要求连续,用扇区分配表来存储链接关系,相当于FAT32系统的FAT表。对于长度较小的流,集中存储在短扇区中,建立短扇区分配表,存储“短流”链接关系。

MS-DOC文件的常见流[2]有:数据流Data(主要是图片信息)、表(Table)、WordDocument、摘要信息(SummaryInformation)、其他摘要信息(DocumentSummaryInformation)、通用对象(CompObj)等,主流是WordDocument,存储文本信息。Word 2007开始增加XML仓库。

2.1 扇区及其分配表

正常情况下,复合文档的文件长度是512字节的整数倍,因为复合文件的存储以扇区(Sector,也称为页Page)为单位进行管理,一个扇区512个字节。根据文件操作过程,各个流得到分配的存储空间不一定是连续的,用扇区分配表SAT(Sector Allocation Table,又称“扇区配置表”)来记录链接关系,为区别于后面的短扇区分配表,使用“主扇区分配表MSAT(Main SAT)”表示。文件头信息占用512个字节,不计入扇区分配表,头扇区后的第1个扇区记为0扇区,此后依次为1、2、3、…扇区,扇区号记为SID(Sector IDentifier),用双字(32 bit,4字节)存储。

在SAT表中,有几个特殊的数值记号,含义见表1。尤其注意,SAT表中的-1表示未分配扇区,而不是文件头扇区。

Table 1 Special values in SAT表1 SAT表中的特殊数值

关于SAT扩展扇区,需要作进一步说明。在文件头中记录了一些基础信息(详见2.4复合文档头格式),空出109个双字单元用于存储SAT表,如此可以计算:

一个扇区512字节,一个链表项需要4字节,512/4=128,即一个扇区可以记录128个SID。

109个扇区放SAT表,128*109个SID,一个SID对应一个扇区,512字节,加上文件头扇区,文件的最大长度=512+512*128*109 =7143936=6976 KB≈7 MB,当文件超过此长度时,Microsoft Office系统另外占用扇区(称为SAT扩展扇区)来记录SAT表,在SAT表中,这些扇区用-4表示。SAT扩展扇区的第1个扇区在文件头中记录,1个扇区512字节,一个链表数据项4字节,512/4=128,多个SAT扩展扇区也需要相互链接,这个链表不在SAT表中,而是自维护,在128个数据项的最后一项,不是SAT表的链接数据,而是扩展链表的下一个扩展扇区。

2.2 短流和短扇区

一般地,设定数值4 096作为标准流的长度,当流的长度小于该数值时,称为短流(Mini-stream),使用短扇区(Short Sector)来存放,短流有单独的扇区分配表,记为SSAT(Short Sector Allocation Table)。短流的存储空间实际占用的是标准扇区,短扇区的长度一般为64字节,512/64=8,即八个短扇区占用一个标准扇区。

目录的第一个流记录了短流的存储空间首扇区,结合SAT就可以得到短流的全部扇区占用情况。

2.3 目录结构

Microsoft Office 二进制文件格式的所有文件数据存在于一个或多个流中。每个流均包含用于存储元数据(如用户和系统信息、文件属性、格式信息、文本内容和媒体内容)的数据结构,存于目录区。

一个目录项的大小严格地为128个字节:

typedef struct {

charName[64]; /*0,此流的名字,一般为16位的Unicode字符,以0结束*/

WORDsize; /*0x40,用于存放名字的区域的大小,包括结尾的0*/

charEntry_type; //0x42,目录项类型

charrgb; /*0x43,此目录项的节点颜色:00=Red,01=Black*/

intLeft_did; //0x44,其左节点的DID

intRight_did; //0x48,其右节点的DID

intChild_did; /*0x4c,其成员红黑树的根节点的DID*/

charreserved1[16+4+8+8]; /*0x50,16,可能全为0*/

//0x60,4,用户标记(可能全为0)

//0x64,8,创建此目录项的时间标记

//0x6c,8,最后修改此目录项的时间标记

DWORDstreamroot_Sid; /*0x74,4,若此为流的入口,指定流的第一个Sector或Short Sector的SID,若此为根仓库入口,指定短流存放流的第一个Sector的SID,其他情况为0*/ DWORDstreamrootSid_size; /*0x78,4,若此为流的入口,指定流的大小,若此为根仓库入口,指定短流存放流的大小,其他情况为0*/

charreserved2[4]; //0x7c,4,保留

}DIRENTRY;

注:DID(DirectoryIDentifier)是目录项序号。若子女为空,DID=-2。

复合文档的内容以流的形式存在,用目录结构进行管理。含有子目录的流称为仓库(Storage),相当于文件夹。

目录树按照流名称的长度(长度相同的根据名称的字典序)构成变型的二叉排序树,规定:左节点<根节点<右节点。目录项中记录左右子女的序号,“变型”之处在于对于仓库,给出子目录流的根节点序号。

2.4 复合文档头格式

前面所叙述的MSAT、SSAT、根目录、SAT扩展扇区等记录在文件的开始扇区,以八个字节十六进制数据{D0,CF, 11,E0,A1,B1, 1A,E1}为特征开头,其后包含了有关扇区分配和目录的基础数据,主要数据项如表2所示。

Table 2 Main data in the first sector of file表2 文件头扇区主要数据

文件头中还包括标准流的大小和短扇区的大小,以2的幂形式存储,例如存储6表示26=64。

3 MS-DOC文件文本信息的存储

对MS-DOC文件进行关键词搜索可能漏判,需要研究其存储规律,寻求解决办法。

3.1 文件信息块

文件信息块FIB(File Information Block)位于WordDocument 流开始,记录了文本的开始位置(FIB.fcMin)、文本的长度和文件状态等信息。FIB存储的信息与MS-DOC版本有关。

FIB由四部分组成:头和三个数组。前32个字节为“头”,记录基本信息(FibBase),各版本没有变化。第一个数组是字(short,2字节)数组;第二个数组是双字(int 或DWORD,4字节)数组;第三个数组是8字节的双双字数组,是一系列属性数据,包括两部分,一部分是文件字符位置FC(File Character position)值,另一部分是长度。三个数组的开始处总是两字节的数组项目数。基本信息的主要内容见表3。

Table 3 Main data in FibBase表3 FibBase主要内容(表中数据为十六进制数,下同)

未加密文档的口令校验和和种子为0,加密机制与版本有关,Office文档采用对称密码体制,李小波等[3]对Office文件加密机制进行了整体分析。

0A处的字单元option是各种选项设置的汇总,二进制位b8(option&0x0100)为fEncrypted,1表示文件是加密的;二进制位b10(option & 0x0400)为fReadOnly,1表示文件是只读的,等等。

关于三个数组,前两个比较固定,变化主要在第三个。通常情况如表4所示。

Table 4 Example of FIB layout表4 FIB分布举例

0x152处的双双字数组是关于文本分块情况的信息,第一个双字是分块表的位置,第二个双字是分块表的长度,在3.3节中叙述。

3.2 文本编码

计算机中最早处理的文字是英文符号(键盘字符、控制符号等),编码是ASCII码,一个字符占一个字节,20世纪90年代,微软针对全球文字引入了双字节的Unicode编码,对于原来的ASCII字符编码,简单地将高字节置0(一般地,高字节存于高地址)。西文字符编码如表5所示。

Table 5 Example for encoding the English characters表5 西文符号编码举例

中国大陆计算机汉字编码始于GB2312-1980,只有6 000多个汉字字符,机内码一个汉字占两字节,GB18030-2005扩充到2.7万汉字;台湾地区的标准汉字是字符集CNS 11643(BIG 5,俗称“大五码”);日本工业标准汉字是字符集JIS X 0208-90;韩国国家标准汉字是字符集KSC 5601-87。同一汉字的不同编码方案得到不同编码,比如“中国”的GB机内码是“d6 d0 b9 fa”,Unicode编码是“2d 4e fd 56”。在简体中文系统下的记事本编辑的是文本文件,汉字采用GB码,西文字符采用ASCII码。GB码中也包含西文字符,即所谓全角字符。

MS-DOC的WordDocument流中的文本信息的存储有两种形式:压缩存储和非压缩存储。所谓压缩存储,是针对连续的纯英文符号,采用ASCII编码,一个字符占一个字节。在一个扇区内中西文混合编排的内容,非压缩存储,采用Unicode编码,不论是中文还是西文符号,都是两个字节,西文的两个字节中,高字节总是0。可见,ASCII编码存储节省了存储空间。在一个MS-DOC文件中,两种形式是可以并存的,即混合存储,在一个扇区内只采用一种形式,具体采用的是哪种存储形式,在存储描述块中予以说明。一个扇区512个字节,对于连续超过其一半长度(256个)字符的,优先采用ASCII编码存储,不足512的,补0存储。

文本信息中还有一些特殊的符号,如页号、脚注、分隔符等。

3.3 MS-DOC文件文本信息的存储

文档中的相邻字符在二进制文件中不一定相邻。MS-DOC文件的保存方式有快速保存的complex格式(压缩存储)和非快速保存的non-complex格式。non-complex格式保存的文本物理顺序与逻辑顺序一致,其文本流能够通过FC来描述,它不需要修改属性PRM(PRoperty Modifier)。

文本信息包括正文的文本、脚注、尾注、文本框内文本等,在WordDocument流的FIB中有所记录,如表6所示。

Table 6 Description of the text in the header of word file表6 Word文件头部关于文本的描述

注:字符位置CP (Character Position)表示文件中字符在文本流中的逻辑坐标。CcpText表示字的个数(“中国086”是5个字符,ANSI存储占7个字节,Unicode存储占10个字节)。

FIB的0A处字单元option二进制位B2(option&0x004)为fComplex,1 表示文件是快速保存的complex格式,0表示non-complex格式。

对于使用non-complex方式保存的文档,字符的物理顺序和逻辑顺序一致,通过表7中的变量可以很方便地确定每种文本的存储位置。

Table 7 Position of segment in word file表7 Word文件格式中各个段落的起始位置

对于使用complex方式保存的文档,在WordDocument流存储文本,在表流存储修改属性和分块信息,记录各个存储块。表流有“1Table” 和 “0Table”,一般MS-DOC文件只有前者,在文件异常关闭等情况下可能有后者,此时实际使用哪个,在FIB中有专门标注,0a处的字单元option二进制位b9(option&0x0200)为fWhichTblStm,1表示“1Table”,0表示“0Table”。

在表流中记录各个存储块,其记录数据包括位置、长度、是否压缩等,如表8所示。

Table 8 Block information for the text表8 文本分块信息

表中长度是字符数。对于压缩存储(压缩否=1),就是实际占用的字节数,对于非压缩存储(压缩否=0),一个字符占用两字节,所以实际占用的字节数要加倍。

实际存储要比表8更为复杂,如果分块数是n,则“长度”是用n+1项升序排列的四字节整数aCP数组表达的,长度是相邻两项的差值,即len[i]=len[i+1]-len[i],如表9所示。

Table 9 Calculate the length for aCP表9 aCP(用相邻差值计算出长度)

分块的位置和压缩状况的存储则更加复杂。8字节的aPcd变量指定文本位置和附加属性,具体存储格式[4]如图1所示。

Figure 1 aPcd structure图1 aPcd结构

文本修改属性PRM等与本课题关系不大,不作讨论,只有FC还要细化,高位表示压缩与否,如图2所示。

Figure 2 Compression flags for the FC图2 FC压缩标志

其中,B必须为0;A=1表示压缩存储,ASCII编码,存储位置在FC/2;A=0表示非压缩存储,Unicode编码,FC为存储位置。

FIB中0x152处的双字clx指向Table流中的clx结构。clx结构先看一个字节clxt,取值1或2。

clxt=1,grpprl属性。后跟两个字节的grpprl计数器,再跟一系列grpprl属性,在此略去。clxt=2,分块属性,后跟四个字节分块表计数器,再跟分块表Plcfpcd,如图3所示。

Figure 3 Plcfpcd structure图3 Plcfpcd结构

3.4 文本存储实例

选取一MS-DOC文件,分析文本存储情况如下:

(1) WordDocument流如图4所示。

Figure 4 WordDocument stream图4 WordDocument流

0A处的字单元option选项值=0x5 2f8,fWhichTblStm=option&0x0200=1,表示“1Table”。01A2处双字,值为0x00 097 2C4。

(2) 在1Table流中0x00 097 2C4处提取clx结构,如图5所示。

Figure 5 Clx structure in table stream图5 Table流中Clx结构

000972C4:02,00001300,得到:clx=02,len=0x1300。n=(0x1300-4)/(4+8)=0x195。

aCp从000972C9开始存放,计算分块长度,如表9所示。

aPcd从000972C9+(195+1)*4=097921开始存放,如图6所示。

Figure 6 Clx structure in table stream(aPcd)图6 Table流中Clx结构(aPcd)

参照图1,划分aPcd,得到:【0040 00000400 0000】,【0040 00000600 0000】,【0040 00000800 0000】,【0040 00000a00 0000】,【0040 40001c00 0000】,【0040 00001600 0000】,…

参照图2,解析分块,以【0040 40001C00 0000】为例,40001C00的最高2 bit=01,=>B=0,A=1,FcCompressed=1,压缩方式,FC=1c00/2=e00。

得到分块的位置和压缩情况:

FC/fCompressed:400/0,600/0,800/0,A00/0,E00/1,1600/0,…

综合上述分析,得到文本数据分块情况,如表8所示。

检查2个分块,如图7和图8,分别是非压缩存储的文本和压缩存储的文本。非压缩存储的文本每个ASCII字符占用两个字节,而压缩存储的文本每个ASCII字符占用一个字节。

Figure 7 Text in non-compressed图7 非压缩存储的文本

Figure 8 Text in compressed图8 压缩存储的文本

4 MS-DOC文件文本信息的提取

微软复合文档是结构化的存储文件,这种文件由微软的OLE Structured Storage API来创建和管理。Storage有关函数(IStorage接口)可以用于文本信息提取,操作流程如图9所示。

Figure 9 Flowchart of extracting the text图9 文本信息提取流程图

对Table流的处理关键是Plcfpcd结构信息的处理。

在VC6开发环境中,利用MFC,设计了一个复合文档检查工具,可以显现复合文档的结构信息和结构内容,并能提取MS-DOC文件文本信息,如图10所示。

Figure 10 Compound checker图10 复合文档结构检查工具

实验表明,该工具工作正常,提取的文本信息以文本形式保存,解决了MS-DOC文本跨块断裂和编码格式不统一等问题,对保存的文本文件进行关键词搜索,就不会出现漏判问题。

5 结束语

关键词搜索在搜索引擎、计算机取证等领域有着广泛的应用,但是可能出现漏判,明明存在的关键词却找不到。本文分析微软复合文档结构,研究MS-DOC文本存储方式,根据分块信息提取文本,并统一编码格式,进而进行关键词搜索,有效解决了对MS-DOC文件进行关键词搜索“漏判”的问题。有关搜索引擎和计算机取证工具应该作相应改进。

根据文件结构特征,逐个突破,是解决关键词搜索漏判的有效途径。

[1] Microsoft.Windows compound binary file format specification[EB/OL].[2012-12-01].http://download.microsoft.com/download/0/B/E/0BE8BDD7-E5E8-422A-ABFD-4342ED7A-D886/WindowsCompoundBinaryFileFormatSpecification.pdf.2010.4.

[2] Microsoft.Word97-2007 binary file format(doc) specification[EB/OL].[2012-12-01].http://download.microsoft.com/download/0/B/E/0BE8BDD7-E5E8-422A-ABFD-4342ED7A-

D886/WindowsCompoundBinaryFileFormatSpecification.pdf.2008.4.

[3] Li Xiao-bo,Guan Hai-bing,Li Xiao-yong,et al.Security performance of file encryption mechanism in office[J]. Journal of Computer Applications, 2010,30(Suppl 1):126-129.(in Chinese)

[4] Microsoft.[MS-DOC]:Word (.doc) binary file format[EB/OL].[2012-12-01].http://msdn.microsoft.com/en-us/library/cc313153(v=office.12).aspx.2012.10.

附中文参考文献:

[3] 李小波,管海兵,李小勇,等. Office文件加密机制的安全性[J]. 计算机应用, 2010,30(Suppl 1):126-129.

HUANGBu-gen,born in 1958,professor,his research interests include information security,and computer forensics.

伏娟(1979-),女,江苏连云港人,研究方向为计算机取证。E-mail:hafujuan@126.com

FUJuan,born in 1979,her research interest includes computer forensics.

ResearchonextractingtextfromMS-DOCfiles

HUANG Bu-gen1,FU Juan2

(1.Department of Computer Information and Cyber Security,Jiangsu Police Institute,Nanjing 210012;2.Huaian Municipal Public Security Bureau,Huaian 223005,China)

Keyword search is widely used in intelligence analysis, search engine and computer forensics. However, sometimes searching key words in MS-DOC files may fail to find out some matches, which are usually called false negatives. Microsoft compound document is composed by a series of stream stored in sectors. The streams and the sectors are managed through the directory and the sector allocation table. The text is stored in the MS-DOC fileWordDocumentstream, text storage is not necessarily continuous, and theTablestream records the block information. Keyword may be stored in different sectors that are not adjacent. Even the sectors are adjacent, the part of the keyword may be compressed, but the other part is not compressed. These cause the false negatives. Firstly, texts are extracted from theWordDocumentstream based on the block information in theTablestream, and they are encoded uniformly. Secondly, a keyword search is carried out. These two steps can avoid the false negative.

compound document;text extraction;keyword;search;computer forensics

1007-130X(2014)08-1505-07

2012-12-11;

:2013-03-05

国家社会科学基金资助项目(13BTQ046);公安技术,江苏省高等学校“十二五”重点学科建设专项资金资助

TP391

:A

10.3969/j.issn.1007-130X.2014.08.014

黄步根(1958-),男,江苏扬中人,教授,研究方向为信息安全和计算机取证。E-mail:bghuang@sina.com

通信地址:210012 江苏省南京市江苏警官学院计算机信息与网络安全系

Address:Department of Computer Information and Cyber Security,Jiangsu Police Institute,Nanjing 210012,Jiangsu,P.R.China