NTFS数据流
本文章中许多地方引用了下面这篇文章的内容:
https://blog.csdn.net/cosmoslife/article/details/49299881
我用了里面的一些示例,然后我将其解释和整理:
NTFS
NTFS数据流是NTFS的一个特性,在了解NTFS数据流之前,要先了解NTFS。
NTFS(New Technology File System)是Windows NT内核的系列操作系统支持的、一个特别为网络和磁盘配额、文件加密等管理安全特性设计的磁盘格式,提供长文件名,数据保护和恢复,能通过目录和文件许可实现安全性,并支持跨越分区。——百度百科
NTFS数据流
一、什么是NTFS数据流?
NTFS交换数据流(alternate data streams,简称ADS)是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流,就是说除了主文件流之外还可以有许多非主文件流。它使用资源派生来维持与文件相关的信息,虽然我们无法看到数据流文件,但是它却是真实存在于我们的系统中的。
创建一个数据交换流文件的方法很简单,命令为“宿主文件:准备与宿主文件关联的数据流文件”。 ——百度百科
NTFS交换数据流也叫做备用数据流。
所有的文件在NTFS中至少包含一个主数据流,也就是用户可见的文件或是目录,一个文件在NTFS中真正的文件名称格式:
<文件名>:<流名>:<流种类>
我们在上面说文件在NTFS中至少包含一个主数据流,可以包含许多备用数据流。但是我们并没有说ADS(备用数据流)一定要依附于某个文件。
经过我查阅许多资料,得到的结论就是:
- ADS可以单独存在——创建单独的ADS数据流文件(这个ADS数据流文件不与宿主文件关联,是单独存在的;这个ADS数据流文件我们无法直接看到。)
- ADS也可以与宿主文件相关联——创建指定宿主文件的ADS数据流文件(将ADS数据流文件与宿主文件相关联;这个ADS数据流文件也无法直接看到。)
本文下文所说的ADS数据流、ADS数据流文件都指同一个东西,也就是:alternate data streams,简称ADS。
二、ADS的创建及查看(以文本文件为例)
其实我们已经在上面说了在NTFS分区创建ADS数据流文件有两种选择,这里再次强调一下:
- 创建单独的ADS数据流文件
- 创建指定宿主文件的ADS数据流文件
那我们要怎样创建ADS数据流文件呢?
- 采用Windows系统自带的命令
- 采用相关的工具
1. 创建单独的ADS数据流文件
在电脑的F盘创建一个名为test的文件夹,我们在这个文件夹里来进行ADS的创建、查看、删除等操作
我们这里采用Windows自带的命令进行创建
我们这里创建的ADS数据流文件的内容均为文本,ADS数据流内容不一样指令会有些许变化。
echo命令可以用于输出信息到文件,查看文本内容用notepad,下文ADS内容均为文本,因此不再强调。
-
在test目录里打开cmd
-
输入以下命令
echo “this is a file”>:ads.txt
用中文解释上面这条指令,将"this is a file"输出到ADS数据流文件ads.txt。
如下图:
这样就在当前目录下创建了一个未指明宿主文件的名为ads.txt的数据流文件,很显然,我们无法看到它,打开文件夹查看,这个文件夹里面什么都没有。如下图:
那么就会有疑问了,我们到底要怎样才能知道我们到底是不是创建了一个名为ads.txt的数据流文件呢,真的创建了吗?
2. 查看单独的ADS数据流文件
看过许多文章,里面都讲了如何用Windows自带的命令来查看与宿主文件相关联的ADS数据流文件内容。
命令如下:
- notepad 宿主文件:与宿主关联的数据流文件
却没有文章讲怎样用Windows自带的命令查看单独的ADS数据流文件内容,有翻到过一篇文章讲以下指令可以查看单独的ADS数据流文件内容,但经过我实测,并不可以。用我刚才创建的ads.txt来演示,命令如下:
- notepad :ads.txt
对,你没看错,就是以上指令,仔细一看,这条指令没有问题啊,我们单独创建了ADS数据流文件,所以只需要省略掉宿主文件就可以了,但是真的可行吗?这条指令结果如下:
很明显,并不可以。
那还有方式查看这个单独创建的ADS数据流文件吗?当然是有的。
其实单独的数据流文件,可以用dir这个命令来检测出来,但是无法看到这个数据流文件的具体内容
除此以外,我这里是找到了几个工具:
-
微软提供的streams(Streams - Windows Sysinternals | Microsoft Docs)。几百KB,可以扫描文件夹扫出ADS数据流文件,缺点是好像不能查看数据流内容。
-
NtfsStreamsEditor
把文件夹放进去直接扫描即可,可以查看具体内容
-
X-Ways_Forensics
将磁盘加载进来之后,单独的ADS备用数据流也可以显示出来:
3. 创建指定宿主文件的ADS数据流文件
在上面讲了如何创建单独的ADS数据流文件,下面我们讲如何创建与宿主文件相关联的ADS数据流文件
-
创建宿主文件
宿主文件是指在Windows中可以正常显示、运行或编辑的任何类型文件。
假设:我们用记事本创建一个txt格式的文本文件host.txt,随意输入一些内容,记住该文件的大小
-
关联数据流文件
打开cmd,输入命令:echo “this is a test file”>host.txt:ads.txt。这样我们就创建了一个名为ads.txt,内容为“this is a test file”的数据流文件,并与宿主文件host.txt进行了关联,即ads.txt文件成了host.txt的一个寄生文件。
注意这条指令:
echo “this is a test file”>host.txt:ads.txt
如果要用中文解释解释一下上面这条指令那就是:输出 "this is a test file"到host.txt的ADS关联数据流文件ads.txt。
冒号的前面是宿主文件,冒号的后面是要与宿主文件关联的数据流文件的名称。
4. 查看指定宿主文件的ADS数据流文件
用上文查看单独的ADS数据流文件时用的几款工具都能达到查看的效果。
除此以为,与宿主文件关联的ADS数据流文件内容的查看,还可以使用Windows自带的命令,命令如下:
notepad host.txt:ads.txt
notepad指的是notepad.exe也就是记事本;同样的,冒号前面是宿主文件,冒号后面是关联的数据流文件。输入这条指令,我们就能够查看到关联的数据流文件的具体内容了。
三、ADS数据流文件的删除
-
单独的数据流文件。
由于未指定宿主文件,一般的方法无法删除。可以采取删除其上一级目录的方法来删除这个单独的ADS数据流文件;当然也有一些专业的工具也可以做到,如我上文所说的NtfsStreamsEditor,或者X-Ways。
-
与宿主文件关联的ADS数据流文件
- 直接删除宿主文件
- 将宿主文件移动到FAT32等非NTFS分区中
- 利用工具软件
四、文本文件以外的关联的ADS数据流文件
除文本文件以为,包括可执行文件在内的任何常规文件都可以被设置成ADS数据流文件
例如:type C:\winnt\system32\sol.exe>host.txt:sol2.exe,就会把sol.exe文件设置成host.txt的ADS数据流文件sol2.exe。
(看到这里,出现了一个新的指令type,找了很多资料,发现大多描述type的都是说type能显示文本文件内容。发现了和本文沾边的关于type的用法就是:type C:\123.txt>D:\123.txt,意思就是将C盘123.txt的内容输出到D盘123.txt里。)
有人可能要问:type后面的是sol.exe,可是冒号后面的是sol2.exe,这里是不是打错了?其实并没有。按照我的理解,执行上述指令之后,会将sol.exe这个文件的内容复制一份出来,将其作为ADS数据流,指定其数据流的名称为:sol2.exe,并将这个数据流(sol2.exe)与host.txt关联。 既然是复制出来的,那么更改或删除掉原有的sol.exe之后,应该也不会对已经和host.txt文件相关联的ADS数据流(sol2.exe)的内容产生影响吧?答案是确实是这样的,就算把原有的sol.exe删掉,也不会对已经关联好的ADS数据流(sol2.exe)内容产生影响。
那么如何验证呢?以下是我个人的验证过程。
是这样的,我在这个文件夹里放入了一个host.txt(里面什么内容都没有,空文本)和一个ads.exe,如下图:
我们是打算将这个ads.exe作为host.txt的ADS关联数据流,关联完之后,再删除原有的ads.exe,看看会不会对已经关联的ADS数据流产生影响。
我们关联之前我们先记录这个ads.exe的大小,如下图,327921字节。
然后我们将这个ads.exe作为ADS数据流与host.txt相关联,并指定其数据流名称为:realads.exe。在cmd输入以下指令:
type ads.exe>host.txt:realads.exe
关于上述指令,这里要提一个细节,就是如果ads.exe这个文件自身作为宿主文件有其ADS数据流,那么这时候我们将ads.exe作为ADS数据流与host.txt(作为宿主文件)相关联,ads.exe其自身的ADS数据流是不会被一起关联的。也就是复制ads.exe的内容作为ADS数据流的时候,仅仅复制了ads.exe的内容,并没有将ads.exe自身的关联的ADS数据流复制上。
进行完这个关联之后,我们用工具(这个工具只会扫描ADS数据流)扫这个文件夹,如下图:
这个蓝色的打对勾的就是我们刚才关联的ADS数据流(上面那一条是因为这个ads.exe是ctf一道题的题目附件,所以ads.exe自身也作为宿主文件也关联了一个数据流,不影响。同时后面我们如果删除掉ads.exe,这个数据流也会被删除。),可以看到这个数据流的名称:realads.exe,这个数据流的大小和ads.exe的大小一致都是327921字节。
然后我们删除原有的ads.exe文件,看看会不会对已经关联的ADS数据流(readads.exe)的大小和内容产生影响。
如下图,我删除掉原有的ads.exe,只留下了一个host.txt:
之后,我们再用工具扫描这个文件夹:
可以观察上图:当我们删除掉ads.exe之后,这里只剩下了一条记录,数据流名称为:realads.exe。可以看到当我们删除原有的ads.exe之后,这个数据流(realads.exe)的大小没有发生任何改变。
我们甚至可以用这个工具提供的导出功能,将作为ADS数据流的readlads.exe导出为原来的可见可直接执行的.exe文件。
下图就是导出之后的结果:
我们甚至可以对系统的一些重要文件附加数据流文件,
如:type image.bmp>C:\windows\explore.exe:image.bmp,就会将图片image.bmp设为explore.exe的数据流文件。不难看出,ADS数据流文件的基本创建形式就是宿主文件名:数据流文件名,中间用冒号隔开。
那么如何查看除文本文件以外的关联的ADS数据流文件呢
例:mspaint.exe explore.exe:image.bmp,就可以查看寄宿在explore.exe中的图片。
实际上,ADS数据流文件的通用查看方法是:ADS文件对应的打开/编辑程序 宿主文件名:数据流文件名。
五、ADS数据流文件的应用
1. 隐藏/加密文件
例如命令:type 1.bmp>song.mp3:1.bmp,可以将1.bmp这个图像隐藏到mp3歌曲中,通过上文我的论证,将1.bmp设置为ADS数据流文件之后,删除原来的1.bmp也不会产生任何影响,我们仍然有办法查看作为ADS数据流的1.bmp,甚至能将其导出为原来的主文件格式。在这种情况下,只要宿主文件没有删除,数据流文件就比较安全。
2. WinRar的数据流压缩
WinRar有一个重要的特性——支持数据流压缩。打开WinRar的压缩对话框,单机“高级”标签,勾选“NTFS选项”中的“保存数据流”选项,即可将ADS数据流文件连同宿主文件一起打包压缩,这样就方便了数据流文件的压缩和异地存储。如下图:
3. 制作病毒或木马
事实上,当前很多病毒、木马就是利用数据流文件夹躲避杀毒软件查杀的。与此同时,杀毒软件对ADS数据流技术的支持并不是很好,这些都导致了病毒木马的进一步泛滥。
六、ADS数据流文件的执行
当一个可执行文件被隐藏在ADS数据流文件中后,我们可以通过start命令来执行这个程序。假设我们用“type C:\winnt\notepad.exe>host.txt:np.exe”命令将记事本设为了host.txt的数据流文件,那么就可以通过”start .\host.txt:np.exe“命令来运行记事本。请注意:命令行中的”.\“是相对路径表示方法,说明当前目录就是host.txt所在的目录。如果当前目录不是host.txt所在的目录,则应用绝对路径表示方法指明host.txt所在的路径,否则系统就会报错。当ADS数据流文件是一个VBS脚本文件时,也可以通过windows的WSH来执行,例如”wt host.txt:ads.vbx“。