The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

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

Windows Sysinternals 工具組中的 Streams 可以讀取 NTFS 檔案系統中目錄或檔案的「替代資料串流(alternate data streams)」的資料,而這個 streams 真的是個「非常神秘」的東西。

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

C:\>type C:\test.txt
123

或是

C:\>more C:\test.txt
123

而若要寫入或讀取「替代資料串流」的資料就可以利用一個冒號( : )加上一個鍵值(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 的話,裡面的 cat 工具也可以讀取「替代資料串流」資料。

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

 test.txt 內容

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

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

若要查詢出檔案或目錄中是否有「替代資料串流」的資料,就只能靠 Windows Sysinternals 工具組中的 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 .

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

安全性警告視窗

這是因為你透過 IE 線上下載 *.exe 的檔案(例如: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 就不會再有安全性警告的提示了。

相關連結