SDelete v2.04

作者:Mark Russinovich

发布时间: 2020 年 11 月 25 日

Download下载 SDelete (518 KB)

简介

Windows NT/2000 (Win2K) C2 合规性的一项功能是实现对象重用保护。 这意味着,当应用程序分配文件空间或虚拟内存时,无法查看以前存储在资源中的数据,Windows NT/2K 为其分配。 Windows NT零填充内存,并将文件放置在磁盘上的扇区,然后再将任一类型的资源呈现给应用程序。 但是,对象重用并不指示文件在删除之前占用的空间为零。 这是因为Windows NT/2K 的设计假设是操作系统控制对系统资源的访问。 但是,当操作系统未处于活动状态时,可以使用原始磁盘编辑器和恢复工具来查看和恢复操作系统已解除分配的数据。 即使使用 Win2K 的加密文件系统加密文件 (EFS) ,文件的原始未加密文件数据也会保留在磁盘上,然后再创建新的加密版本。

确保使用 EFS 加密的已删除文件以及使用 EFS 加密的文件的唯一方法是使用安全的删除应用程序。 安全删除应用程序使用显示使磁盘数据无法恢复的技术覆盖已删除的文件的磁盘上数据,即使使用恢复技术,这些技术可以在磁介质中读取显示弱删除的文件的模式。 SDelete (Secure Delete) 就是这样一个应用程序。 可以使用 SDelete 安全地删除现有文件,以及安全地擦除磁盘未分配部分中存在的任何文件数据, (包括已删除或加密) 的文件。 SDelete 实施国防部清理和清理标准 DOD 5220.22-M,让你确信使用 SDelete 删除后,文件数据将永远消失。 请注意, SDelete 安全地删除文件数据,但不会删除位于可用磁盘空间中的文件名。

使用 SDelete

SDelete 是一个命令行实用工具,它采用许多选项。 在任何给定的用途中,它都允许您删除一个或多个文件和/或目录,或者清理逻辑磁盘上的可用空间。 SDelete 接受通配符作为目录或文件说明符的一部分。

用法:sdelete [-p passes] [-r] [-s] [-q] <文件或目录> ...
sdelete [-p passes] [-z|-c [percent free]] <驱动器号 ...>sdelete [-p passes] [-z|-c] &ltphysical disk number>

参数 说明
-c 清理可用空间。 指定可用空间量,供正在运行的系统使用。
-p 指定默认为 1) (覆盖传递数。
-r 删除Read-Only属性。
-s 递归子目录。
-z 零可用空间 (适用于虚拟磁盘优化) 。
-nobanner 不显示启动横幅和版权消息。

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 记录的大小通常为 1KB,磁盘上的每个文件或目录至少需要一条 MFT 记录。 小文件完全存储在 MFT 记录中,而不符合记录的文件则分配在 MFT 外部的群集中。 所有 SDelete 必须处理可用 MFT 空间的分配最大文件-当文件占用 MFT Record NTFS 中的所有可用空间时,文件将阻止文件变大,因为磁盘上没有剩余的可用群集, (两个以前分配的 SDelete 文件) 。 然后,SDelete 重复该过程。 当 SDelete 无法再创建新文件时,它知道 MFT 中以前释放的所有记录都已完全填充有安全覆盖的文件。

若要覆盖删除的文件的文件名, SDelete 将文件重命名 26 次,每次用连续字母字符替换文件名称的每个字符。 例如,“foo.txt”的第一个重命名是“AAA”。AAA”。

清理磁盘空间时 ,SDelete 不会安全地删除文件名的原因是删除它们需要直接操作目录结构。 目录结构可以具有包含已删除文件名的可用空间,但可用目录空间不可用于分配给其他文件。 因此, SDelete 无法分配此可用空间,以便它可以安全地覆盖它。

Download下载 SDelete (518 KB)

运行时间:

  • 客户端:Windows Vista 及更高版本
  • 服务器:Windows Server 2008 及更高版本
  • Nano Server:2016 及更高版本