王 赟
(山西職業(yè)技術(shù)學(xué)院,山西 太原 030006)
復(fù)合文檔結(jié)構(gòu)分析及文件頭重建
王 赟
(山西職業(yè)技術(shù)學(xué)院,山西 太原 030006)
復(fù)合文檔的數(shù)據(jù)恢復(fù)已成為現(xiàn)在數(shù)據(jù)恢復(fù)領(lǐng)域中一項(xiàng)重要內(nèi)容,尤其以文件頭故障最為普遍。本文通過(guò)研究復(fù)合文檔的二進(jìn)制結(jié)構(gòu),解決由于文件頭被破壞導(dǎo)致的文檔無(wú)法正常打開(kāi)、無(wú)法使用等數(shù)據(jù)丟失問(wèn)題,該方法在實(shí)際解決此類問(wèn)題中效果良好,具有普遍應(yīng)用價(jià)值。
復(fù)合文檔;文件頭;數(shù)據(jù)恢復(fù)
復(fù)合文檔是一種多元化的文檔,不僅包含傳統(tǒng)意義上的文本,還可包括聲音、圖片、表格、影音資料及其他內(nèi)容[1]。它的廣泛應(yīng)用極大地滿足了人們現(xiàn)代化辦公的需求。同時(shí)復(fù)合文檔故障及數(shù)據(jù)恢復(fù)成為普遍現(xiàn)象,也已逐漸成為數(shù)據(jù)恢復(fù)領(lǐng)域的一項(xiàng)重要內(nèi)容。復(fù)合文檔故障中多數(shù)以文件頭故障最為主。解決復(fù)合文檔此類故障對(duì)復(fù)合文檔的數(shù)據(jù)恢復(fù)有著重要意義。
復(fù)合文檔的原理其實(shí)并不復(fù)雜,它與傳統(tǒng)的FAT 32文件存儲(chǔ)系統(tǒng)相似[2]。首先,它將數(shù)據(jù)信息劃分為許多小子集,即流(Streams)。而系統(tǒng)中的倉(cāng)庫(kù)(Storages)就是儲(chǔ)存這些數(shù)據(jù)流的場(chǎng)所。在命名規(guī)則上,文件系統(tǒng)的命名規(guī)則與上述的流或倉(cāng)庫(kù)類似,如果流的名字相同,那么只能存儲(chǔ)在不同的倉(cāng)庫(kù)下。對(duì)于每一個(gè)復(fù)合文檔,都會(huì)有一個(gè)存儲(chǔ)的根倉(cāng)庫(kù)(root storage)[1]。
1.2.1 扇區(qū)與扇區(qū)標(biāo)識(shí)
如果將所有的數(shù)據(jù)信息子集(流)進(jìn)一步劃分,可劃分為更小的子集,這些小的數(shù)據(jù)塊叫做數(shù)據(jù)的扇區(qū)(sectors)[3]。在這些數(shù)據(jù)扇區(qū)中可能涵蓋用戶的數(shù)據(jù)和控制數(shù)據(jù)信息。
1.2.2 扇區(qū)鏈與扇區(qū)標(biāo)識(shí)鏈
1.3.1 復(fù)合文檔頭的內(nèi)容
復(fù)合文檔頭的大小是512字節(jié),一般在文檔頭的位置。該結(jié)構(gòu)如圖1所示。
圖1 復(fù)合文檔頭結(jié)構(gòu)
1.3.2 字節(jié)順序(Byte Order)
文件數(shù)據(jù)的存儲(chǔ)方式一般為二進(jìn)制存儲(chǔ),目前主流方法主要有兩種,即Little-Endian和Big-Endian[5]。實(shí)際應(yīng)用過(guò)程中一般僅采用前者:即依據(jù)地址的高低位分別存放文件的低位8字節(jié)和高位8字節(jié)。
1.3.3 扇區(qū)偏移量
根據(jù)復(fù)合文檔頭的信息可計(jì)算扇區(qū)偏移量(sector offset)[3],計(jì)算方法為sec_pos(SID)=512+SID·s_size=512+ SID·2 ssz。
扇區(qū)配置中最主要的內(nèi)容是主扇區(qū)配置表(MSAT:master sector allocation table)[3]。主扇區(qū)配置表其實(shí)就是記錄所有用于存放扇區(qū)的信息列表,其本質(zhì)上是一個(gè)SID數(shù)組。一般會(huì)在復(fù)合文檔頭指明MSAT的大小,又叫SID個(gè)數(shù),數(shù)值是等于存放扇區(qū)配置表的扇區(qū)數(shù)。扇區(qū)配置表(SAT:sector allocation table)主要內(nèi)容包括內(nèi)部控制流以及用戶流,特別需要注意的是,這個(gè)用戶流不包括短流,本質(zhì)上SAT也是一個(gè)SID數(shù)組。一般SAT的大小與文檔中扇區(qū)的個(gè)數(shù)所一致。
1.5.1 短流存放流
?Katharina Boele - Woelki,Bente Braat and Ian Curry - Sumner(ed.),European Family Law in Action:Parental Responsibilities,Intersentia Publishers,2005,p.351.
當(dāng)一個(gè)流的大小小于指定的值,常被叫做短流[1]。其實(shí)直接使用扇區(qū)存放數(shù)據(jù)的并不是短流,而是借由一種特殊的形式,即通過(guò)短流存放流(short-stream container stream)來(lái)存放數(shù)據(jù)[6]。該形式的存放流象與一般的用戶流類似:首先使用第一個(gè)扇區(qū),該扇區(qū)隸屬于目錄中的根倉(cāng)庫(kù)入口(root storage entry)。接下來(lái)該數(shù)據(jù)流將占用的扇區(qū)分成不同的短扇區(qū),進(jìn)一步存儲(chǔ)短流。短流存放流的SID鏈一般從扇區(qū)配置表中獲取。計(jì)算公式為:short_s_pos(SID) = SID·short_s_size = SID·2 sssz[1]。
1.5.2 短扇區(qū)配置表
類似于主扇區(qū)配置表,所有短流的SID鏈構(gòu)成了一個(gè)SID數(shù)組,這個(gè)數(shù)組就是短扇區(qū)配置表(SSAT:short-sector allocation table)[5]。一般用于存放短扇區(qū)配置表的第一個(gè)扇區(qū)的SID在復(fù)合文件頭中指定,剩下的SID鏈均來(lái)源于SAT。
短扇區(qū)配置表的用法與扇區(qū)配置表是類似的,主要區(qū)別在于前者的SID鏈?zhǔn)褂玫氖嵌躺葏^(qū)(short-sector)[3]。
目錄(directory)的構(gòu)成部分是所有的目錄入口(directory entry),本質(zhì)上是一種內(nèi)部控制流。復(fù)合文檔的數(shù)據(jù)流和存儲(chǔ)的storage關(guān)聯(lián)著這些目錄入口。
復(fù)合文檔的文件頭就好比文件系統(tǒng)的DBR。DBR損壞分區(qū)無(wú)法打開(kāi),但真實(shí)數(shù)據(jù)還仍然存在,復(fù)合文檔也是這樣。簡(jiǎn)單的復(fù)合文檔結(jié)構(gòu)只有少量的SID鏈,并且連續(xù),修復(fù)難度也較低。復(fù)雜點(diǎn)的可能會(huì)有多個(gè)不連續(xù)的SID鏈,或者多個(gè)MSAT表,只要我們找到它的規(guī)律,順著它的SID鏈推斷下去就可以重建它的索引。下面我們以案例.doc文檔為例來(lái)簡(jiǎn)述復(fù)合文檔頭重建過(guò)程。首先我們來(lái)解析案例文檔的文件頭(如圖2)。用winhex打開(kāi)后將頁(yè)轉(zhuǎn)換成扇區(qū)進(jìn)行分析,發(fā)現(xiàn)復(fù)合文檔的0號(hào)扇區(qū)就是第一個(gè)MSAT表,它除了記錄SAT項(xiàng)還記錄了SSAT的大小開(kāi)始、目錄區(qū)域的開(kāi)始以及指向下一個(gè)MSAT的索引。而之后的MSAT就只負(fù)責(zé)記錄SAT項(xiàng)了。
圖2 案例.DOC文件頭
其中文件頭的前兩行半是微軟設(shè)置的固定值。具體偏移量的含義見(jiàn)表1。
表1 復(fù)合文檔頭偏移位置解析
我們把這個(gè)文檔的文件頭清空,復(fù)制一個(gè)新文件頭過(guò)來(lái)然后手動(dòng)填寫(xiě)文件頭,主要涉及修改與計(jì)算幾個(gè)關(guān)鍵值的有:
1)SAT配置表的個(gè)數(shù);2)目錄的開(kāi)始位置;3)SSAT的開(kāi)始和大?。?)MSAT的開(kāi)始和大??;5)依次寫(xiě)SID的占用情況。
首先寫(xiě)目錄的開(kāi)始位置,向下搜索(ROOT)52 00 6F 00,偏移位置512=0。
如圖3所示,在47扇區(qū)找到了目錄的位置。
圖3 目錄區(qū)
接著找短流(SSAT),短流可以從根目錄中直接找到,如圖3中的31 00 00 00,就是短流的開(kāi)始了。大小就是后面的80 00 00 00,等于128/64=2,只有兩項(xiàng)就是占用一個(gè)扇區(qū)。大小就是01了。然后我們?cè)僬覙?biāo)準(zhǔn)流(SAT)搜索01 00 00 00,偏移位置512=0,向下搜索,在46扇區(qū)找到了標(biāo)準(zhǔn)扇區(qū)配置表。如圖4所示。看到這個(gè)扇區(qū)中有一個(gè)FD FF FF FF,可以確定這就是SAT了。在復(fù)合文檔中,-1,-2,-3,-4都有特定的含義。 如表2。
表2 特定值的含義
圖4 SAT配置表
最后一項(xiàng)SAT配置表中會(huì)有FD FF FF FF的值,表示這是一個(gè)SAT配置表的結(jié)束。并且有幾個(gè)FD FF FF FF就代表有幾個(gè)SAT配置表。在最后一個(gè)FD FF FF FF的后面就是根目錄的位置(此處根目錄就是2F 00 00 00)。本案例中只有一個(gè)FD FF FF FF,那就是只有一項(xiàng)SAT配置表。0號(hào)扇區(qū)可以存放109個(gè)SAT配置表(也就是SID),現(xiàn)在只有一個(gè)足夠存放,就不需要再分配MSAT了,所以MSAT的開(kāi)始FE FF FF FF,大小00 00 00 00。
關(guān)鍵值都計(jì)算出來(lái)后總結(jié)一下算好的值,我們就可以手動(dòng)填寫(xiě)文件頭信息。
1)SAT配置表的個(gè)數(shù)(1);2)目錄的開(kāi)始位置(47-1=46);3)SSAT的開(kāi)始(49-1=48)和大小(1);4)MSAT的開(kāi)始(MSAT主扇區(qū)配置表只有一個(gè)寫(xiě)FEFFFFFF)和大小(0);5)依次寫(xiě)SID的占用情況(SAT配置表只有一個(gè),在46扇區(qū)填寫(xiě)46-1=45),修復(fù)后文件頭如圖5所示,保存文件,修復(fù)完成。
圖5 修復(fù)后文件頭
本文通過(guò)分析復(fù)合文檔的二進(jìn)制結(jié)構(gòu),提出了手動(dòng)計(jì)算與修復(fù)文件頭的方法,此方法對(duì)解決由文件頭被破壞導(dǎo)致的文檔無(wú)法正常打開(kāi)、無(wú)法使用等問(wèn)題有效果良好,具有普遍應(yīng)用價(jià)值。
[1] 沙晶,錢偉.微軟復(fù)合文檔結(jié)構(gòu)分析及文件恢復(fù)[J].中國(guó)司法鑒定,2011(6):59-61.
[2] 楊德明.FAT32下有效數(shù)據(jù)快速恢復(fù)方法[J].計(jì)算機(jī)應(yīng)用,2012,32(9):2500-2503.
[3] RENTZ DANIEL. Microsoft Compound Document File Format[M].2004.
[4] 王維雄.基于介質(zhì)存儲(chǔ)結(jié)構(gòu)的數(shù)據(jù)恢復(fù)技術(shù)研究[D].西安:西安電子科技大學(xué),2010.
[5] 劉偉.數(shù)據(jù)恢復(fù)技術(shù)深度揭秘[M].北京:電子工業(yè)出版社,2010.
[6] 趙振洲,趙永峰.Word文檔結(jié)構(gòu)分析及恢復(fù)[J].安徽電子信息職業(yè)技術(shù)學(xué)院學(xué)報(bào),2013(2):1-3.
CompositeDocumentStructureAnalysisandFileHeadReconstruction
Wang Yun
(ShanxiPolytechnicCollege,TaiyuanShanxi030006,China)
Data recovery of complex documents has become an important content in the field of data recovery, especially the file head fault is the most common. This paper, through the binary structures of composite document, solves the problem of data loss, such as the document cannot be opened normally and the data cannot be used because of the destruction of the file head. The method to solve the problem in the actual effect is good and has the widespread application value.
compound document;file header;data recovery
2017-10-25
王 赟(1982- ),男,山西太原人,講師,碩士,主要研究方向:計(jì)算機(jī)應(yīng)用、數(shù)據(jù)安全及數(shù)據(jù)恢復(fù)。
1674- 4578(2017)06- 0041- 03
TP309.3
A