黃步根,伏 娟
(1.江蘇警官學院計算機信息與網(wǎng)絡安全系,江蘇 南京210012;2.淮安市公安局,江蘇 淮安 223005)
MS-DOC文件文本提取研究*
黃步根1,伏 娟2
(1.江蘇警官學院計算機信息與網(wǎng)絡安全系,江蘇 南京210012;2.淮安市公安局,江蘇 淮安 223005)
關(guān)鍵詞搜索廣泛應用于情報分析、搜索引擎和計算機取證,對MS-DOC文件進行關(guān)鍵詞搜索可能漏判,明明存在的關(guān)鍵詞卻找不到。微軟復合文檔結(jié)構(gòu)由一系列流組成,流以扇區(qū)為單位存儲,通過目錄結(jié)構(gòu)和扇區(qū)分配表對流及其存儲空間進行管理。MS-DOC文件中的文本存儲在WordDocument流中,文本存儲不一定連續(xù),通過Table流記錄分塊情況。關(guān)鍵詞可能跨越不相鄰扇區(qū),即使在相鄰扇區(qū),一個關(guān)鍵詞可能一部分是壓縮存儲,另一部分是非壓縮存儲,這些都是關(guān)鍵詞搜索漏判的原因。根據(jù)Table流中的分塊信息提取WordDocument流中的文本,并統(tǒng)一編碼格式,進而進行關(guān)鍵詞搜索,就可以避免漏判。
復合文檔;文本提?。魂P(guān)鍵詞;搜索;計算機取證
對MS-DOC文件進行關(guān)鍵詞搜索可能漏判,明明存在的關(guān)鍵詞卻找不到。原因是MS-DOC文件文本分塊存儲,且有快速保存的complex格式和非快速保存的non-complex格式。根據(jù)分塊信息提取文本,并統(tǒng)一編碼格式,就可以解決漏判。
MS-DOC文件采用復合文檔結(jié)構(gòu)[1]。復合文檔的存儲空間以扇區(qū)(Sector)為單位進行管理。復合文檔包括多種信息,是由文字、圖片、聲音、視頻等信息復合而成的,仿照FAT32文件系統(tǒng)管理存儲內(nèi)容,存儲的內(nèi)容為一系列流(Stream),流的管理對應FAT32系統(tǒng)中的目錄管理,流的存儲不要求連續(xù),用扇區(qū)分配表來存儲鏈接關(guān)系,相當于FAT32系統(tǒng)的FAT表。對于長度較小的流,集中存儲在短扇區(qū)中,建立短扇區(qū)分配表,存儲“短流”鏈接關(guān)系。
MS-DOC文件的常見流[2]有:數(shù)據(jù)流Data(主要是圖片信息)、表(Table)、WordDocument、摘要信息(SummaryInformation)、其他摘要信息(DocumentSummaryInformation)、通用對象(CompObj)等,主流是WordDocument,存儲文本信息。Word 2007開始增加XML倉庫。
2.1 扇區(qū)及其分配表
正常情況下,復合文檔的文件長度是512字節(jié)的整數(shù)倍,因為復合文件的存儲以扇區(qū)(Sector,也稱為頁Page)為單位進行管理,一個扇區(qū)512個字節(jié)。根據(jù)文件操作過程,各個流得到分配的存儲空間不一定是連續(xù)的,用扇區(qū)分配表SAT(Sector Allocation Table,又稱“扇區(qū)配置表”)來記錄鏈接關(guān)系,為區(qū)別于后面的短扇區(qū)分配表,使用“主扇區(qū)分配表MSAT(Main SAT)”表示。文件頭信息占用512個字節(jié),不計入扇區(qū)分配表,頭扇區(qū)后的第1個扇區(qū)記為0扇區(qū),此后依次為1、2、3、…扇區(qū),扇區(qū)號記為SID(Sector IDentifier),用雙字(32 bit,4字節(jié))存儲。
在SAT表中,有幾個特殊的數(shù)值記號,含義見表1。尤其注意,SAT表中的-1表示未分配扇區(qū),而不是文件頭扇區(qū)。
Table 1 Special values in SAT表1 SAT表中的特殊數(shù)值
關(guān)于SAT擴展扇區(qū),需要作進一步說明。在文件頭中記錄了一些基礎信息(詳見2.4復合文檔頭格式),空出109個雙字單元用于存儲SAT表,如此可以計算:
一個扇區(qū)512字節(jié),一個鏈表項需要4字節(jié),512/4=128,即一個扇區(qū)可以記錄128個SID。
109個扇區(qū)放SAT表,128*109個SID,一個SID對應一個扇區(qū),512字節(jié),加上文件頭扇區(qū),文件的最大長度=512+512*128*109 =7143936=6976 KB≈7 MB,當文件超過此長度時,Microsoft Office系統(tǒng)另外占用扇區(qū)(稱為SAT擴展扇區(qū))來記錄SAT表,在SAT表中,這些扇區(qū)用-4表示。SAT擴展扇區(qū)的第1個扇區(qū)在文件頭中記錄,1個扇區(qū)512字節(jié),一個鏈表數(shù)據(jù)項4字節(jié),512/4=128,多個SAT擴展扇區(qū)也需要相互鏈接,這個鏈表不在SAT表中,而是自維護,在128個數(shù)據(jù)項的最后一項,不是SAT表的鏈接數(shù)據(jù),而是擴展鏈表的下一個擴展扇區(qū)。
2.2 短流和短扇區(qū)
一般地,設定數(shù)值4 096作為標準流的長度,當流的長度小于該數(shù)值時,稱為短流(Mini-stream),使用短扇區(qū)(Short Sector)來存放,短流有單獨的扇區(qū)分配表,記為SSAT(Short Sector Allocation Table)。短流的存儲空間實際占用的是標準扇區(qū),短扇區(qū)的長度一般為64字節(jié),512/64=8,即八個短扇區(qū)占用一個標準扇區(qū)。
目錄的第一個流記錄了短流的存儲空間首扇區(qū),結(jié)合SAT就可以得到短流的全部扇區(qū)占用情況。
2.3 目錄結(jié)構(gòu)
Microsoft Office 二進制文件格式的所有文件數(shù)據(jù)存在于一個或多個流中。每個流均包含用于存儲元數(shù)據(jù)(如用戶和系統(tǒng)信息、文件屬性、格式信息、文本內(nèi)容和媒體內(nèi)容)的數(shù)據(jù)結(jié)構(gòu),存于目錄區(qū)。
一個目錄項的大小嚴格地為128個字節(jié):
typedef struct {
charName[64]; /*0,此流的名字,一般為16位的Unicode字符,以0結(jié)束*/
WORDsize; /*0x40,用于存放名字的區(qū)域的大小,包括結(jié)尾的0*/
charEntry_type; //0x42,目錄項類型
charrgb; /*0x43,此目錄項的節(jié)點顏色:00=Red,01=Black*/
intLeft_did; //0x44,其左節(jié)點的DID
intRight_did; //0x48,其右節(jié)點的DID
intChild_did; /*0x4c,其成員紅黑樹的根節(jié)點的DID*/
charreserved1[16+4+8+8]; /*0x50,16,可能全為0*/
//0x60,4,用戶標記(可能全為0)
//0x64,8,創(chuàng)建此目錄項的時間標記
//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。
復合文檔的內(nèi)容以流的形式存在,用目錄結(jié)構(gòu)進行管理。含有子目錄的流稱為倉庫(Storage),相當于文件夾。
目錄樹按照流名稱的長度(長度相同的根據(jù)名稱的字典序)構(gòu)成變型的二叉排序樹,規(guī)定:左節(jié)點<根節(jié)點<右節(jié)點。目錄項中記錄左右子女的序號,“變型”之處在于對于倉庫,給出子目錄流的根節(jié)點序號。
2.4 復合文檔頭格式
前面所敘述的MSAT、SSAT、根目錄、SAT擴展扇區(qū)等記錄在文件的開始扇區(qū),以八個字節(jié)十六進制數(shù)據(jù){D0,CF, 11,E0,A1,B1, 1A,E1}為特征開頭,其后包含了有關(guān)扇區(qū)分配和目錄的基礎數(shù)據(jù),主要數(shù)據(jù)項如表2所示。
Table 2 Main data in the first sector of file表2 文件頭扇區(qū)主要數(shù)據(jù)
文件頭中還包括標準流的大小和短扇區(qū)的大小,以2的冪形式存儲,例如存儲6表示26=64。
對MS-DOC文件進行關(guān)鍵詞搜索可能漏判,需要研究其存儲規(guī)律,尋求解決辦法。
3.1 文件信息塊
文件信息塊FIB(File Information Block)位于WordDocument 流開始,記錄了文本的開始位置(FIB.fcMin)、文本的長度和文件狀態(tài)等信息。FIB存儲的信息與MS-DOC版本有關(guān)。
FIB由四部分組成:頭和三個數(shù)組。前32個字節(jié)為“頭”,記錄基本信息(FibBase),各版本沒有變化。第一個數(shù)組是字(short,2字節(jié))數(shù)組;第二個數(shù)組是雙字(int 或DWORD,4字節(jié))數(shù)組;第三個數(shù)組是8字節(jié)的雙雙字數(shù)組,是一系列屬性數(shù)據(jù),包括兩部分,一部分是文件字符位置FC(File Character position)值,另一部分是長度。三個數(shù)組的開始處總是兩字節(jié)的數(shù)組項目數(shù)。基本信息的主要內(nèi)容見表3。
Table 3 Main data in FibBase表3 FibBase主要內(nèi)容(表中數(shù)據(jù)為十六進制數(shù),下同)
未加密文檔的口令校驗和和種子為0,加密機制與版本有關(guān),Office文檔采用對稱密碼體制,李小波等[3]對Office文件加密機制進行了整體分析。
0A處的字單元option是各種選項設置的匯總,二進制位b8(option&0x0100)為fEncrypted,1表示文件是加密的;二進制位b10(option & 0x0400)為fReadOnly,1表示文件是只讀的,等等。
關(guān)于三個數(shù)組,前兩個比較固定,變化主要在第三個。通常情況如表4所示。
Table 4 Example of FIB layout表4 FIB分布舉例
0x152處的雙雙字數(shù)組是關(guān)于文本分塊情況的信息,第一個雙字是分塊表的位置,第二個雙字是分塊表的長度,在3.3節(jié)中敘述。
3.2 文本編碼
計算機中最早處理的文字是英文符號(鍵盤字符、控制符號等),編碼是ASCII碼,一個字符占一個字節(jié),20世紀90年代,微軟針對全球文字引入了雙字節(jié)的Unicode編碼,對于原來的ASCII字符編碼,簡單地將高字節(jié)置0(一般地,高字節(jié)存于高地址)。西文字符編碼如表5所示。
Table 5 Example for encoding the English characters表5 西文符號編碼舉例
中國大陸計算機漢字編碼始于GB2312-1980,只有6 000多個漢字字符,機內(nèi)碼一個漢字占兩字節(jié),GB18030-2005擴充到2.7萬漢字;臺灣地區(qū)的標準漢字是字符集CNS 11643(BIG 5,俗稱“大五碼”);日本工業(yè)標準漢字是字符集JIS X 0208-90;韓國國家標準漢字是字符集KSC 5601-87。同一漢字的不同編碼方案得到不同編碼,比如“中國”的GB機內(nèi)碼是“d6 d0 b9 fa”,Unicode編碼是“2d 4e fd 56”。在簡體中文系統(tǒng)下的記事本編輯的是文本文件,漢字采用GB碼,西文字符采用ASCII碼。GB碼中也包含西文字符,即所謂全角字符。
MS-DOC的WordDocument流中的文本信息的存儲有兩種形式:壓縮存儲和非壓縮存儲。所謂壓縮存儲,是針對連續(xù)的純英文符號,采用ASCII編碼,一個字符占一個字節(jié)。在一個扇區(qū)內(nèi)中西文混合編排的內(nèi)容,非壓縮存儲,采用Unicode編碼,不論是中文還是西文符號,都是兩個字節(jié),西文的兩個字節(jié)中,高字節(jié)總是0。可見,ASCII編碼存儲節(jié)省了存儲空間。在一個MS-DOC文件中,兩種形式是可以并存的,即混合存儲,在一個扇區(qū)內(nèi)只采用一種形式,具體采用的是哪種存儲形式,在存儲描述塊中予以說明。一個扇區(qū)512個字節(jié),對于連續(xù)超過其一半長度(256個)字符的,優(yōu)先采用ASCII編碼存儲,不足512的,補0存儲。
文本信息中還有一些特殊的符號,如頁號、腳注、分隔符等。
3.3 MS-DOC文件文本信息的存儲
文檔中的相鄰字符在二進制文件中不一定相鄰。MS-DOC文件的保存方式有快速保存的complex格式(壓縮存儲)和非快速保存的non-complex格式。non-complex格式保存的文本物理順序與邏輯順序一致,其文本流能夠通過FC來描述,它不需要修改屬性PRM(PRoperty Modifier)。
文本信息包括正文的文本、腳注、尾注、文本框內(nèi)文本等,在WordDocument流的FIB中有所記錄,如表6所示。
Table 6 Description of the text in the header of word file表6 Word文件頭部關(guān)于文本的描述
注:字符位置CP (Character Position)表示文件中字符在文本流中的邏輯坐標。CcpText表示字的個數(shù)(“中國086”是5個字符,ANSI存儲占7個字節(jié),Unicode存儲占10個字節(jié))。
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文件只有前者,在文件異常關(guān)閉等情況下可能有后者,此時實際使用哪個,在FIB中有專門標注,0a處的字單元option二進制位b9(option&0x0200)為fWhichTblStm,1表示“1Table”,0表示“0Table”。
在表流中記錄各個存儲塊,其記錄數(shù)據(jù)包括位置、長度、是否壓縮等,如表8所示。
Table 8 Block information for the text表8 文本分塊信息
表中長度是字符數(shù)。對于壓縮存儲(壓縮否=1),就是實際占用的字節(jié)數(shù),對于非壓縮存儲(壓縮否=0),一個字符占用兩字節(jié),所以實際占用的字節(jié)數(shù)要加倍。
實際存儲要比表8更為復雜,如果分塊數(shù)是n,則“長度”是用n+1項升序排列的四字節(jié)整數(shù)aCP數(shù)組表達的,長度是相鄰兩項的差值,即len[i]=len[i+1]-len[i],如表9所示。
Table 9 Calculate the length for aCP表9 aCP(用相鄰差值計算出長度)
分塊的位置和壓縮狀況的存儲則更加復雜。8字節(jié)的aPcd變量指定文本位置和附加屬性,具體存儲格式[4]如圖1所示。
Figure 1 aPcd structure圖1 aPcd結(jié)構(gòu)
文本修改屬性PRM等與本課題關(guān)系不大,不作討論,只有FC還要細化,高位表示壓縮與否,如圖2所示。
Figure 2 Compression flags for the FC圖2 FC壓縮標志
其中,B必須為0;A=1表示壓縮存儲,ASCII編碼,存儲位置在FC/2;A=0表示非壓縮存儲,Unicode編碼,F(xiàn)C為存儲位置。
FIB中0x152處的雙字clx指向Table流中的clx結(jié)構(gòu)。clx結(jié)構(gòu)先看一個字節(jié)clxt,取值1或2。
clxt=1,grpprl屬性。后跟兩個字節(jié)的grpprl計數(shù)器,再跟一系列g(shù)rpprl屬性,在此略去。clxt=2,分塊屬性,后跟四個字節(jié)分塊表計數(shù)器,再跟分塊表Plcfpcd,如圖3所示。
Figure 3 Plcfpcd structure圖3 Plcfpcd結(jié)構(gòu)
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結(jié)構(gòu),如圖5所示。
Figure 5 Clx structure in table stream圖5 Table流中Clx結(jié)構(gòu)
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結(jié)構(gòu)(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,F(xiàn)cCompressed=1,壓縮方式,F(xiàn)C=1c00/2=e00。
得到分塊的位置和壓縮情況:
FC/fCompressed:400/0,600/0,800/0,A00/0,E00/1,1600/0,…
綜合上述分析,得到文本數(shù)據(jù)分塊情況,如表8所示。
檢查2個分塊,如圖7和圖8,分別是非壓縮存儲的文本和壓縮存儲的文本。非壓縮存儲的文本每個ASCII字符占用兩個字節(jié),而壓縮存儲的文本每個ASCII字符占用一個字節(jié)。
Figure 7 Text in non-compressed圖7 非壓縮存儲的文本
Figure 8 Text in compressed圖8 壓縮存儲的文本
微軟復合文檔是結(jié)構(gòu)化的存儲文件,這種文件由微軟的OLE Structured Storage API來創(chuàng)建和管理。Storage有關(guān)函數(shù)(IStorage接口)可以用于文本信息提取,操作流程如圖9所示。
Figure 9 Flowchart of extracting the text圖9 文本信息提取流程圖
對Table流的處理關(guān)鍵是Plcfpcd結(jié)構(gòu)信息的處理。
在VC6開發(fā)環(huán)境中,利用MFC,設計了一個復合文檔檢查工具,可以顯現(xiàn)復合文檔的結(jié)構(gòu)信息和結(jié)構(gòu)內(nèi)容,并能提取MS-DOC文件文本信息,如圖10所示。
Figure 10 Compound checker圖10 復合文檔結(jié)構(gòu)檢查工具
實驗表明,該工具工作正常,提取的文本信息以文本形式保存,解決了MS-DOC文本跨塊斷裂和編碼格式不統(tǒng)一等問題,對保存的文本文件進行關(guān)鍵詞搜索,就不會出現(xiàn)漏判問題。
關(guān)鍵詞搜索在搜索引擎、計算機取證等領(lǐng)域有著廣泛的應用,但是可能出現(xiàn)漏判,明明存在的關(guān)鍵詞卻找不到。本文分析微軟復合文檔結(jié)構(gòu),研究MS-DOC文本存儲方式,根據(jù)分塊信息提取文本,并統(tǒng)一編碼格式,進而進行關(guān)鍵詞搜索,有效解決了對MS-DOC文件進行關(guān)鍵詞搜索“漏判”的問題。有關(guān)搜索引擎和計算機取證工具應該作相應改進。
根據(jù)文件結(jié)構(gòu)特征,逐個突破,是解決關(guān)鍵詞搜索漏判的有效途徑。
[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);公安技術(shù),江蘇省高等學?!笆濉敝攸c學科建設專項資金資助
TP391
:A
10.3969/j.issn.1007-130X.2014.08.014
黃步根(1958-),男,江蘇揚中人,教授,研究方向為信息安全和計算機取證。E-mail:bghuang@sina.com
通信地址:210012 江蘇省南京市江蘇警官學院計算機信息與網(wǎng)絡安全系
Address:Department of Computer Information and Cyber Security,Jiangsu Police Institute,Nanjing 210012,Jiangsu,P.R.China