Alternate Data Streams (ADS) 介紹

雖然說 NTFS 問世至今已經經過了 10 多年,但是有一個功能卻依舊很少人知道。嗯,或許應該說一般正常使用者很少知道。這個功能叫做 Alternate Data Streams, 簡稱 ADS 。

用白話的方式來說, ADS 允許一個檔案可以挾帶其他的資訊,而這些資訊當初的規劃是為來做為 Metadata 使用。很玄,我也承認。因為在日常的使用中,根本沒有那個應用程式會利用到 ADS 。甚至連微軟自家的檔案瀏覽器都無法顯示這些資料的存在,更別說可以新增或修改了。



為了瞭解此一設計的初衷,我查了一下資料,才發現這並 不是微軟自己的發明,在不少檔案系統都有類似的設計。這類的 Metadata 可以用來儲存顯示檔案的圖示,也可以用來儲存文書檔案的顯示格式,乍聽之下好像還道理的…但是好像也不是那麼有道理。不管如何,ADS 依舊是一個不為一般人知的祕密,也沒有給我們帶來任何的改變。


不過也因為雖然檔案系統支援這樣的功能,但是在絕大多數的應用程式都無法使 用此一功能的情況下,利用 ADS 加以儲存的資料幾乎可以說是隱形的,所以成了用來隱藏不希望別人發現的資料的方法。這樣的隱藏方式雖然不錯,但是有幾個比較大的問題,一個是這樣的隱藏在 支援 ADS 的程式下是沒有任何效果。另外一個就是如果要隱藏一大堆的檔案、甚至於是目錄,這樣的方式並不適合。最嚴重的問題是當原始檔案被刪掉後,這些隱藏資料也會 被一併刪除。所以除非你自己有很好的記性,不然就可能是欲哭無淚了。


一般情況下我們想要隱藏資料,可以選擇像是 Invisible Folders 這類的軟體,不但使用上更為方便,而且效果也較好。那麼,誰適合用 ADS 來隱藏資料呢,或者說必須使用 ADS 來隱藏資料?答案通常是那些不懷好意的分子(例如駭客)。所以病毒可以掛在某個正常檔案的 ADS 內避免被偵測,後門程式也可以,駭客慣用的小工具也可以。不管是哪一類檔案,都是為了避免被輕易發現。雖然通常 Rootkit 也具備有相同的功能,但是 ADS 使用上更為簡單,也不會造成系統任何異常或不穩定的現象,而這些都是駭客會加以考量的要素。


像這種實際使用與原始初衷相差甚遠的例子也不算少見,就像水可載舟、亦可覆舟一樣,好或壞完全取決於使用者的心態。微軟也確實做了一些改變想要避免產生嚴重的危害,但是效果畢竟還是有限。我們來實際看看 ADS 的使用方式。


我針對 ADS 做了基本介紹。在本篇文章中,我將繼續此一話題,並將介紹重點移至如何實際進行 ADS 的相關操作。篇幅有些長,但是因為大多是截圖的關係,所以在閱讀上應該是不會花費太多的時間。


  1. 首先我們建立一個空的目錄(D:\ads),並在此一目錄下進行測試。
    0001 

  2. 我們產生一個一般的文字檔,內容是”Hello World”,大小為16位元組。
    0002
  3. 透過 type 指令確認檔案內容為”Hello World”。
    0003
     
  4. 接下來我們使用下列指令產生 ADS 資料,其中 hello.txt:hidden.txt 表示將名為 hidden.txt 的 ADS 資料附掛在 hello.txt 上。檔案內容為 “I’m Hidden”。
    0004
  5. 檢查一下檔案,雖然時間變了,但是大小卻沒有變
    0005
  6. 查看原始檔案內容,同樣沒有任何變動。
    0006
  7. 使用 type 指令如法炮製,看看 ADS 內容是甚麼。很不幸的,系統顯示找不到這個檔案。難道是指令下錯了?
    0007
  8. 改用記事本試看看,沒有錯誤訊息。
    0008
  9. 筆記本顯示出我們原先輸入的內容,而且注意檔名正是 hello.txt:hidden (最後一個txt的副檔名被記事本自動隱藏了)。由此證明雖然 hello.txt 的檔案大小沒有改變,而且 type 指令也無法顯示,但是我們剛剛輸入的資料確實被儲存在 ADS 中。 事實上,使用其他應用程式也可以看到這個檔案的內容。
    00009
  10. 一個檔案可以擁有多個 ADS 資料,而且不需要同樣的類型。我們將一個執行檔 (calc.exe) 覆掛在 hello.txt 中,原先 hello.txt 已經有另外一個 ADS 資料,名稱為 hidden.txt
    0010
  11. 雖然之前我們曾經使用 dir 指令時無法看到任何有關 ADS 的資訊,但是其實 dir 有一個參數 - /r 可以用來查看 ADS 資訊。透過 dir * /r 指令我們確認 hello.txt 有兩個 ADS 資料。不過很可惜的是, /r 參數在Vista 之前的 Windows 版本是不提供的。
    0014
  12. 我們嘗試直接執行儲存於 ADS 內的檔案,系統出現錯誤訊息。
    0011
  13. 上網查詢,可以找到程式啟動的方式必須透過 start 這個指令,執行後卻同樣出現錯誤。 如果你出現跟我一樣的錯誤,恭喜你,表示你的系統至少不是很舊的系統。
    0017

    0022
  14. 為了證明資料不假,我特定找了一個 Windows 2000 的系統,並將小算盤 (calc.exe) 覆掛在 xcopy.exe 的 ADS (ADS 名稱為 hidden.exe) 中。同樣的,直接執行會出現錯誤,但是使用 start 指令可以正確的呼叫出小算盤。
    0012
  15. 查看執行程序,可以看到 xcopy.exe 在執行中,卻看不到 calc.exe 在執行,可是實際上真正執行的程式是 calc.exe。此為一大問題,表示 ADS 的檔案就算被執行了,也無法從工作管理員中看到,而且不需要使用到 rootkit 的技術
    0013 
  16. 如果你以為只有舊系統才會有這個問題,新系統已經免疫了,先別高興得太早。我們先將一個名為 hfs.exe 的檔案附掛在 calc.exe 的 ADS 之中以備測試。0016
  17. 使用 start 指令依舊失敗,這次我們改用 runas 這個指令來啟動程式。
  18. 0018

    0019
  19. hfs.exe 被正確啟動了,而且是在 Vista SP1 的環境下
    0020
  20. 唯一值得慶幸的是在工作管理員的顯示名稱為 calc.exe:hfs.exe ,而不再僅是 calc.exe
     0021
  21. 當我們嘗試複製包含 ADS 資料的檔案時,ADS 資料也會被一併複製 (只要目的磁碟區也支援 ADS 的功能)。我們看到透過複製的指令 hello2.txt 包含與 hello.txt 相同的 ADS 資料。
    0015 
透過前面的例子,我們看到儲存於 ADS 的資料不但不容易被發現,而且可以被正常的讀取、修改、甚至是執行。雖然微軟也確實做了部分的修正,來避免原先 ADS 可能造成的損害,但是卻不是全面的。以我個人的看法,這樣部分的修改比原先不修改可能還來的更差。原因是這樣會造成更多不一致的現象(尤其是同一個系統內 的不一致),而不一致往往造成使用者的混淆,甚至誤解,因而衍生額外的問題。


除了透過微軟內建的指令外,也有一些第三方的工具可以處理 ADS 的資料。像 Alternate Data Stream Tools for NTFS 這個工具可以掃描並列出系統中所有的 ADS 資料,算是一個很方便的小工具。


轉自 就是資安

2 意見:

  Kenny

2010年12月31日 上午9:21

文中所提的
Alternate Data Stream Tools for NTFS 2.5.0
似乎已不復存在,幾乎所有的連結都會回到這個已經失效的domain
http://www.adstools.net/assets/ADSTools.zip

  Mr.J

2011年1月5日 晚上8:04

搜尋一下其實滿多的 ^^