郭小光
(江蘇省宿遷經貿高等職業技術學校 江蘇省宿遷市 223600)
ExFAT 文件系統是微軟公司為閃存設計的文件系統,廣泛應用于相機存儲卡、U 盤等存儲介質。現在ExFAT 文件系統也已經廣泛的被各種操作系統所支持,ExFAT 文件系統既提高了安全性,也提升了功能性。
ExFAT 文件系統結構圖如圖1 所示。
(1)DBR 及其保留扇區。DBR 的全稱為DOS Boot Record,含義是DOS 引導記錄,目前泛指操作系統引導記錄。DBR 一般都是位于是0 號扇區,即分區的第一個扇區。在DBR 之后往往有一些保留扇區,其中12 號扇區為DBR 的備份。
(2)ExFAT 文件系統中的FAT 表主要作用是記錄碎片文件的存儲情況。
(3)簇位圖文件是 ExFAT 文件系統中的一個元文件,用來管理分區中簇的使用情況。
(4)大寫字符文件。是 ExFAT 文件系統中的第二個元文件,類似于 NTFS 文件系統中的元文件$UpCase,Unicode 字母表中每一個字符在這個文件中都有一個對應的條目,用于比較、排序、計算Hash 值等方面。
(5)用戶數據區存儲著文件的目錄信息和文件的數據。
ExFAT 文件系統的DBR 由6 部分組成,分別為跳轉指令、OEM 代號、保留區、BPB 參數、引導程序和結束標志[1]。在這6 部分中,BPB 參數對于數據恢復研究最為重要,所謂的BPB 是BIOS Parameter Block 的簡稱,BPB 中存儲著管理文件系統用到的重要參數。
DBR 之后到FAT 表之前的所有扇區稱之為DBR 保留扇區,在保留扇區中有校驗扇區、DBR 的備份扇區、校驗扇區的備份等重要信息。
DBR 遭到破壞是數據恢復中常見的故障,在DBR 和備份DBR都遭到破壞的情況下,NTFS 和FAT32 文件系統可以通過復制一個其他分區的DBR,然后通過手工計算出關鍵BPB 參數的方法來重建DBR,進而恢復整個分區。但是在ExFAT 文件系統中,即使DBR 所有的BPB 參數都計算正確,在Windows 系統中依然是無法正常打開的。這是因為微軟在ExFAT 文件系統中設置了校驗扇區,Windows 系統在每次加載磁盤時會計算校驗值,然后將計算出的校驗值與校驗扇區中存儲的值進行比對,如果兩者不一致操作系統就會認為分區遭到了破壞,并且提示格式化磁盤。校驗扇區的存在,在提高了安全性的同時也增加了數據恢復的難度。
ExFAT 文件系統的校驗扇區位于DBR 后的第11 個扇區,在校驗扇區中存儲的校驗值長度是32bit,即4 個字節。校驗值是重復填充在校驗扇區中的,因為一個扇區是512 字節,所以一個校驗扇區中一共存儲了128 個校驗值。校驗值是將DBR 所在扇區到校驗扇區之前的11 個扇區中的每個字節的數值,都依次進行運算得出的結果。DBR 中的64H~68H 處的參數是卷序列號,卷序列號是在分區高級格式化時生成的4 個字節的隨機數值,這個隨機數的生成與當前時間和磁盤ID 有關,這就保證了所有分區的卷序列號都不會相同。由于卷序列號同樣參與了校驗運算,所以只要DBR 被破壞后,即使其他BPB 參數能夠能夠完全恢復,校驗值都是不一樣的。所以要想恢復ExFAT 的DBR,必須要重新計算校驗值。
校驗值的運算方法是每讀取一個字節后,分別將上一次校驗值左移31 位和右移1 位,然后將左移31 位得到值與右移1 位得到的值進行按位或操作,最后再將或操作的值加上當前字節位置讀取出的數值[2]。校驗值的具體計算流程如圖2 所示。
本文使用WinHex 腳本計算ExFAT 校驗扇區可以省去上述的操作過程,用戶只需要根據提示,輸入需要恢復的盤符就可以實現自動計算校驗和,并且自動將校驗和填充到檢驗扇區中,從而實現自動恢復檢驗扇區。

圖1:ExFAT 文件系統結構圖

圖2:校驗和計算流程
WinHex 是由 X-Ways 公司開發的一款運行在微軟windows 操作系統下的十六進制數值編輯軟件,它的功能十分強大的主要應用于計算機取證、數據恢復、底層數據處理、IT 安全等領域。
WinHex 腳本是運行在WinHex 軟件上的腳本語言,它將WinHex 操作步驟指令化和批處理化,從而提高處理效率[3]。WinHex 腳本語言具有部分高級編程語言的特征,不僅有算術運算和邏輯運算符,也擁有條件判斷、循環等語句,還有輸入輸出交互語句。WinHex 腳本中的變量是弱類型的變量,變量不需要申明可以直接使用,但是變量名區分大小寫。在腳本文件還可以使用雙斜杠為代碼添加注釋。
如果要使用WinHex 腳本需要在WinHex 的啟動中心中的腳本區域中新建一個腳本,然后雙擊腳本名稱或者是按回車鍵執行。WinHex 的啟動中心可以通過工具菜單打開,也可以將光標放在數據區域任意位置,然后敲回車鍵打開。WinHex 腳本文件的擴展名是whs,可以使用任何文本編輯工具進行編輯,它的默認打開方式是記事本。腳本執行影響的默認對象是當前活動窗口的磁盤或者文件。下面對本次恢復ExFAT 檢驗扇區用的指令進行介紹:
(1)Open。用于打開文件或者盤符,當打開一個分區或者是文件后,光標的默認位置是在第一個字節處,也就是0 字節處。
(2)Save。保存文件或者磁盤,修改數據后必須使用Save 指令才能夠保存。
(3)Move。Move 指令用于移動光標后,Move 指令后的數值代表光標移動的距離,這個數值可以是正數也可以是負數,如果是正數就是相對當前光標所在的位置向后移動,如果是負數就是相對光標所在的位置向前移動。
(4)Read 變量名n。從光標當前位置讀取n 個字節的數據到變量中。
(5)Assign。為變量賦值,可以使數值,也可以是表達式。
(6)Ifequal x y。比較兩個數值或者變量是否相同,如果相同則執行if 語句塊中的指令,反之則不執行。以If 開頭的指令必須要有endif 指令做為if 語句塊的結束。
(7){…}[n]。一對大括號表示循環體,大括號中的語句可以循環執行,循環執行的次數由中括號中的數值或者變量控制。需要注意的是WinHex 腳本目前不支持循環體的嵌套。
從上式可以看出,當光程l、吸收系數k(λ)確定,通過檢測出I0和I,即可得到氣室內CO2氣體的濃度C,且C與出射光強I之間呈現一一對應的單調關系。
(8)Getuserinput x " Caution"。輸入對話框,用戶可通過輸入框輸入 ASCII 或十六進制數值到變量xx 中,Caution 為輸入框對話框的提示。
(9)CurrentPos。獲取光標的當前位置。
在G 盤的檢驗扇區損壞以后,操作系統就會提示格式化。
WinHex 腳本代碼實現主要步驟如下:
(1)獲取用戶輸入的盤符,并打開相應的分區:
Getuserinput pt "輸入盤符"
Open pt
由于DBR 中的106 字節、107 字節和112 字節不參與校驗,所以這里需要對當前的字節偏移量進行判斷,代碼如下所示:
Assign posCheck ((pos^106)*(pos^107)*((pos^112)))
只要當前位置是106 字節、107 字節或者112 字節,posCheck的值都是0,然后使用ifequal 判斷posCheck 的值是否是0,如果是0 光標就直接向后移動一個字節,如果不是0 就進行校驗運算,代碼如下所示:
ifequal posCheck 0
move 1
else
[校驗運算代碼]
endif
(3)校驗運算:
根據校驗流程,校驗運算首先需要將上一次運算的到校驗值進行移位運算,而WinHex 腳本并沒有移位運算符,筆者這里使用乘法和除法來實現左移和右移運算。左移一位就是乘2,右移一位就是除2。左移31 位就是乘以231也就是乘以2147483648。
需要注意的是,校驗值的長度是四個字節,而乘以231后數據長度很有可能會超過四個字節,所以乘完以后只需要保留運算結果的低四位字節即可,筆者這里使用“&”與運算來實現。將計算的結果與0x00000000FFFFFFFF 進行按位與運算,由于0 與任何數運算都是0,1 與任何數運算,數值保持不變,這樣就實現了保留低四位字節,屏蔽掉了高四位字節。
計算完成以后再與之前的結果相加,這里同樣只需要保留只保留低四位字節的數值。
(4)將校驗值填充滿整個校驗扇區并且保存,代碼如下所示:
{
write checksum
}[128]
Save
在沒有盤符的情況下可以使用goto 語句直接將光標定位到DBR 的開始位置,然后讀取數據進行運算。校驗運算完成以后,再重新加載磁盤后G 盤就可以正常打開了,如圖3 所示。

圖3:恢復后的分區
WinHex 是數據恢復領域使用最廣泛的軟件之一,使用WinHex腳本恢復exfat 的校驗扇區,可以在不需要其他工具輔助的情況下,快速方便的修復受損的校驗扇區,提高數據恢復的效率。