有人用了我的 USB 驱动器,在将其还给我时,我发现一个autorun.inf
无法删除的文件。我尝试更改它的文件属性,该属性仅为 H(甚至未设置为系统文件),但它一直显示“访问被拒绝”。
USB 设置为 FAT32,我问了朋友,他告诉我他使用熊猫USB疫苗
他们是怎么做到的?我尝试使用一些磁盘扇区编辑器,但不知道他们更改了哪个十六进制文件来制作这种文件并使其再次可删除。格式化驱动器会将其删除,但我很好奇如何设置这些文件属性。
答案1
测试方法
Panda 似乎没有透露其“疫苗”的具体机制,这是可以理解的,因为它基本上通过隐蔽性实现安全如果你知道它是如何起作用的,你就可以逆转其影响,使“疫苗”变得毫无用处。
我下载并安装了熊猫USB疫苗并“接种”了我的闪存驱动器,转储了闪存驱动器的分区dd for windows使用命令
dd --list
dd if=\\.\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} of=C:\vaccinated.img
其中xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
是第一个命令提供的 GUID,c:\vaccinated.img
在十六进制编辑器中打开并搜索AUTORUN
。
USB 疫苗的作用
的条目AUTORUN.INF
以以下十二个字节开头:
41 55 54 4F 52 55 4E 20 49 4E 46 42
前 11 个字节只是空格填充的8.3 文件名:AUTORUN INF
最后一个字节指定文件的属性,其二进制表示为:
01000010
根据Microsoft EFI FAT32 文件系统规范,最后一个字节是一个位域,其形式如下:
XYADVSHR
其中,当且仅当文件为存档、目录、卷 ID 为1、系统文件、隐藏或只读时,位A
、D
、V
、S
和H
才R
为。为隐藏,因为设置为。1
AUTORUN.INF
H
1
位X
和Y
是保留的,应该都是0
。但是,USB Vaccine 设置Y
为1
。
规范内容
属性字节的高两位是保留的,在创建文件时应始终设置为 0,并且此后永远不会被修改或查看。
此外,它建议验证目录内容:
提供这些指南是为了让磁盘维护实用程序可以验证各个目录条目的“正确性”,同时保持与目录结构未来增强的兼容性。
不要查看标记的目录条目字段的内容预订的并假设,如果它们是零以外的任何值,那么它们就是“坏的”。
不要重置标记的目录条目字段的内容预订的当它们包含非零值时(假设它们是“坏的”),则为零。目录条目字段被指定为预订的, 而不是必须为零。您的应用程序应忽略它们。这些字段用于文件系统的未来扩展。通过忽略它们,实用程序可以继续在未来版本的操作系统上运行。
实际情况
CHKDSK 确实遵循了规范,并忽略了AUTORUN.INF
FAT32 驱动程序无法理解的条目,但 Windows 本身似乎并不遵守规范的要求再也不用看保留位:任何类型的访问(除列出文件及其属性外)都被拒绝。
例如,命令
DIR /A /Q
声明 的所有者AUTORUN.INF
是...
。由于 FAT32 不支持文件所有权,因此应该声明\All
。
出现这种意外行为的原因是,根据FAT32 - 维基百科 # 目录条目,Windows 内部使用该位Y
来表示字符设备名称(CON、PRN、AUX、CLOCK$、NUL、LPT1、COM1 等),并且它不应该出现在存储设备上。2
从某种意义上来说,USB Vaccine 欺骗 Windows 认为这AUTORUN.INF
不是一个实际的文件,而是一个无法读取或写入的设备。
如何删除文件
如果您可以直接访问文件系统,只需设置Y
为0
(将字节更改42
为02
)即可使文件再次可删除。您还可以将目录条目的第一个字节设置为E5
,直接将文件标记为已删除。3
另一个选择是使用不同的驱动程序。例如,Ubuntu 12.04 可以毫无问题地删除该文件。实际上,它在读取目录条目时会自动“修复”它。4
1此属性用于卷标或文件夹系统容量信息。
2当然,设置X
为1
似乎没有任何效果。
3我通过使用十六进制编辑器更改相应字节C:\vaccinated.img
并使用以下命令将修改后的图像写入闪存驱动器来验证这一点:
dd if=C:\vaccinated.img of=\\.\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
4虽然明显偏离了规范,但似乎是经过深思熟虑的。X
如果将 设置为 , Ubuntu 会保留1
,因为这不会造成任何损害。将位设置Y
为1
很容易被恶意应用程序滥用,例如,创建一个占用驱动器整个可用空间的不可删除文件。
答案2
这是一个巧妙的文件系统技巧,利用了 Win32 命名空间中的保留名称。Panda USB Vaccine 如何做到这一点的详细信息在此处概述。
本质上,该软件会创建一个名为 的文件夹autorun.inf
(这可以防止在该文件夹中创建同名文件),然后在该文件夹中LTP1
创建一个名为 的文件。在 DOS 中,LPT1
指的是打印机端口,Windows 支持此功能以实现向后兼容性。因此,当您请求名为 的文件时LPT1
,Windows 会尝试打开打印机端口,而这会以某种方式阻止正常删除该文件夹。
至于如何在不格式化驱动器的情况下删除文件夹/文件,此 Microsoft 知识库文章给出了一些提示:
原因 5:文件名包含 Win32 命名空间中的保留名称
如果文件名包含 Win32 命名空间中的保留名称(例如“lpt1”),则可能无法删除该文件。要解决此问题,请使用非 Win32 程序重命名该文件。您可以使用 POSIX 工具或任何其他使用适当内部语法的工具来使用该文件。
此外,如果您使用特定语法指定文件路径,则可能能够使用一些内置命令绕过典型的 Win32 保留名称检查。例如,如果您
Del
在 Windows XP 中使用该命令,则可以删除名为“lpt1”的文件,前提是您使用以下特殊语法指定文件的完整路径:del \\?\c:\path_to_file\lpt1
有关在 Windows NT 和 Windows 2000 下删除具有保留名称的文件的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
120716 如何在 Windows 中删除具有保留名称的文件
有关在 Windows XP 下删除具有保留名称的文件的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
315226 如何在 Windows XP 中删除具有保留名称的文件
如果使用典型的 Win32
CreateFile
机制打开文件句柄,则某些文件名将为旧式 DOS 设备保留。为了向后兼容,不允许使用这些文件名,并且不能使用典型的 Win32 文件调用来创建它们。但是,此问题不是 NTFS 的限制。您可以使用 Win32 程序绕过在创建(或删除)文件时执行的典型名称检查,方法是使用与遍历深度超过 的文件夹相同的技术
MAX_PATH
。此外,某些 POSIX 工具不受这些名称检查的约束。