SDelete v2.05
作者:Mark Russinovich
发布时间:2023 年 9 月 29 日
下载 SDelete (304 KB)
简介
Windows NT/2000 (Win2K) C2 合规性的一个功能是实现对象重用保护。 这意味着,当应用程序分配文件空间或虚拟内存时,它无法查看以前存储在 Windows NT/2K 为其分配的资源中的数据。 Windows NT 在向应用程序提供任何类型的资源之前,都会先将内存清零,并将磁盘上放置文件的扇区清零。 但是,对象重用并不要求将文件在删除之前占用的空间清零。 这是因为 Windows NT/2K 的设计假设操作系统控制对系统资源的访问。 但是,当操作系统不处于活动状态时,可以使用原始磁盘编辑器和恢复工具来查看和恢复操作系统已解除分配的数据。 即使使用 Win2K 的加密文件系统 (EFS) 加密文件,在创建文件的新加密版本后,文件的原始未加密文件数据也会保留在磁盘上。
确保已删除的文件以及使用 EFS 加密的文件不被恢复的唯一方法是使用安全的删除应用程序。 安全删除应用程序使用显示为使磁盘数据不可恢复的技术覆盖已删除文件的磁盘数据,即使使用恢复技术可以读取磁性介质中显示弱删除文件的模式。 SDelete(安全删除)就是这样的应用程序。 可以使用 SDelete 来安全地删除现有文件,也可以安全地擦除磁盘未分配部分中存在的任何文件数据(包括已删除或加密的文件)。 SDelete 实施国防部的清除和清理标准 DOD 5220.22-M,让你确信使用 SDelete 删除后,文件数据将永久消失。 请注意,SDelete 可安全地删除文件数据,但不会删除位于可用磁盘空间中的文件名。
使用 SDelete
SDelete 是一个命令行实用工具,它包含许多选项。 在任何给定的使用中,它都允许删除一个或多个文件和/或目录,或者清理逻辑磁盘上的可用空间。 SDelete 接受通配符作为目录或文件说明符的一部分。
用法:
sdelete [-p passes] [-r] [-s] [-q] [-f] <file or directory [...]>
sdelete [-p passes] [-q] [-z|-c] <drive letter [...]>
sdelete [-p passes] [-q] [-z|-c] <physical disk number [...]>
参数 | 说明 |
---|---|
-c | 清理可用空间。 |
-f | 强制使用仅包含要视为文件/目录而不是磁盘的字母的参数。 如果参数包含其他字符(例如路径分隔符或文件扩展名),则不需要此参数。 |
-p | 指定覆盖传递数(默认值为 1)。 |
-q | 静默模式。 |
-r | 删除 Read-Only 属性。 |
-s | 递归子目录。 |
-z | 将可用空间清零(有利于虚拟磁盘优化)。 |
-nobanner | 不显示启动横幅和版权消息。 |
- 为了进行清理,磁盘不得带有任何卷。
- 对于驱动器号,请包括
:
,例如D:
。
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 记录中的所有可用空间时,NTFS 将阻止文件变大,因为磁盘上没有剩余的可用群集(它们由 SDelete 之前分配的两个文件持有)。 然后,SDelete 将重复该过程。 当 SDelete 甚至无法再创建新文件时,它知道 MFT 中以前可用的所有记录都已完全填充有安全覆盖的文件。
若要覆盖您删除的文件的文件名,SDelete 会重命名该文件 26 次,每次将文件名的每个字符替换为连续的字母字符。 例如,“foo.txt”的第一个重命名为“AAA.AAA”。
清理磁盘可用空间时 SDelete 不安全地删除文件名的原因是删除文件名需要直接操作目录结构。 目录结构可以具有包含已删除文件名的可用空间,但可用目录空间不能分配给其他文件。 因此,SDelete 无法分配此可用空间,以便可以安全地覆盖它。
下载 SDelete (304 KB)
运行软件:
- 客户端:Windows 10 及更高版本。
- 服务器:Windows Server 2012 及更高版本。
- Nano Server:2016 及更高版本。