微軟OFFice複合文檔

來源:互聯網
上載者:User
勞拉"-神秘的微軟辦公軟體檔案格式在複合文檔中,可以有很多目錄,每個目錄下面可以有子目錄,目錄和子目錄中包含了“儲存”,一個儲存就相當於磁碟上的一個檔案,整個複合文檔就形成了一個類似於磁碟上的目錄和檔案所組成的樹狀結構。如果在視窗環境下使用複合檔案,可以利用作業系統提供的功能對複合檔案進行讀寫,就像讀寫通常的檔案和目錄一樣,可以在複合檔案內部列目錄,可以開啟一個指定的目錄,可以讀寫其中的一個“儲存”(檔案)。但是在DOS或者其他的環境下,作業系統沒有提供現成的讀寫複合檔案的功能,要想實現在其他動作系統下讀寫複合檔案,比如說在Linux下開發能夠讀寫WORD檔案的軟體,或者能夠在DOS環境下查殺巨集病毒的軟體,就必須對微軟“複合文檔”的二進位結構有非常清楚的瞭解。
  當WORD巨集病毒最早開始出現的時候,國內殺毒軟體廠商無一例外的陷入了束手無策的狀況,不像國外的大公司和微軟有非常好的合作,可以得到微軟的一些內部資料,國內廠商對於WORD檔案的內部結構一無所知。為了對付這種病毒,當時廠商想出了兩種方法:
  第一種是使用WORD BASIC編寫程式檢測和清除病毒,實際上,WORD BASIC就是巨集病毒本身使用的開發語言,開發人員利用WORD BASIC編寫自動載入的一小段代碼(從某種意義上來說,這也是一種病毒),開啟任何WORD檔案之前,首先檢查其中有沒有叫做“自動開啟”,“自動儲存”的宏存在,要是存在這些名字的宏就拒絕開啟這個文檔。
  第二種更加簡單,在分析了WORD檔案的格式之後,開發人員很難發現這種檔案的格式,所以採用了簡單的尋找/替換方式,在整個WORD檔案中搜尋字串,比如說搜尋名字叫做“AutoOpen”的字串,如果發現了這個字串則把它清除為空白格,這樣WORD開啟這個檔案的時候,就不會再自動的運行這個宏了。
  這兩種方式都存在很大的問題,第一種方法只能在WORD環境下運行,不啟動WORD對病毒就沒有任何辦法。第二種方式的問題更大,這種沒有搞清楚檔案結構就進行病毒查殺是一種非常不負責的行為,首先會造成大量的病毒誤判、漏報,把正常的WORD檔案當成病毒,甚至如果寫一篇關於巨集病毒的文章,裡面假設有這樣一句話:“巨集病毒裡面經常包括了AutoOpen名字的宏”,採用這種方式查殺病毒之後,會發現“AutoOpen”這個單詞不見了,我的天啊,這樣也能叫殺病毒?至於殺過毒之後,造成WORD檔案的資料損毀更是不勝枚舉。以至於一些廠商在隨後很長時間內,把“殺巨集病毒不破壞文檔”這個對殺毒軟體的基本要求作為產品的重大技術突破反覆宣傳。
  “勞拉”檔案格式:所有使用“勞拉”檔案格式的檔案由512位元組的資料區塊組成(你可以注意一下,所有的WORD、EXCEL、或者其他的Office檔案大小都是512的倍數),資料區塊的序號從-1開始:
  複合文檔

資料區塊-1
資料區塊0
資料區塊1
資料區塊2
資料區塊。。。
512位元組 512位元組      


序號為-1的塊是整個檔案的檔案頭塊,存放了複合檔案的一些整體資訊,結構如下:

位移量(十六進位) 大小(位元組) 內容
0 8 複合檔案標識(d0 cf 11 e0 a1 b1 1a e1)
2C 4 大塊映象圖的大小(塊數)
30 4 目錄鏈根的開始塊序號
3C 4 小塊映象圖的開始塊序號
4C 不確定 大塊映象圖使用的塊的列表

在512位元組的資料區塊基礎上,複合檔案中包括了兩種最基本的結構:
第一種是由512位元組的大塊串連起來的大塊鏈,如果對以檔案配置表(FAT)為基礎的檔案系統熟悉的話,可以很容易的理解大塊鏈的概念,只要知道一個大塊鏈的開始塊的序號,通過大塊映象圖,就可以找到這一條大塊鏈的所有內容。一個典型的大塊映象圖如下:
00200: fd ff ff ff 05 00 00 00 fe ff ff ff 04 00 00 00
00210: 06 00 00 00 fe ff ff ff 07 00 00 00 08 00 00 00
00220: 09 00 00 00 0a 00 00 00 0b 00 00 00 fe ff ff ff
00230: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
我們可以看到,如果一個大塊鏈的開始塊序號是0的話(該處的內容是5),那麼這個大塊鏈包括:序號為0的資料區塊、序號為5的資料區塊(該處的內容是7)、序號為7的資料區塊(該處的內容是9)、序號為9的資料區塊(該處的內容是0b)、序號為0b的資料區塊(該處的內容是-1,表示這是該鏈的最後一個資料區塊)。
對於比較小的結構,如果以512位元組為單位的話會造成比較大的空間浪費,所以專門使用一個大塊鏈來存放比較小的資料區塊,小於4096位元組的資料結構使用小塊鏈來表示,小塊鏈的組成和定址方法和大塊鏈非常類似,唯一不同的是,小塊鏈裡面對小塊的定址不是在整個複合檔案範圍內的,而是在某一個特定的大塊鏈範圍內的,這個大塊鏈的開始塊序號在後面敘述。
目錄鏈,目錄鏈是複合檔案最基本的資料鏈,描述了複合檔案的目錄結構資訊。目錄鏈的開始在頭塊中可以找到。目錄鏈中包括了複合檔案的目錄資訊,每一個目錄項的大小是128位元組,所以目錄鏈的一個塊可以包括4個目錄項,第一個目錄項是根目錄項,名字叫做“根實體”(Root Entry),任何複合檔案裡面這都是第一個目錄項。一個典型的根目錄項如下:
00400: 52 00 6f 00 6f 00 74 00 20 00 45 00 6e 00 74 00 R o o t E n t
00410: 72 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00 r y
00420: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00430: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00440: 16 00 05 00 ff ff ff ff ff ff ff ff 03 00 00 00
00450: 00 09 02 00 00 00 00 00 c0 00 00 00 00 00 00 46
00460: 00 00 00 00 00 00 00 00 00 00 00 00 86 29 f6 1f
00470: ad 57 bb 01 03 00 00 00 00 0f 00 00 00 00 00 00
目錄項結構的說明如下:

位移量(十六進位) 大小(位元組) 內容
0 40 目錄項的名字(所以複合檔案中名字最長不能超過40位元組)
40 2 名字的長度
42 2 目錄項的類型1是一個儲存(檔案),2是目錄,3是根
44 4 前一個目錄項
48 4 下一個目錄項
4C 4 如果是目錄,指向子目錄項
74 4 所儲存內容的開始塊
78 4 所儲存內容的大小

由於上面的資料結構不是來源於微軟的官方文檔,包括了很多猜測的成分,所以很多內容暫時無法斷定其意義,有些結構的說明可能和微軟的原意也不相符合,但是我們使用這個結構對微軟的大量文檔進行了分析,至今尚未發現有明顯的錯誤存在。
在基本的“勞拉”檔案結構的基礎上,文書處理文檔、電子資料工作表文檔具有不同的內部目錄結構,下面是一個典型WORD檔案的內部目錄結構:
1.doc
——1Table:一些資料表
——CompObj:通用的對象
——ObjectPool:對象池,是一個目錄,包括WORD檔案中嵌入的映像、聲音或者其他對象
——WordDocument:實際的文字和格式化資訊就存放在這裡
——SummaryInforamtion:摘要資訊
——DocumentSummaryInformation:其他的摘要資訊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.