NTFS 备用数据流

Posted

技术标签:

【中文标题】NTFS 备用数据流【英文标题】:NTFS alternate data streams 【发布时间】:2010-12-21 01:13:25 【问题描述】:

今天我看到了这个奇怪的神奇的 NTFS 系统支持:每个文件可以有多个数据流。基本上可以有一个大小为 0b 的文件a.txt,但在该文件的单独数据流中可以隐藏任意数量的字节。这完全是与 NTFS 相关的魔法,我认为没有任何高尚的理由让这些流存在。您可以在 Sysinternals 的 streams 实用程序的帮助下查找 NTFS 流。这将告诉你,基本上每个讨厌的thumbs.db 文件都带有一个额外的数据流。

好的,现在我已经在 Windows NT4 系统上看到了这个神奇的工作,将流添加到文件、复制、删除(在上述实用程序的帮助下),但我现在正在家里的 Win XP 系统上尝试这个,但是虽然我可以检测到现有的流,但当我使用 filename:streamname 语法时,我无法显示它们的内容,无法创建新的流,或者其他任何东西。

我收到此错误:

文件名、目录名或 卷标语法不正确。

示例: 流实用程序的输出:

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.

为什么我不能显示备用数据流的内容?

查看有关“How To Use NTFS Alternate Data Streams”的 Microsoft 文档,我可以看到这适用于我的操作系统,尽管他们确实提到将来不会支持这些流。任何人都可以对此有所了解吗?

【问题讨论】:

它说未来的文件系统(即NTFS之后的那些)可能不支持备用流,但是它说未来将支持NTFS 操作系统不管。 我同意这一点。所以,只要我的 fs 是 NTFS,我就应该能够使用这些流。我是否需要特殊版本的 copy 程序来支持从备用流复制数据或将数据复制到备用流中? 我不确定您的问题是什么 - 也许您应该编辑问题标题,这样我们就不必筛选问题主体来寻找您实际要问的内容...跨度> 【参考方案1】:

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

另一方面,当可能有 */ 时,CMD 会对文件名进行一些时髦的解析?出现“:”时展开和 barfs。这就是复制和键入失败但简单重定向有效的原因。

【讨论】:

【参考方案2】:

从我的脑海中浮现:NTFS datastreams 是在 Windows NT 4.0 中引入的,并且在所有后代中都存在(不包括 win-95 后代:98,Me)。在 XP、Vista 和 Win 7 中,它们仍然存在。只要 Windows 版本支持 NTFS,它们就会支持文件流。他们将在很长一段时间内支持 NTFS。

您在问题中显示的页面上描述了您遇到的错误。 type 命令不理解流。使用:

more < 1013.pdf:Zone.Identifier

使用流

微软只有少数命令可以处理流,实际上只有&lt;&gt; 可以处理流,因此只能使用可以处理这些重定向运算符的命令。我写了一个 couple of blog posts on alternate datastreams 来介绍如何仅使用这些命令来操作流。

Streams 只适用于设计用于它们的程序,只是因为它们需要特殊处理(比较连接点,也是 NTFS 的一个特性,但驱动程序隐藏了细节,程序不需要做任何事情特别:他们只是将连接点视为真实文件)。

当您尝试使用start filename:streamname 打开文件流时,程序显示“非法文件名”或“找不到文件”之类的内容,并且您确定流名称正确,那么程序很可能确实这样做了不支持流。我注意到记事本、写字板和 Word/Excel 可以与流一起正常工作,尽管 Word 和 Excel 认为这些文件很危险。这里有some experiments你可以试试。


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

【讨论】:

有趣的是我已经看到它与 type 命令一起工作。然而用于演示的 shell 是 NT4 shell,而不是通常的 cmd.exe copy 1013.pdf:Zone.Identifier x.xxx 也应该可以。但它不在我的机器上。我只是不明白发生了什么。 @PeterPerháč:不,copy 不起作用。是的,type 确实有效,但只是这样:type somefile &gt; otherfile:streamname。反过来(使用 type 读取流)not 起作用。有关更多想法,请参阅:undermyhat.org/blog/2012/04/…【参考方案3】:

该错误的字面意思是它未被识别为备用数据流,并且您所做的引用包含路径名中不允许的某个字符(:;其他不允许的字符包括 @987654322 @,/ 等)。

试试:

start this_is_a.txt:ads.exe

【讨论】:

注意:Windows 7 已经默默地删除了从 ADS 执行的能力,我仍在寻找一种方法来真正做到这一点。 您可以从备用数据流执行,但不能直接执行。将数据流复制到文件并执行它将起作用。我(还)不知道另一种方式。【参考方案4】:

这完全是与 NTFS 相关的魔法

不是这样 - Mac OS 从那时起就有这些,它们在那个世界被称为 forks,你可以使用 ResEdit 来处理它们。其中classic use 是将媒体资产与可执行文件捆绑在一起。

【讨论】:

确实如此。 Microsoft 使用备用流将 Mac 分支存储在他们的 NT Server Services for Macintosh 包中。【参考方案5】:

顺便说一句,你可以用记事本打开 AltDataStream:

notepad.exe 1013.pdf:Zone.Identifier

另外,您可以指定 AltDataStream 的类型(不仅是记事本,它是“完整的流名称”):

1013.pdf:Zone.Identifier:$DATA

【讨论】:

Word、Excel 和可能的其他 MS 程序也是如此,但您必须从命令提示符启动它。数据流的类型确实可以指定,但必须始终为$DATA,不支持其他类型。 是否可以像隐藏文件夹一样使用 AltDataStreams? IE。您可以查看与流关联的 Zone.Identifiers 吗?【参考方案6】:

备用流的一个可能用途:元数据。可以在不影响原始文件内容的情况下,为文档添加大段描述。

【讨论】:

以上是关于NTFS 备用数据流的主要内容,如果未能解决你的问题,请参考以下文章

Windows 资源管理器在哪里存储文件元数据?

NTFS 数据流隐写学习

NTFS 数据流隐写学习

NTFS 数据流隐写学习

利用NTFS交换数据流隐藏文件

NTFS文件系统误删除数据的恢复教程