NTFS备用数据流

22

今天我发现了NTFS系统的一种奇怪的魔法:每个文件都可以有多个数据流。基本上,你可以有一个大小为0b的文件a.txt,但是可以在该文件的另一个数据流中隐藏任意数量的字节。这纯粹是NTFS相关的魔法,我不认为有任何高贵的理由来保留这些流。你可以使用Sysinternals的streams工具寻找NTFS流。这将向你展示,基本上所有那些讨厌的thumbs.db文件都带有额外的数据流。

好了,现在我已经看到这种魔法在Windows NT4系统上运行过,在文件上添加流、复制、删除(使用上述实用程序的帮助),但我现在正在尝试在我的Win XP系统上进行此操作,虽然我可以检测到现有的流,但我无法显示它们的内容,也无法创建新的流或做其他任何事情,当我使用filename:streamname语法时。

我得到了这个错误:

The filename, directory name, or volume label syntax is incorrect.

例如: 从streams工具获得的输出:

c:\DOWNLOADS>streams.exe -s .

Streams v1.56 - Enumerate alternate NTFS data streams
Copyright (C) 1999-2007 Mark Russinovich
Sysinternals - www.sysinternals.com

c:\DOWNLOADS\1013.pdf:
   :Zone.Identifier:$DATA       46

c:\DOWNLOADS>type 1013.pdf:Zone.Identifier
The filename, directory name, or volume label syntax is incorrect.

为什么我无法显示备用数据流的内容?

查看微软关于“如何使用NTFS备用数据流”的文档,我可以看到这适用于我的操作系统,尽管他们提到这些流将不会在未来得到支持。有人能够解释一下吗?


3
它说备用数据流可能不被未来的文件系统所支持(即在NTFS之后出现的文件系统),但它也说无论如何,未来的操作系统将继续支持NTFS。 - Pavel Minaev
我同意这个观点。因此,只要我的文件系统是NTFS,我就应该能够使用这些流来工作。我需要一个特殊版本的copy程序来支持从和到备用流的数据复制吗? - Peter Perháč
1
我不确定您的问题是什么 - 或许您应该编辑问题标题,这样我们就不必在问题主体中寻找您实际询问的内容了... - hippietrail
6个回答

25

从我的理解来说:NTFS数据流是在Windows NT 4.0中引入的,并且在所有后代系统中都存在(除了win-95的后代系统:98、Me)。在XP、Vista和Win 7中,它们仍然存在。只要Windows版本支持NTFS,它们就会支持文件流。它们将长期支持NTFS。

你遇到的错误在你问题所显示的页面上有描述。 type 命令不理解流。请使用:

more < 1013.pdf:Zone.Identifier

使用流

微软只有少数几个命令可以使用流,实际上只有<>可以与流一起使用,因此只能使用可以使用这些重定向运算符的命令。我写了几篇关于备用数据流的博客文章,介绍如何仅使用这些命令来操作流。

流只能与设计用于处理它们的程序一起使用,因为它们需要被特别处理(比较联接点,也是NTFS的一个功能,但驱动程序隐藏了细节,程序不需要做任何特殊处理:它们只将联接点视为真实文件)。

当您尝试使用start filename:streamname打开文件流时,如果一个程序显示类似于“非法文件名”或“找不到文件”的消息,并且您确定流名称正确,那么很可能该程序不支持流。我注意到记事本、写字板和Word/Excel可以正确地使用流,但Word和Excel认为这些文件很危险。这里有一些实验供您尝试。


注意:您似乎认为备用数据流很奇怪。它们之所以奇怪,是因为它们非常隐蔽,但许多主要的文件系统(如HFS、NSS)都有这个功能,而且这个概念可以追溯到80年代初。实际上,最初添加流到NTFS是为了与其他文件系统实现互操作性。


有趣的是,我曾经看到它与type命令一起使用。然而,用于演示的shell是NT4 shell,而不是通常的cmd.exe。 - Peter Perháč
复制 1013.pdf:Zone.Identifier x.xxx 应该也可以工作,但在我的机器上却不能。我就是不明白发生了什么事情。 - Peter Perháč
@PeterPerháč:不,copy 不起作用。是的,type 可以工作,但只能这样使用:type somefile > otherfile:streamname。反过来(使用 type 读取流)是 起作用的。更多想法请参见:http://www.undermyhat.org/blog/2012/04/ultimate-guide-manipulating-alternate-data-streams/。 - Abel

11

顺便提一下,你可以用记事本打开AltDataStream:

notepad.exe 1013.pdf:Zone.Identifier

此外,您可以指定AltDataStream的类型(不仅限于使用记事本,它是'完整流名称'):

1013.pdf:Zone.Identifier:$DATA

2
同样适用于Word、Excel和可能的其他MS程序,但必须从命令提示符开始。数据流的类型确实可以指定,但必须始终为$DATA,不支持其他类型。 - Abel
能否像隐藏文件夹一样使用AltDataStreams?也就是说,您能查看与流相关联的Zone.Identifiers吗? - Python Cheese

9

这严格与NTFS相关的魔法

不是这样的 - Mac OS 从过去就有这些,它们在那个世界里被称为“forks”,您可以使用 ResEdit 来获取它们。它们的经典用途是将媒体资产与可执行文件捆绑在一起。


9
确实。微软在他们的 NT Server Services for Macintosh 软件包中使用备用数据流来存储 Mac forks。 - bobbogo

7

备用数据流的一个可能用途是元数据。可以为文档添加大量描述,而不影响原始文件的内容。


4
这个错误的字面意思是它没有被识别为备用数据流,你所引用的内容包含某些在路径名中不允许的字符(例如 :;其他不允许的字符包括 \\/ 等)。
尝试使用以下命令: start this_is_a.txt:ads.exe

7
注意:Windows 7已经悄悄地移除了从ADS执行的功能,我仍在寻找实际实现此操作的方法。 - Joseph Hansen
2
你可以从备用数据流中执行,但不能直接执行。将数据流复制到文件中并执行即可。我还不知道其他方法。 - Abel

4

Win32 API可以很好地处理备用流的命名。

另一方面,当可能进行*/?扩展并且存在“:”时,CMD会对文件名进行一些奇怪的解析,导致复制和类型失败。这就是为什么简单的重定向有效但复制和类型失败的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接