office檔案格式複合文件二進位制結構解析
Office文件是目前應用最廣泛的文件格式,但很多人都沒有為office檔案建立完善的安全防護措施,也沒有養成進行檔案備份的良好習慣,所以一旦出現操作失誤、病毒破壞、系統故障等情況,就有可能造成當前正在編輯的word、excel文件和access資料庫等受到損壞,下次無法開啟。那麼一旦遇到這類文件被破壞或者丟失我們是否就束手無策了呢,當然不是,我們可以藉助專業知識和小工具進行受損文件修復。
未公開的office文件儲存格式秘密
Office文件格式一直以來都是微軟公司的技術機密,至今未曾向外界公佈。那麼我們現在要做的是修復受損的文件,如果真的對office檔案資料結構一無所知的話那麼最終也只能止步於“傻瓜式”的文件修復工具水平。想要提高自己的文件修復水平,在最大程度上挽救丟失的資料,那就必須對office文件二進位制格式有所瞭解,下面我們以word文件為例子,給大家介紹word檔案內部結構和office文件格式的部分秘密。為什麼說是部分呢,因為全部的office文件格式可能只有微軟自己才知道了。
Laola的檔案格式
Laola檔案格式是微軟複合文件結構的二進位制格式。按照微軟的命名來說,這種文件結構應該叫做“複合文件二進位制結構(Compound File Binary Format)”。但微軟官方並沒有公開關於這種文件結構的相關內容,大量駭客透過對word、Excel檔案的逆向分析以及辦公軟體的跟蹤,基本上破解了“複合文件二進位制結構”的組成和演算法。但這些並不是微軟的官方文件,有存在差異的可能性,並且微軟有權隨時改變這一演算法結構,因此人們有必要使用另外的名稱“laola”來描述這一結構。
複合文件的起源
國內最早分析“複合文件二進位制結構”的是反宏病毒技術人員,但國際上在宏病毒沒出現前針對微軟複合文件二進位制結構的分析就已經開始了。進行這種分析的根本目的是為了在其他作業系統下(這裡主要指的是linux和其他開源作業系統下)能夠開發出可讀寫微軟辦公軟體使用的文件。
“複合文件”是微軟引入的一種在檔案內部存放結構化資訊的方法。例如:我們寫一篇文章,如果這篇文章沒有任何格式資訊和嵌入影像,那麼使用沒有任何結構的文字格式就可以了,但是一篇完善的文章裡可能包含段落、格式、字型、顏色、插圖等,這樣簡單的無格式文字就無法滿足需要了。所以需要在檔案的內部存放很多結構,包括段落的文字、字型、甚至段落本身資訊等。針對這種需求、以及電子資料表、演示製作等軟體的需要,微軟開發了一種“檔案中的檔案系統”,也就是“複合文件”結構。
複合文件結構介紹
在複合文件中,可以有很多目錄,在每個目錄下可以有子目錄,目錄和子目錄包含了“儲存”,一個儲存相當於磁碟上的一個檔案,整個複合文件就形成了一個類似於磁碟上的目錄和檔案所組成的樹狀結構。如果在視窗環境下使用複合路徑,可以利用作業系統提供的功能對複合檔案進行讀寫。
與硬碟劃分扇區的方法類似,所有使用laola檔案格式的檔案由512 B的資料塊組成(有興趣的可以驗證一下,所有的word、excel或其他office檔案大小都是512B的倍數),資料塊的序號從-1開始,如下圖所示。
序號為-1的塊是整個檔案的檔案頭塊,存放了複合檔案的一些整體資訊,結構見下圖:
在512 B的資料塊基礎上,複合檔案中包括了兩種最基本的結構:
第一種是由512 B的大塊連線起來的大塊鏈。如果對以檔案分配表“FAT”為基礎的檔案系統熟悉的話,可以很容易的理解大塊鏈的概念,只要知道一個大塊鏈的開始塊序號,透過大塊映像圖就可以找到這一條大塊鏈的所有內容。一個典型的大塊映像圖如下圖所示:
從圖中可以看到,如果一個大塊鏈的開始序號是0的話(該處的內容是5),那麼這個大塊鏈包括:序號為0的資料塊、序號為5的資料塊(該處的內容是7)、序號為7的資料塊(該處的內容是9)、序號為9的資料塊(該處的內容是0b)、序號為0b的資料塊(該處的內容是-1,表示這是該鏈的最後一個資料塊)。
對於比較小的結構,如果以512 B為單位的話會造成比較大的空間浪費,所以專門使用一個大塊鏈來存放比較小的資料塊,小於4096 B的資料結構使用小塊鏈來表示,小塊鏈的組成和定址方式和大塊鏈非常類似,唯一不同的是小塊鏈裡面對小塊的定址不是在整個複合檔案範圍內的,而是在某一個特定的大塊鏈範圍內,這個大塊鏈的開始塊序號會在以後的更新中敘述。
目錄鏈:是複合檔案最基本的資料鏈,描述了複合檔案的目錄結構資訊。目錄鏈的開始在頭塊中可以找到。目錄鏈中包括了複合檔案的目錄資訊,每一個目錄項的大小是128 B,所以 目錄鏈的一個塊可以包括4個目錄項,第一個目錄項是根目錄項,名字叫“根入口(Root Entry)”,任何複合檔案裡這都是第一個目錄項。一個典型的根目錄項如下圖所示:
下面是目錄項的結構說明:
由於上面的資料結構並不是來源於微軟的官方文件,其中包含了很多猜測的成分,所以很多內容暫時無法判斷其意義,有些結構說明可能與微軟原意不同,不過我們利用這個結構對微軟的大量文件進行分析,至今尚未發現有明顯錯誤。
在基本的laola檔案結構基礎上,字處理文件、電子資料表文件具有不同的內部目錄結構,下面介紹一個典型word檔案內部目錄結構
a.doc
—1 Table:一些資料表
—CompObj:通用的物件
—ObjectPool:物件池,是一個目錄,包括word文件中嵌入的影像、聲音或者其他物件
—WordDocument:實際的文字和格式化資訊就存放在這裡
—SummaryInformation:摘要資訊
—DocumentSummaryInformation:其他的摘要資訊
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31380569/viewspace-2668822/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java二進位制Class檔案格式解析Java
- 二進位制檔案複製
- UE複製貼上二進位制檔案
- 解析MYSQL BINLOG二進位制格式(9)--infobin解析binlog幫助文件MySql
- php寫二進位制檔案PHP
- 二進位制檔案拷貝
- iOS系統分析(二)Mach-O二進位制檔案解析iOSMac
- 二進位制檔案視覺化(二)視覺化
- INODE結構二進位制頁分析
- Vue element ui結合java後臺匯出Excel(二進位制檔案流)VueUIJavaExcel
- 檔案操作(二進位制拷貝)
- Git處理二進位制檔案Git
- MySQL二進位制檔案(binlog)MySql
- Ropper-顯示有關不同檔案格式的二進位制檔案的資訊
- 解析MYSQL BINLOG二進位制格式(10)--問題解答MySql
- 解析MYSQL BINLOG 二進位制格式(1)--準備工作MySql
- 解析MYSQL BINLOG 二進位制格式(3)--QUERY_EVENTMySql
- C語言實現檔案複製功能(包括文字檔案和二進位制檔案)C語言
- 文字檔案與二進位制檔案的區別
- Python讀寫二進位制檔案Python
- c++ 二進位制儲存檔案C++
- C#的二進位制檔案操作C#
- 使用UltraEdit 拷貝二進位制檔案
- 解析MYSQL BINLOG 二進位制格式(4)--TABLE_MAP_EVENTMySql
- 解析MYSQL BINLOG 二進位制格式(5)--WRITE_ROW_EVENTMySql
- 解析MYSQL BINLOG 二進位制格式(2)--FORMAT_DESCRIPTION_EVENTMySqlORM
- 複雜二進位制資料
- 通過OpenSSL來生成二進位制格式證書檔案(pfx和cer)
- 二進位制翻轉、結構體指標結構體指標
- MySQL 匯出匯入二進位制檔案MySql
- UltraEdit--二進位制檔案編輯功能
- 用shell處理二進位制檔案(轉)
- 介面返回二進位制檔案的下載。
- 二進位制檔案記憶體對映記憶體
- 二進位制小總結
- go 自定義二進位制檔案讀寫-儲存倒排索引文件 idGo索引
- 二進位制求5個1的格式。。。。
- mysql二進位制日誌格式介紹MySql