﻿# 介紹好用工具：Streams 讓你瞭解神秘的 NTFS 檔案系統

[Windows Sysinternals](https://learn.microsoft.com/en-us/sysinternals/) 工具組中的 [Streams](https://learn.microsoft.com/en-us/sysinternals/downloads/streams) 可以讀取 [NTFS](http://en.wikipedia.org/wiki/NTFS) 檔案系統中目錄或檔案的「替代資料串流(alternate data streams)」的資料，而這個 streams 真的是個「非常神秘」的東西。

「資料串流(Streams)」這個名稱我想大家一定覺得很抽象，在 NTFS 檔案系統中，目錄與檔案都是以資料串流的方式儲存，而預設的檔案內容就是儲存在「未命名資料串流」中，如果要在命令提示字元下取得「未命名資料串流」的資料，很簡單的就是利用 type 命令將資料取出，例如：

```
C:\>type C:\test.txt123
```

或是

```
C:\>more C:\test.txt123
```

而若要寫入或讀取「替代資料串流」的資料就可以利用一個冒號( : )加上一個鍵值(Key)進行存取。

例如你要寫入一個字串 ( Hello ) 到 C:\\test.txt 檔案的「替代資料串流」中，並將這個「替代資料串流」命名為 **TEST**，就可以用以下語法寫入：

```
echo Hello > C:\test.txt:TEST
```

這樣子就可以將 Hello 字串(包括斷行)儲存到 C:\\test.txt 檔案的「替代資料串流」中，而若你要將這個「替代資料串流」中的資料取出，可以用以下語法：

```
C:\>more < c:\test.txt:TEST
Hello
```

**注意**：你不能使用 type 命令將 C:\\test.txt 檔案中的 :TEST 串流資料取出，因為 type 命令並不支援串流資料(stream)的讀取！若你有安裝 [cygwin](http://www.cygwin.com/) 的話，裡面的 cat 工具也可以讀取「替代資料串流」資料。

「替代資料串流」中的資料就如同「未命名資料串流」中的資料一樣，你想儲存什麼資料都可以，純文字、二進位資料都 OK 的，只是儲存在「替代資料串流」中的資料量大小，在使用檔案總管檢視的時候是不會被計算到的，如下圖示，我的 test.txt 內容有 3 個位元組(bytes)，剛剛透過指令寫入 Hello 字串 + 斷行符號 + NULL 字元，一共 8 個 bytes 被寫入到  test.txt 檔案的 **TEST** 替代資料串流中，照理說這個檔案應該要佔用 11 個位元組(bytes)才對，但是在檔案總管中卻僅僅顯示 3 個位元組(bytes)而已。雖然這裡看不出來，但是磁碟的容量還是實際被佔用 11 個位元組(bytes)的！

 [![test.txt 內容](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ceba13f4a7d6b0a847f7-image_thumb.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/2d894ca192ea6c0a32c4-image_4.png)

但你要如何才能看出你的檔案或目錄中有沒有任何「替代資料串流」的資料呢？預設來說 Windows 內建的所有工具或指令，沒有一個能夠查詢檔案中是否有「替代資料串流」資料。

這時，你是否有種心理涼涼的感覺？我剛瞭解到 streams 這個玩意的時候，覺得很恐怖勒！NTFS 檔案系統中竟然有個如此神秘的地方可以藏資料，而且還不會被發現！這就是為什麼當你在 C:\\ 下按「全選」然後選「內容」計算檔案大小時，怎麼算都跟磁碟機的「已使用空間」不符，雖然這些神秘的資料並不全然都是儲存在「替代資料串流」中，但也有可能有些許資料藏在這裡。

若要查詢出檔案或目錄中是否有「替代資料串流」的資料，就只能靠 [Windows Sysinternals](https://learn.microsoft.com/en-us/sysinternals/) 工具組中的 [Streams](https://learn.microsoft.com/en-us/sysinternals/downloads/streams) 工具幫你檢視了，streams 的用法很簡單，如下：

```
C:\>streams

Streams v1.56 - Enumerate alternate NTFS data streams
Copyright (C) 1999-2007 Mark Russinovich
Sysinternals - www.sysinternals.com

usage: streams [-s] [-d] <file or directory>
-s     Recurse subdirectories
-d     Delete streams
```

當我們用 streams 工具查詢剛剛的 C:\\test.txt 檔案時，就會查到該檔案中所有「替代資料串流」的所有鍵值：

```
C:\>streams test.txt

Streams v1.56 - Enumerate alternate NTFS data streams
Copyright (C) 1999-2007 Mark Russinovich
Sysinternals - www.sysinternals.com

C:\test.txt:
            :TEST:$DATA 8
```

你也可以利用 -s 參數掃瞄整個磁碟機中所有的目錄與檔案，看看到底有多少檔案或目錄有「替代資料串流」資料：

```
C:\>streams -s .
```

最後，我再分享一個小經驗，大部分人應該都曾經看過以下的安全性警告視窗吧：

![安全性警告視窗](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ec1ffbe5b5514f662208-image_3.png)

這是因為你透過 IE 線上下載 \*.exe 的檔案（例如：[putty.exe](http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe)），IE 在開啟或儲存檔案的時候，就會幫你多加上一個「替代資料串流」資料，並且會將「替代資料串流」的鍵值取名為 Zone.Identifier，如下：

```
C:\>streams putty.exe

Streams v1.56 - Enumerate alternate NTFS data streams
Copyright (C) 1999-2007 Mark Russinovich
Sysinternals - www.sysinternals.com

C:\putty.exe:
   :Zone.Identifier:$DATA       26
```

若你將這個鍵值的內容取出，會發現以下資料：

```
C:\>more < putty.exe:Zone.Identifier
[ZoneTransfer]
ZoneId=3
```

而當你透過 streams.exe 工具用 -d 指令將 putty.exe 檔案的「替代資料串流」資料刪除後，就不會再出現這個畫面了。

```
C:\>streams -d putty.exe

Streams v1.56 - Enumerate alternate NTFS data streams
Copyright (C) 1999-2007 Mark Russinovich
Sysinternals - www.sysinternals.com

C:\putty.exe:
   Deleted :Zone.Identifier:$DATA
```

等一段時間後（大約幾十秒吧），你再透過檔案總管或捷徑啟動 putty.exe 就不會再有安全性警告的提示了。

**相關連結**

-   [Streams v1.6](https://learn.microsoft.com/en-us/sysinternals/downloads/streams?WT.mc_id=DT-MVP-4015686) - Sysinternals
-   [LADS - List Alternate Data Streams by Frank Heyne](https://www.aldeid.com/wiki/LADS)
-   [Practical Guide to Alternative Data Streams in NTFS](http://www.irongeek.com/i.php?page=security/altds)
-   [Accessing alternative data-streams of files on an NTFS volume](http://www.codeproject.com/KB/cs/ntfsstreams.aspx)
-   [Fork (filesystem)](http://en.wikipedia.org/wiki/Fork_\(filesystem\)) - Wikipedia
-   [NTFS](http://en.wikipedia.org/wiki/NTFS) - Wikipedia
