这篇文章介绍一下Windows的NTFS文件系统的ADS(alternate data streams,交换数据流)特性;实例演示如何利用ADS将文件隐藏到任何宿主上(宿主可以是文件夹、文件以及磁盘根目录);文章最后将提供两个小工具,利用它们来检测和清除隐藏在宿主上的文件。
文章目录
[*1*].什么是NTFS交换数据流(ADS)
NTFS交换数据流(alternate data streams,简称ADS)是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流,就是说除了主文件流之外还可以有许多非主文件流寄宿在主文件流中。它使用资源派生来维持与文件相关的信息,虽然我们无法看到数据流文件,但是它却是真实存在于我们的系统中的。创建一个数据交换流文件的方法很简单,命令为“宿主文件:准备与宿主文件关联的数据流文件”。
这一段是百度百科上面的内容,大致了解一下即可,后面会有实例演示。
[*2*].NTFS交换数据流隐藏文件实例
这一部分内容在Windows XP、Windows 7、Windows 8的NTFS分区上都能适用,WinXP和Win7、Win8稍有不同,不同的地方会在文中说明。
实验环境:Windows 8
实验分区:E盘根目录-NTFS分区(ADS是NTFS文件系统的特性,不适用于FAT32文件系统)
在我的E盘根目录中有这些文件:
1 |
/*切换到E盘根目录*/ |
2 |
C:\Windows\System32>e: |
3 |
E:\> |
4 |
5 |
/*查看E盘根目录中有哪些内容*/ |
6 |
E:\>dir |
7 |
驱动器 E 中的卷是 Att |
8 |
卷的序列号是 109C-2025 |
9 |
10 |
E:\ 的目录 |
11 |
12 |
2012/12/15 21:03 5 123.txt |
13 |
2012/05/29 20:15 346,112 aaa.exe |
14 |
2012/09/26 07:36 72,294 bbb.jpg |
15 |
2012/01/04 04:10 61,952 lads.exe |
16 |
2012/04/27 10:17 87,424 streams.exe |
17 |
2012/12/15 21:12 test |
18 |
/* |
19 |
* 123.txt 是一个文本文件, |
20 |
* aaa.exe 是一个可执行文件, |
21 |
* bbb.jpg 是一张图片, |
22 |
* lads.exe和streams.exe是用于检测交换数据流的程序,后面会用到, |
23 |
* test是一个空文件夹。 |
24 |
*/ |
实验环境和所有用于实验的文件全部介绍完毕,下面开始实际操作 。
* 如何利用NTFS交换数据流隐藏文本文件
注意,下面的命令需要用“管理员身份”打开一个CMD,否则很可能执行不成功。
1 |
/* |
2 |
* 使用echo命令,将"hello"这几个字符写入到123.txt:222.txt中, |
3 |
* echo命令是以写字符的方式创建了123.txt:222.txt这个交换数据流文件, |
4 |
* 其中123.txt是宿主文件,222.txt是交换数据流文件, |
5 |
* 222.txt在图形界面下是不可见的,就像寄生虫一样,寄生在123.txt上。 |
6 |
*/ |
7 |
E:\> echo hello>>123.txt:222.txt |
8 |
9 |
/* |
10 |
* 使用记事本程序打开这个交换数据流文件, |
11 |
* 打开后可以添加删除222.txt的内容,但是不能另存为。 |
12 |
*/ |
13 |
E:\>notepad 123.txt:222.txt |
14 |
15 |
/* |
16 |
* 将123.txt使用交换数据流的方式寄生到test文件夹上, |
17 |
* type命令和echo命令不同,type命令是将已经存在的一个文件, |
18 |
* 用交换数据流的方式寄生到另外一个文件或文件夹上, |
19 |
* test文件夹是一个空文件夹,寄生123.txt后,文件夹大小显示仍然是0。 |
20 |
*/ |
21 |
E:\>type 123.txt>>test:123.txt |
22 |
23 |
/* |
24 |
* 使用notepad打开这个寄生在test上的文本文件, |
25 |
* 如果命令提示符是在其他盘符,可以使用这个数据流文件的完整路径来打开, |
26 |
* 比如当前盘符在C盘,可以这样打开: |
27 |
* C:\>notepad E:\test:123.txt |
28 |
*/ |
29 |
E:\>notepad test:123.txt |
30 |
31 |
/*将123.txt寄生到E盘根目录*/ |
32 |
E:\>type 123.txt>>E:\:123.txt |
33 |
34 |
/* |
35 |
* 通过相对路径来打开,也可以通过绝对路径来打开, |
36 |
* 命令是"E:\>notepad E:\:123.txt" |
37 |
*/ |
38 |
E:\>notepad :123.txt |
这种方法能很好的将一个文本文件使用交换数据流的形式寄生在另外一个文件上(任何类型的文件上),从一定程度上起到了隐藏文本文件的目的。
* 如何利用NTFS交换数据流隐藏图片文件
图片文件也能寄生在任何类型的文件上,下面给出几个实例:
1 |
/*寄生到123.txt上*/ |
2 |
E:\>type bbb.jpg>>123.txt:bbb.jpg |
3 |
4 |
/*寄生到test文件夹上*/ |
5 |
E:\>type bbb.jpg>>test:bbb.jpg |
6 |
7 |
/*寄生到aaa.exe这个可执行文件上*/ |
8 |
E:\>type bbb.jpg>>aaa.exe:bbb.jpg |
9 |
10 |
/*寄生到E盘根目录*/ |
11 |
E:\>type bbb.jpg>>E:\:bbb.jpg |
12 |
13 |
/* |
14 |
* 打开方式很简单,可以使用系统自带的图画程序mspaint, |
15 |
* 这里打开寄生在可执行文件中的那张图片,其他文件同理。 |
16 |
*/ |
17 |
E:\>mspaint aaa.exe:bbb.jpg |
* 如何利用NTFS交换数据流隐藏可执行文件
WinXP和Win7、Win8在NTFS交换数据流的不同体现在对寄生的可执行文件的运行管理上,XP可以按照和上面相同的方法直接运行寄生的可执行程序;Win7、Win8上需要手动创建一个连接文件,通过这个链接文件才能运行这个寄生的交换数据流文件,下面请看演示:
1 |
/*寄生的方法和图片和文本文件相同,寄生到123.txt*/ |
2 |
E:\>type aaa.exe>>123.txt:aaa.exe |
3 |
4 |
/*寄生到E盘根目录*/ |
5 |
E:\>type aaa.exe>>E:\:aaa.exe |
6 |
7 |
/* |
8 |
* XP中可以直接通过start命令使用绝对路径来调用这个寄生的可执行文件, |
9 |
* 但是在Win7和Win8中会出现下面的错误。 |
10 |
* (Win XP中start命令后面必须接绝对路径) |
11 |
*/ |
12 |
E:\>start E:\:aaa.exe |
13 |
系统找不到文件 E:\:aaa.exe。 |
下面是Win7和Win8中调用这个E盘根目录下的交换数据流可执行文件的方法:
1 |
/* |
2 |
* 在C盘的根目录中创建一个符号链接文件eee.exe, |
3 |
* 链接到E盘根目录中寄生的交换数据流可执行文件aaa.exe上。 |
4 |
*/ |
5 |
E:\>mklink C:\eee.exe E:\:aaa.exe |
6 |
为 C:\eee.exe <> E:\:aaa.exe 创建的符号链接 |
7 |
8 |
/*在命令行下执行这个链接文件,即可运行E:\:aaa.exe*/ |
9 |
E:\>C:\eee.exe |
10 |
11 |
/* |
12 |
* 这个时候大家可以打开任务管理器, |
13 |
* 看到进程列表里面多出一个名称很奇怪的进程":aaa.exe", |
14 |
* 如果我们使用相同的方法运行寄生在文本文件中的那个aaa.exe, |
15 |
* 看到的进程名称就会是"123.txt:aaa.exe"。 |
16 |
*/ |
在WinXP中,可执行文件可以和文本文件一样实现真正的隐藏,这可能也是当时大多数杀毒软件都添加数据流病毒查杀功能的原因;在Win7和Win8中,微软可能出于安全考虑,也可能是其他原因,不允许直接运行交换数据流可执行文件,必须要创建符号链接,默认这个符号链接是可见的(当然可以使用其他手段隐藏这个符号链接),并且这个符号链接创建出来后不能复制到其他地方,只能在创建的那个位置使用命令行方式调用(鼠标双击会报错)。
[*3*].如何检测和清除NTFS-ADS隐藏的文件
上面说了隐藏,现在来说检测,可以使用这两款小工具配合进行检测和清除寄生的交换数据流(百度网盘下载地址),工具都是命令行模式的,请看下面的演示:
1 |
/* |
2 |
* 将这lads.exe这个程序放置需要检测的分区根目录中, |
3 |
* 不添加任何参数直接运行,就是检测根目录中所有文件, |
4 |
* 如果使用"lads.exe test /S",就是递归检测test以及test下所子目录。 |
5 |
* 下面这条命令是检测根目录以及所有子目录。 |
6 |
*/ |
7 |
E:\>lads.exe /S |
8 |
9 |
Scanning directory E:\ with subdirectories |
10 |
11 |
size ADS in file |
12 |
---------- --------------------------------- |
13 |
12 E:\:123.txt |
14 |
346112 E:\:aaa.exe |
15 |
144588 E:\:bbb.jpg |
16 |
7 E:\123.txt:222.txt |
17 |
346112 E:\123.txt:aaa.exe |
18 |
72294 E:\123.txt:bbb.jpg |
19 |
72294 E:\aaa.exe:bbb.jpg |
20 |
12 E:\test\:123.txt |
21 |
72294 E:\test\:bbb.jpg |
22 |
23 |
1053737 bytes in 9 ADS listed |
24 |
25 |
E:\> |
26 |
27 |
/*可以看到我们实验中添加的所有交换数据流一览无遗*/ |
使用streams.exe这个程序来清除这些交换数据流,根据上面检测的输出信息,我将streams.exe放在E盘的根目录:
1 |
/* |
2 |
* 首先尝试清除一下E盘根目录上面寄生的交换数据流, |
3 |
* -d后面接目录。 |
4 |
*/ |
5 |
E:\>streams.exe -d E:\ |
6 |
7 |
E:\: |
8 |
Deleted :123.txt: $DATA |
9 |
/* |
10 |
* 这里出现了一个错误,因为这个:aaa.exe现在正在运行 |
11 |
* 对于这种情况,需要先结束掉这个:aaa.exe进程才能清除。 |
12 |
*/ |
13 |
Error deleting :aaa.exe: $DATA : |
14 |
????? |
15 |
Deleted :bbb.jpg: $DATA |
16 |
17 |
/*可以添加-s参数来一次性递归清除E盘下所有寄生的交换数据流文件*/ |
18 |
E:\>streams.exe -s -d E:\ |
19 |
20 |
E:\123.txt: |
21 |
Deleted :222.txt: $DATA |
22 |
Deleted :aaa.exe: $DATA |
23 |
Deleted :bbb.jpg: $DATA |
24 |
E:\aaa.exe: |
25 |
Deleted :bbb.jpg: $DATA |
26 |
E:\test: |
27 |
Deleted :123.txt: $DATA |
28 |
Deleted :bbb.jpg: $DATA |