SDelete v1.51

作者:Mark Russinovich

發佈日期: 2006 年 11 月 1 日


介紹

Windows NT/2000 (Win2K) 的 C2 規範的其中一項功能是它實作物件重複使用保護。這表示當應用程式配置檔案空間或是虛擬記憶體時,它無法檢視之前儲存在 Windows NT/2K 為其配置的資源中之資料。Windows NT 會將零填滿記憶體,並將磁碟上的磁區歸零,在這裡會在檔案將任一類型的資源展示給應用程式之前先放置檔案。不過,物件重複使用並未指定檔案在刪除和歸零之前所佔據的空間。這是因為 Windows NT/2K 是以作業系統會控制系統資源之存取的假設所設計。不過,當作業系統未啟動時,就可以使用原始磁碟編輯器和復原工具來檢視並復原作業系統已經解除配置的資料。即使當您以 Win2K 的加密檔案系統 (Encrypting File System,EFS) 加密檔案時,檔案的原始未加密檔案資料仍然會在建立檔案的新加密版本後,保留在磁碟上。

確保已刪除的檔案以及使用 EFS 加密的檔案可安全復原的唯一方法,就是使用安全的刪除應用程式。安全的刪除應用程式會覆寫刪除檔案在磁碟上的資料,它所使用的技術是讓磁碟資料顯示成不可復原,即使所使用的復原技術可讀取顯示為已刪除檔案之磁碟媒體中的模式。SDelete (安全的刪除) 就是這樣的應用程式。您可以使用 SDelete 以安全地刪除現有的檔案,以及安全地清除磁碟上未配置部分中所存在的任何檔案資料 (包括您已經刪除或加密的檔案)。SDelete 實作了國防部 (Department of Defense) 的清除和清理標準 DOD 5220.22-M,讓您在使用 SDelete 刪除後,對於檔案資料永遠不見了有信心。請注意,SDelete 會安全地刪除檔案資料,但不會刪除位於可用磁碟空間的檔案名稱。

SDelete 可在 Windows 95、98、NT 4.0 和 Win2K 上執行。

SDelete 使用方式

SDelete 是利用一些選項的命令列公用程式。在任一特定用法中,它允許您刪除一或多個檔案和/或目錄,或是清除邏輯磁碟上的可用空間。SDelete 接受萬用字元做為目錄或是檔案指定字的一部分。

用法:sdelete [-p passes] [-s] [-q] <檔案或目錄>
sdelete [-p passes] -z [drive letter]

-p passes

指定覆寫次數

-s

遞迴子目錄

-q

不要列印錯誤 (安靜模式)

-z

清理可用空間

SDelete 如何運作

安全地刪除沒有特殊屬性的檔案是相當直接的:安全刪除程式會直接以安全刪除模式來覆寫檔案。更巧妙的是,安全地刪除 Windows NT/2K 壓縮、加密和疏鬆檔案,並安全地清理磁碟可用空間。

壓縮、加密和疏鬆檔案是由 NTFS 在 16 叢集區塊中管理。如果程式寫入這樣檔案的現有部分,NTFS 會配置磁碟上的新空間以儲存新資料,並在新資料寫入之後,取消配置檔案之前所佔據的叢集。NTFS 基於資料完整性,在壓縮和疏鬆檔案的案例中,以及新配置大於已經存在的資料 (新壓縮的資料大於舊壓縮的資料) 的考量下,採用此傳統方式。因此,覆寫這樣的檔案將無法成功地從磁碟刪除檔案的內容。

為了處理這些類型的檔案,SDelete 依賴磁碟重組 API。透過使用 磁碟重組 API ,SDelete 可以精確地判斷在磁碟上的哪些叢集,是由屬於壓縮、疏鬆和加密檔案的資料所佔據。一旦 SDelete 知道哪些叢集包含檔案的資料,它可以將磁碟開放成可供原始存取並覆寫那些叢集。

清除可用空間顯示出另一項挑戰。因為 FAT 與 NTFS 並未提供應用程式直接定址可用空間的方式,所以 SDelete 會使用兩種選項之一。就像它為壓縮、疏鬆和加密檔案所做的,第一個選項是它可以將磁碟開放成可供原始存取並覆寫可用空間。這個方法有很大的問題:即使 SDelete 設計成能夠計算 NTFS 和 FAT 磁碟的可用空間部分 (並非不重要的項目),它將會有與在系統上執行的使用中檔案操作發生衝突的風險。例如,假設 SDelete 判斷有一個叢集是可用的,但是就在此時此刻檔案系統驅動程式 (FAT、NTFS) 決定為另一個應用程式正在修改的檔案配置叢集。檔案系統驅動程式會將新資料寫入叢集中,接著 SDelete 覆寫剛寫入的資料:檔案的新資料已經不見。如果為檔案系統的中繼資料配置叢集,這個問題甚至還會更糟榚,因為 SDelete 將會毀壞檔案系統在磁碟上的結構。

第二種 SDelete 採用的方法是間接覆寫可用空間。首先 SDelete 會配置它可以配置的最大檔案。SDelete 是使用非快取檔案 I/O 來這麼做,因此 NT 檔案系統快取的內容將不會被擲出,並且也不會以 SDelete 的空間獨佔檔案關聯的無用資料來取代。因為非快取的檔案 I/O 必須是排列整齊的磁區 (512 位元),所以有可能有一些剩下來的空間並沒有為 SDelete 檔案配置,即使是在 SDelete 無法進一步擴充檔案時也一樣。為了擷取剩餘的空間,SDelete 接下來會配置它可以配置的最大快取檔案。對於這兩種檔案,SDelete 會執行安全的覆寫,以確保之前是可用的所有磁碟空間已安全地清理。

在 NTFS 磁碟上,SDelete 的工作在配置和覆寫這兩個檔案後,未必已經完成。SDelete 也必須以可適合 MFT 記錄的檔案,來填滿 NTFS MFT (主檔案表格) 的任何現有可用部分。MFT 記錄一般而言是 1 KB 的大小,而且在磁碟上的每個檔案或目錄都需要至少一個 MFT 記錄。小型檔案會整個儲存在 MFT 記錄中,至於無法適合記錄中的檔案則會為其配置在 MFT 外面的叢集。SDelete 處理可用 MFT 空間所需做的事,就是配置它可配置的最大檔案:當檔案佔據 MFT 記錄中的所有可用空間時,NTFS 將可防止檔案變得更大,因為在磁碟上已經沒有可用的叢集 (它們被 SDelete 之前配置的兩個檔案佔住)。SDelete 接著會重複該程序。當 SDelete 甚至無法再建立一個新檔案時,它知道在 MFT 中所有之前可用的記錄,已完全被安全覆寫的檔案所填滿。

為了覆寫您刪除的檔案名稱,SDelete 將重新命名檔案 26 次,每一次會以連續的字母字元來取代檔案名稱的每個字元。例如,"foo.txt" 的第一個重新命名將會是 "AAA.AAA"。

SDelete 之所以在清理磁碟可用空間時未安全刪除檔案名稱,是因為刪除它們將需要直接操作目錄結構。目錄結構可能有包含已刪除檔案名稱的可用空間,但是可用的目錄空間並無法配置給其他的檔案來使用。因此,SDelete 無法配置此可用的空間來安全地覆寫它。



下載 SDelete (47 KB)

 

回到頁首