关于NTFS数据流ADS的详细介绍

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(备用数据流)一定要依附于某个文件。

经过我查阅许多资料,得到的结论就是:

  1. ADS可以单独存在——创建单独的ADS数据流文件(这个ADS数据流文件不与宿主文件关联,是单独存在的;这个ADS数据流文件我们无法直接看到。)
  2. ADS也可以与宿主文件相关联——创建指定宿主文件的ADS数据流文件(将ADS数据流文件与宿主文件相关联;这个ADS数据流文件也无法直接看到。)

本文下文所说的ADS数据流、ADS数据流文件都指同一个东西,也就是:alternate data streams,简称ADS。

二、ADS的创建及查看(以文本文件为例)

其实我们已经在上面说了在NTFS分区创建ADS数据流文件有两种选择,这里再次强调一下:

  1. 创建单独的ADS数据流文件
  2. 创建指定宿主文件的ADS数据流文件

那我们要怎样创建ADS数据流文件呢?

  1. 采用Windows系统自带的命令
  2. 采用相关的工具
1. 创建单独的ADS数据流文件

在电脑的F盘创建一个名为test的文件夹,我们在这个文件夹里来进行ADS的创建、查看、删除等操作

我们这里采用Windows自带的命令进行创建

我们这里创建的ADS数据流文件的内容均为文本,ADS数据流内容不一样指令会有些许变化

echo命令可以用于输出信息到文件,查看文本内容用notepad,下文ADS内容均为文本,因此不再强调。

  1. 在test目录里打开cmd

  2. 输入以下命令

    echo “this is a file”>:ads.txt

    用中文解释上面这条指令,将"this is a file"输出到ADS数据流文件ads.txt。

    如下图:

    image-20220128215100564

    这样就在当前目录下创建了一个未指明宿主文件的名为ads.txt的数据流文件,很显然,我们无法看到它,打开文件夹查看,这个文件夹里面什么都没有。如下图:

    image-20220128215544160

    那么就会有疑问了,我们到底要怎样才能知道我们到底是不是创建了一个名为ads.txt的数据流文件呢,真的创建了吗?

2. 查看单独的ADS数据流文件

看过许多文章,里面都讲了如何用Windows自带的命令来查看与宿主文件相关联的ADS数据流文件内容。

命令如下:

  • notepad 宿主文件:与宿主关联的数据流文件

却没有文章讲怎样用Windows自带的命令查看单独的ADS数据流文件内容,有翻到过一篇文章讲以下指令可以查看单独的ADS数据流文件内容,但经过我实测,并不可以。用我刚才创建的ads.txt来演示,命令如下:

  • notepad :ads.txt

对,你没看错,就是以上指令,仔细一看,这条指令没有问题啊,我们单独创建了ADS数据流文件,所以只需要省略掉宿主文件就可以了,但是真的可行吗?这条指令结果如下:

image-20220128230043362

很明显,并不可以。

那还有方式查看这个单独创建的ADS数据流文件吗?当然是有的。

其实单独的数据流文件,可以用dir这个命令来检测出来,但是无法看到这个数据流文件的具体内容

除此以外,我这里是找到了几个工具:

  • 微软提供的streams(Streams - Windows Sysinternals | Microsoft Docs)。几百KB,可以扫描文件夹扫出ADS数据流文件,缺点是好像不能查看数据流内容。

    image-20220128233636873

  • NtfsStreamsEditor

    把文件夹放进去直接扫描即可,可以查看具体内容

    image-20220128233901378

  • X-Ways_Forensics

    将磁盘加载进来之后,单独的ADS备用数据流也可以显示出来:

    image-20220128234459306

3. 创建指定宿主文件的ADS数据流文件

在上面讲了如何创建单独的ADS数据流文件,下面我们讲如何创建与宿主文件相关联的ADS数据流文件

  1. 创建宿主文件

    宿主文件是指在Windows中可以正常显示、运行或编辑的任何类型文件

    假设:我们用记事本创建一个txt格式的文本文件host.txt,随意输入一些内容,记住该文件的大小

  2. 关联数据流文件

    打开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也就是记事本;同样的,冒号前面是宿主文件,冒号后面是关联的数据流文件。输入这条指令,我们就能够查看到关联的数据流文件的具体内容了。

image-20220129205346387

三、ADS数据流文件的删除

  1. 单独的数据流文件。

    由于未指定宿主文件,一般的方法无法删除。可以采取删除其上一级目录的方法来删除这个单独的ADS数据流文件;当然也有一些专业的工具也可以做到,如我上文所说的NtfsStreamsEditor,或者X-Ways。

  2. 与宿主文件关联的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,如下图:

image-20220130193211886

我们是打算将这个ads.exe作为host.txt的ADS关联数据流,关联完之后,再删除原有的ads.exe,看看会不会对已经关联的ADS数据流产生影响。

我们关联之前我们先记录这个ads.exe的大小,如下图,327921字节。

image-20220130192425047

然后我们将这个ads.exe作为ADS数据流与host.txt相关联,并指定其数据流名称为:realads.exe。在cmd输入以下指令:

image-20220130192844294

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数据流)扫这个文件夹,如下图:

image-20220130193307830

这个蓝色的打对勾的就是我们刚才关联的ADS数据流(上面那一条是因为这个ads.exe是ctf一道题的题目附件,所以ads.exe自身也作为宿主文件也关联了一个数据流,不影响。同时后面我们如果删除掉ads.exe,这个数据流也会被删除。),可以看到这个数据流的名称realads.exe,这个数据流的大小ads.exe的大小一致都是327921字节。

然后我们删除原有的ads.exe文件,看看会不会对已经关联的ADS数据流(readads.exe)的大小和内容产生影响。

如下图,我删除掉原有的ads.exe,只留下了一个host.txt

image-20220130193844414

之后,我们再用工具扫描这个文件夹:

image-20220130194013813

可以观察上图:当我们删除掉ads.exe之后,这里只剩下了一条记录,数据流名称为:realads.exe。可以看到当我们删除原有的ads.exe之后,这个数据流(realads.exe)的大小没有发生任何改变。

我们甚至可以用这个工具提供的导出功能,将作为ADS数据流的readlads.exe导出为原来的可见可直接执行的.exe文件。

image-20220130195737945

下图就是导出之后的结果:

image-20220130195750897

我们甚至可以对系统的一些重要文件附加数据流文件,

如: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数据流文件连同宿主文件一起打包压缩,这样就方便了数据流文件的压缩和异地存储。如下图:

image-20220202170336872

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“。

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值