手工重建複合文檔(.doc;xls,ppt)文件頭,修復文件全過程
(2010-11-02 10:51:25)最近學習了複合文檔的格式,在修復複合文檔頭方面做了不少實踐,有了一些心得,經過梳理,做了個例子,把思路和過程介紹給大家,希望能解決你的不時之需!
例子中用的文件如下圖:名爲“實驗文檔”,是個空文檔,裏面沒有內容,看屬性,10,752字節,剛好21扇區,複合文檔的文件大小一定是512字節的整數倍,這跟複合文檔的設計有關係。EXCEL,PPT等文件也屬於複合文檔,也符合這樣的特點。
後來我又想,可能有網友會對修復後的文件產生懷疑,沒有內容的文件可能說明不了問題,所以我在文件中輸入了很短的文本內容!如下圖:
實驗文檔是一個正常的文件,另外我用Winhex把該文件的文件頭(前面512字節)全部寫成了0,最徹底的破壞,保存爲“損壞的實驗文檔”,大家可以用現有的修復軟件試一下,能不能修復,我用EasyRecovery Professional沒有修復成功!其它的軟件沒有試過!
下面,就請大家跟我一起看,如何把“損壞的實驗文檔”修復成功!
先介紹用到的工具軟件Winhex,功能很強大,可以用二進制的方式打開文件,並進行編輯,保存!該軟件不僅可以打開文件,還可以打開硬盤,對硬盤數據進行編輯,搜索功能什分強大,用起來非常方便,同時支持腳本,提供API函數。軟件界面如下圖:
用該軟件打開“實驗文檔”和“損壞的實驗文檔”,可以對比一下前512字節,爲了便於操作,我們需要將文件解釋爲硬盤,讓軟件以扇區的方式顯示文件內容,看起來直觀些!
兩個文件的在軟件裏顯示如下圖:
可見,“損壞的實驗文檔”前面的512字節全是0,文件頭被全部破壞,文件無法用office打開!
複合文檔文件頭的定義:
Offset Size Contents
0 8 複合文檔文件標識:D0H CFH 11H E0H A1H B1H 1AH E1H
8 16 此文件的唯一標識(不重要, 可全部爲0)
24 2 文件格式修訂號 (一般爲003EH)
26 2 文件格式版本號(一般爲0003H)
28 2 字節順序規則標識(見3.2)::FEH FFH = Little-Endian
FFH FEH = Big-Endian
30 2 複合文檔中sector的大小(ssz),以2的冪形式存儲, sector實際大小
爲s_size = 2ssz 字節(一般爲9即512字節, 最小值爲7即128字節)
32 2 short-sector的大小(見5.1),以2的冪形式存儲, short-sector實際大
小爲s_s_size = 2sssz 字節(一般爲6即64字節,最大爲sector的大小)
34 10 Not used
44 4 用於存放扇區配置表(SAT)的sector總數
48 4 用於存放目錄流的第一個sector的SID (見6)
52 4 Not used
56 4 標準流的最小大小(一般爲4096 bytes), 小於此值的流即爲短流。
60 4 用於存放短扇區配置表(SSAT)的第一個sector的SID (見5.2),
或爲–2 (End Of Chain SID)如不存在。
64 4 用於存放短扇區配置表(SSAT)的sector總數
68 4 用於存放主扇區配置表(MSAT)的第一個sector的SID (見4.1),
或爲–2 (End Of Chain SID) 若無附加的sectors。
72 4 用於存放主扇區配置表(MSAT)的sector總數
76 436 存放主扇區配置表(MSAT)的第一部分,包含109個SID。
看起來有些複雜!
修復文件頭的數據只需要計算並填寫幾項,一是扇區分配表(SAT)所佔的扇區數,
二是目錄起始扇區號,三是短流扇區分配表的起始扇區號及佔用扇區數,四是主扇區分配表的起始扇區號及中用扇區數,五是扇區分配表的扇區號,其它內容所有的複合文檔都是一樣的,從正常文件中拷過來就行。
以上所說五項內容需要計算,現在介紹方法
一:確定目錄起始扇區號
打開“損壞的實驗文檔”,將文件解釋爲硬盤,搜索字符串“ROOT”(unicode)如圖:
搜索到結果,軟件自動定位到字符串的位置,如圖:
看狀態欄:
該字符串位置是43扇區,第一個值確定了,目錄起始扇區是43,第一項完成。由於複合文檔在扇區編號時不包括文件頭,0扇區從512字節處開始,所以目錄起始扇區應該是42,下面就不再進行說明。
二:確定扇區分配表(SAT)
我們需要通過扇區的內容來確定某個扇區是不是扇區分配表(SAT)
該文件總共有47個扇區,文件頭佔一個扇區,剩下46扇區,所以,扇區分配表中的值應該大於0小於等於46,另外還有一些特殊的值,值FEFFFFFF表示扇區鏈結束,值FDFFFFFF表示該扇區被SAT佔用,值FFFFFFFF表示該扇區爲空閒。
看文件的1扇區:
數據如下:
該扇區是不是扇區分配表(SAT)呢?
分析裏面的數據(4個字節一個項,因爲扇區編號是用4個字節來存放的),第一項是ECA5C100,低位在前高位在後,換過來就是00C1A5EC,換成十進制爲12690924,文件最大爲46扇區,因此該扇區不可能是扇區分配表(SAT)。
看第2扇區,
第三項00007A03不滿足條件,因此不是扇區分配表。
重複該過程,1-41扇區均不符合條件,分析到42扇區,看該扇區數據:
第一項0100000,第二項02000000,第三項03000000,等等,該扇區內的所有項的值要麼小於46,要麼是FEFFFFFF,要麼是FDFFFFFF,要麼是FFFFFFFF,符合扇區分配表的特點!記下該扇區號。
繼續分析剩下的扇區,直到結束!在本例中,文件總共47扇區大小,而每個扇區512字節,4個字節放一個扇區編號,因此,一個扇區分配表可以存放128個扇區編號,所以說該文件只有一個扇區用來存放扇區分配表(SAT)。第二項完成。
第三:確定主扇區分配表(MSAT)的起始扇區號
主扇區分配表(MSAT)中存放的是扇區分配表(SAT)所在的扇區號,本例中,扇區分配表(SAT)只有一個,根據複合文檔的格式定義,文件頭中可以存放109項SAT值,也就是說,只要文件的扇區分配表不大於109個,就不需要主扇區分配表,嚴格的說是不需要額外的主扇區分配表,因爲文件頭就可以容納下了,主扇區分配表(MSAT)是在SAT多於109項時,剩下的值用指定的扇區來記錄!根據定義,無額外主扇區分配表(MSAT)時,主扇區分配表的起始扇區號爲-2,十六進制表示爲FEFFFFFF,它佔用的扇區數爲0,第三項完成
第四:確定短流扇區分配表的起始扇區號及佔用的扇區數
短流扇區分配表(SSAT)是複合文檔中的另一個概念,短流數據用短流扇區來存放,短流數據存放的位置通過短流扇區分配表來確定。一個文件有沒有短流數據可以查看目錄,如圖:
根據複合文檔定義,目錄的第一表項0X74處的4個字節表示的是短流的起始扇區(十六進制2D000000值爲45),0X48處的4個字節爲短流的大小(十六進制800000值爲128)。而短流扇區分配表(SSAT)一般位於短流起始扇區的前一個扇區,所以短流扇區分配表的起始扇區爲45-1=44扇區,它只佔用一個扇區。44扇區的內容如下圖:
第四項完成。
第五:確定文件頭中的扇區分配表編號
本例子只有一個扇區分配表(SAT),因此文件頭中只用填寫一個值。
到此,需要重建文件頭的所有值基本都確定了,下面的工作就是改寫文件頭。
定位到0X2C處,2C-2F爲扇區分配表(SAT)所佔用的扇區數,本例佔用1個扇區,轉換成十六進制爲(01000000,低位在前高位在後),操作完成後如下圖:
定位到0X30處,4字節表示目錄所在的扇區編號,經前面的計算,目錄所在的扇區編號爲42,換成十六進制爲2A000000,把該值寫到此處,操作完成後如下圖:
定位到0X3C處,4字節表示短流扇區分配表(SSAT)的起始扇區號,本例短流扇區爲44,十六進制值爲2C000000,改寫後,如下圖:
定位到0X40,4字節表示短流扇區分配表佔用的扇區數,本例佔用1個扇區,應填寫01000000,操作完成後如下圖:
定位到0X44處,4字節表示MSAT起始扇區編號,本例沒有MSAT,填寫-2,十六進制值爲FEFFFFFF,定位到0X48處,4字節表示MSAT佔用的扇區數,本例爲0,填寫00000000
操作完成後如下圖:
定位到0X4C處,此處後的每4個字節填寫一項SAT扇區編號,本例只有一個SAT,位置爲41,轉換成十六進制爲29000000,剩下的填寫成FFFFFFFF,或者不填寫也行!操作完成後如下圖:
到此,所有艱苦的工作都完成了,但是文件頭的其它數據還沒有建立,不過這些數據都是固定的,比如,文件頭的前8個字節所有複合文檔都是一樣的,不一樣的只有前面所說的那些項,因此,這些數據可以從別的文件中拷過來!填寫完所有數據後,如下圖:
保存對文件的修改:
打開“損壞的實驗文檔”,能夠正常打開,並且內容正確!
Office中的WORD,EXCEL,PPT都是複合文檔,都可以按這個方法操作