NTFS Alternate Data Stream(ADS)
1993年微软推出了基于流行的NT平台的Windows NT操作系统。之后,NTFS作为WIndows开发基于NT的操作系统时的首选文件系统,逐步取代被应用于旧版Windows操作系统(比如Windows 9x)的文件系统,即FAT(File Access Table)。
NTFS中的备用数据流(Alternate Data Stream,ADS)允许将一些元数据嵌入文件或是目录,而不需要修改其原始功能或内容。
在NTFS中,主数据流指的是文件或目录的标准内容,通常对用户可见,而备用数据流(ADS)则隐藏。如果要查看备用数据流,可以使用dir
命令的/R
选项,或是Windows提供的streams.exe
工具,没有可用的API。
ADS没有大小限制且多个数据流可以和一个正常文件关联。ADS的内容也不仅限于text文本数据,基本上只要是二进制格式文件都可以被作为ADS备用流嵌入。
使用备用数据流(ADS)
查阅多篇文章,大致了解了下ADS的命名方式,以及使用ADS的一些方法。
所有的文件在NTFS中至少包含一个主数据流,也就是用户可见的文件或是目录,一个文件在NTFS中真正的文件名称格式:
<文件名>:<流名>:<流种类>
- 文件ADS
默认的数据流没有名字,一个文件test.txt
在NTFS中的全名为test.txt::$DATA,可以在命令行中执行如下命令查看test.txt文件内容:
notepad test.txt::$DATA
也可以用一下命令创建test.txt:
echo "test.txt file content." test.txt::$DATA
对于已经存在的文件test_1.txt
创建备用数据流:
echo "test_1.txt ads data stream" > test_1.txt:test_1.txt_ADS 或
echo "test_1.txt ads data stream" > test_1.txt:test_1.txt_ADS:$DATA
查看ADS数据:
notepad test_1.txt:test_1.txt_ADS 或
notepad test_1.txt:test_1.txt_ADS:$DATA
同样可以使用创建备用数据流的方式顺带新创建一个文件,但是输出的数据被存放于ADS中,新文件则为空:
echo "test_2.txt ads data stream" > test_2.txt:test_2.txt_ADS 或
echo "test_2.txt ads data stream" > test_2.txt:test_2.txt_ADS:$DATA
数据被存储于test_2.txt:test_2.txt_ADS:$DATA
备用流中,而被创建的test_2.txt
则为空。
- 文件夹ADS
文件夹没有默认的数据流(也就是没有主数据流),但是有一个默认的目录流为$INDEX_ALLOCATION,默认的流名为$I30。比如文件夹testDir
全名为testDir:$I30:$INDEX_ALLOCATION,可以使用以下特殊方式进入testDir:
cd testDir:$I30:$INDEX_ALLOCATION 或
cd testDir::$INDEX_ALLOCATION(忽略了流名)
也可以使用以下命令创建目录testDir
md "testDir::$INDEX_ALLOCATION" 或
md "testDir:$I30:$INDEX_ALLOCATION"
经过测试可以为已存在的目录创建ADS,比如testDir
:
echo "i am testDir:testDir_ADS:$DATA data stream" > testDir:testDir_ADS 或
echo "i am testDir:testDir_ADS:$DATA data stream" > testDir:testDir_ADS:$DATA
但是没法正常打开,使用winhex
查看硬盘倒是可以确定数据流的存在。
删除备用流所删除的文件或文件夹时,相应的备用流也会被删除。