快訊
2026-08-11
Windows教學

一個檔案裡還能藏檔案?NTFS Alternate Data Streams 原理與檢查方法

約 15 分鐘閱讀
廣告

⚡ 站長快讀:核心重點

  • 文章屬性:教學實戰
  • 適用系統:Windows 11 / Windows 10(目標磁碟區必須是 NTFS)
  • 難易度 / 耗時:⭐⭐ / 約 15 分鐘
  • 核心結論:下載檔被 Windows 擋下、檔案顯示 0 KB 卻佔空間,線索都在 NTFS Alternate Data Streams 這條看不見的資料流上;本文教你查出來、讀懂它,並判斷該不該刪。
  • 適用對象:想搞懂下載檔為何被 Windows 封鎖、或需要排查可疑檔案的 Windows 使用者

📌 快速答案

一句話答案:NTFS Alternate Data Streams 是 NTFS 讓單一檔案掛載多條具名資料流的機制,內容不計入檔案顯示大小,用 dir /r 就能列出。


🧰 開始前的準備

  • 系統需求:Windows 10 或 Windows 11,且要檢查的檔案位在 NTFS 磁碟區(微軟官方明載這個機制不適用於 FAT32 格式裝置;exFAT 官方未逐字點名,但同樣沒有具名資料流)
  • 權限需求:查自己的檔案用一般使用者即可;要掃描其他使用者的資料夾才需要系統管理員
  • 需要工具:內建的命令提示字元與 PowerShell 就夠用;進階盤點可再加微軟官方的 Sysinternals Streams 工具
  • 預計耗時:約 15 分鐘
  • 難度門檻:會開命令提示字元、會貼上一行指令就能做

🔍 為什麼你需要這個?

你大概遇過這種狀況:從網路抓一個 PowerShell 腳本回來,執行卻跳出「檔案未經數位簽章,無法載入」;或是打開一份 Excel,上方橫幅直接告訴你巨集已被封鎖。檔案內容你看過沒問題,但 Windows 就是不放行。

多數教學到這裡會叫你「去檔案內容按解除封鎖」。按下去確實有效,但很少有人說清楚那顆按鈕到底改了什麼——它沒有改檔案內容,也沒有改權限,因為 Windows 把「這個檔案來自網際網路」這件事,寫在一條你平常看不到的資料流裡。

那條資料流,就是本文要拆解的 NTFS Alternate Data Streams(下文簡稱 ADS)。搞懂它有三個實際好處:第一,被封鎖的檔案你會知道該查什麼,而不是無腦按解除封鎖;第二,你會看懂為什麼有些檔案「顯示 0 KB 卻確實佔了空間」;第三,把資料藏進 ADS 是已經編號在案的攻擊手法,會列出來是排查可疑檔案最基本的一步。

本文的三個差異化角度先亮在這裡:一是全部以微軟第一級官方文件與 MITRE ATT&CK 為依據,不引用來路不明的示範;二是把三種檢查方式的能力邊界講清楚(哪一種看得到目錄的資料流、哪一種看得到內容、哪一種能遞迴);三是把「該不該刪」寫成可判斷的流程,而不是叫你一律清掉。


🔬 ADS 到底是 NTFS 的哪一層?

先給結論:ADS 不是隱藏檔,也不是加密,它就是 NTFS 檔案結構本身的一部分。

依微軟 Win32 官方文件,在 NTFS 上,資料流(stream)是一串位元組序列,檔案的內容就是寫在資料流裡;除了內容之外,資料流還能承載比屬性與內容更多的資訊,例如搜尋關鍵字、或建立這個檔案的使用者身分。每一條資料流都有自己的配置大小(allocation size)、實際大小(actual size)與有效資料長度(VDL)

廣告

命名規則是理解 ADS 的關鍵。官方文件明載,在 Windows 命令列指定時,一條資料流的完整名稱是 檔名:資料流名稱:資料流型別,例如 myfile.dat:stream1:$DATA。而預設的資料流沒有名字——它的完整寫法是 檔名::$DATA,等同於直接寫 檔名。你平常開啟一個檔案看到的內容,就是這條無名資料流。

寫法實際指向
note.txt預設(無名)資料流,等同 note.txt::$DATA
note.txt::$DATA同上,完整寫法
note.txt:memo:$DATA名為 memo 的具名資料流,即 ADS
note.txt:memo同上的簡寫,命令列可省略型別

三點重點摘要:

  • 型別由 NTFS 決定,使用者無法自創。資料流型別(也稱屬性型別碼)一律以錢字號 $ 開頭,使用者只能開啟既有的 NTFS 型別,不能新增型別。
  • 資料流沒有各自的時間戳記。官方文件寫得很清楚:資料流本身沒有檔案時間;任何一條資料流被更新時,更新的是「整個檔案」的時間。這代表你無法從時間欄位判斷是哪一條資料流被動過。
  • 目錄也能掛 ADS。微軟 Sysinternals Streams 的說明文件特別註明,目錄同樣可以有替代資料流——這一點常被忽略,也是很多只掃檔案的腳本會漏掉的地方。

至於「為什麼檔案總管看不到」,微軟官方在 Streams 工具的說明裡直接示範過:在 NTFS 磁碟區用 echo hello > test:stream 建立一條資料流之後,test 這個檔案的大小會顯示為 0,用任何文字編輯器打開也是空的;要看到內容得改用 more < test:stream,因為 type 指令不接受資料流語法。

順帶一提,NTFS 上另一組「名字很像、能力差很多」的特性是硬連結、Junction 與符號連結,那組是同一份資料多個入口,而 ADS 是同一個入口多份資料,方向剛好相反,別搞混了(細節見站內的符號連結、硬連結與 Junction 差異教學)。


🌐 你每天都在用的 ADS:Zone.Identifier

結論先講:你電腦上絕大多數的 ADS,都是 Windows 自己寫的安全性標記,不是惡意程式。

依微軟 [MS-FSCC] 開放規格文件 5.6.1 節,Zone.Identifier 這個資料流名稱用於儲存 URL 安全性區域(該節原文的主詞寫的是 Windows Internet Explorer),完整形式是 sample.txt:Zone.Identifier:$DATA,而且內容是純文字,長這樣:

廣告
[ZoneTransfer]
ZoneId=3

這就是俗稱的 Mark of the Web(網際網路標記)。ZoneId=3 代表網際網路區域,ZoneId=4 代表限制的網站區域。至於現今是誰在寫這條資料流,微軟的 Office 巨集封鎖文件講得更清楚:當檔案被下載到 Windows 裝置、或從網路共用位置開啟時,Windows 就會替它加上 Mark of the Web。整個 Windows 安全模型有一大塊建在這條資料流上:

  • Office 巨集封鎖:微軟官方文件說明,Office 預設封鎖來自網際網路的 VBA 巨集,判斷依據就是檔案上的 Mark of the Web。官方明載 ZoneId=3(網際網路)的檔案預設被封鎖;ZoneId=4(限制的網站)同屬會被加上標記的區域,依同一判斷邏輯也會被擋。順帶一提,該文件示範的查看方式是用記事本開啟 {檔名}:Zone.Identifier;本文步驟二採用的 PowerShell 寫法,出自微軟 Unblock-File 說明頁的官方範例。
  • PowerShell 執行原則:在 RemoteSigned 原則下,從網路下載且未經數位簽章的腳本會被擋下來,判斷依據同樣是這條資料流。
  • 檔案內容的「解除封鎖」核取方塊:微軟官方文件寫明,Unblock-File Cmdlet 內部所做的事,就是移除 Zone.Identifier 這條替代資料流,而它執行的操作與檔案總管內容對話方塊上的「解除封鎖」按鈕完全相同。

所以「解除封鎖」不是什麼神祕開關,它就是刪掉一條大約幾十個位元組的文字資料流。反過來說,這個標記只活在 NTFS 上——微軟在 Office 巨集封鎖文件裡寫得很直接:Mark of the Web 只適用於存放在 NTFS 檔案系統的檔案,不適用於存到 FAT32 格式裝置的檔案。所以把檔案丟到 FAT32 隨身碟再拷回來,標記就跟著消失;exFAT 官方雖未逐字點名,但它同樣沒有資料流機制,結果可合理預期一致(需要選檔案系統時可參考站內的 FAT32 / NTFS / exFAT 格式化教學)。這個副作用要知道,但不建議拿來當「解除封鎖」的偷吃步,因為你同時也丟掉了這個檔案的來源證據。


🛠️ 實戰步驟:三種檢查方式

⚠️ 本文只教檢視與清除,不教如何利用。 下面第三步涉及刪除資料流,刪除後無法復原;執行前請先確認該資料流不是應用程式正在使用的資料。

停止條件(符合任一請先停手):不確定檔案來源或用途、目標是公司或學校管控的設備而未取得 IT 授權、該檔案是唯一副本且尚未備份、指令輸出與本文描述明顯不符。

NTFS Alternate Data Streams 三種檢查方式能力比較表:dir /r 免安裝但遞迴需加 /s、PowerShell -Stream 可讀出與刪除資料流、Sysinternals Streams 需下載但可遞迴與刪除
依據 Microsoft Learn 官方文件(2026-08-11 查證);非站長實測

步驟一:用 dir /r 掃一眼

最快的方式是命令提示字元。dir 指令的 /r 參數,微軟官方參考文件的說明只有一句:顯示檔案的替代資料流

cd /d C:\Users\你的帳號\Downloads
dir /r

官方參考文件沒有規範輸出版面,實際執行時你會看到:一般檔案照常一行,有 ADS 的檔案則在下方多出縮排的資料流行,列出大小與 檔名:資料流名稱:$DATA 的完整名稱。剛下載的檔案通常會看到 :Zone.Identifier:$DATA

💡 為什麼要這樣做? dir /r 的優點是零安裝、速度快。它本身不往下鑽子資料夾,要遞迴得自己再加上 /s——官方文件說明 /s 會列出指定目錄與所有子目錄中符合的檔案,所以寫成 dir /r /s 就能一路掃下去。它適合「先看一眼這個資料夾有什麼」,大範圍盤點則交給後面的專用工具。

步驟二:用 PowerShell 精準列出與讀取

PowerShell 的 FileSystem 提供者有一個動態參數 -Stream,官方文件說明它用來管理替代資料流,支援的 Cmdlet 包含 Get-ItemGet-ContentSet-ContentAdd-ContentClear-ContentRemove-Item;其中萬用字元只有在 Get-ItemRemove-Item 可以使用

列出單一資料夾內所有檔案的所有資料流(純查詢,不改任何東西):

廣告
# 列出目前資料夾中所有檔案的所有資料流(含預設的 :$DATA)
Get-ChildItem -File | ForEach-Object { Get-Item $_.FullName -Stream * }

只找出被標記為「來自網路」的檔案,這是微軟官方文件給的範例寫法:

# 官方範例:找出帶有 Zone.Identifier 的檔案
Get-Item * -Stream "Zone.Identifier" -ErrorAction SilentlyContinue

直接把那條資料流的內容讀出來看:

# 讀出 Mark of the Web 的實際內容
Get-Content .\setup.exe -Stream Zone.Identifier

你會看到前面提過的 [ZoneTransfer]ZoneId=3這一步是整篇最有價值的地方:多數人只知道檔案被封鎖,卻沒看過封鎖它的那幾行字長什麼樣子。

💡 為什麼要這樣做? 官方文件明載萬用字元只有 Get-ItemRemove-Item 吃得下,所以 -Stream * 是這裡唯一能一次把資料流查齊的寫法;查出來之後,你可以直接比對「檔案本體多大、附掛的資料流多大」。當一個檔案本體只有幾 KB、附掛資料流卻有好幾 MB 時,那就是明確的異常訊號。

步驟三:確認來源後再決定要不要清掉

先判斷、再刪除,順序不要反過來。

如果是你自己下載、來源可信的檔案,而它因為 Mark of the Web 被擋:

# 移除 Zone.Identifier,等同檔案內容中的「解除封鎖」
Unblock-File -Path .\MyScript.ps1

微軟官方對這個 Cmdlet 有兩點提醒值得照抄:使用前請先檢視檔案與其來源,確認開啟是安全的;另外,對一個本來就沒被封鎖的檔案執行它,不會有任何作用,也不會報錯,所以不用怕誤觸。

要處理的是其他具名資料流時,用 Remove-Item 搭配 -Stream:

# 刪除指定的具名資料流(檔案本體不受影響)
Remove-Item -Path .\note.txt -Stream memo

需要整台機器盤點時,才輪到 Sysinternals 的 Streams 工具上場。官方文件寫明它的用法是 streams [-s] [-d] <檔案或目錄>,-s 遞迴子目錄、-d 刪除資料流,支援萬用字元,執行環境為 Windows Vista 以上與 Windows Server 2008 以上。它的參數直接寫明可指定「檔案或目錄」,遞迴與刪除各只要一個旗標,是三種方法裡最適合做大範圍盤點的。

步驟四:驗證結果

刪完再跑一次步驟一或步驟二的查詢指令。以 Unblock-File 為例,成功後 Get-Item -Stream Zone.Identifier 會回報找不到該資料流,而 dir /r 的輸出裡對應的那一行也會消失。腳本執行不再跳未簽章錯誤、Office 不再顯示巨集封鎖橫幅,就是真的生效了。


🛡️ 資安視角:為什麼這件事值得你花 15 分鐘

結論:ADS 濫用不是理論風險,它在 MITRE ATT&CK 有獨立編號。

MITRE ATT&CK 把這類手法收錄為 T1564.004(Hide Artifacts: NTFS File Attributes),條目上標示的戰術是 Stealth(隱匿;此戰術原名 Defense Evasion 防禦規避)(該條目版本 2.0,最後修訂日 2026-05-12)。ATT&CK 的描述是:攻擊者可能把惡意資料或執行檔存放在檔案屬性的中繼資料裡,而不是直接放在檔案內容中,藉此規避部分防禦機制,例如靜態指標掃描工具與防毒軟體。條目中列出的實際案例包含 APT32、Astaroth、PowerDuke、Valak,以及把自身複製到新建檔案 :bin 資料流的 BitPaymer 勒索軟體。

必須把話說清楚,避免誤解:

  • ADS 本身不是漏洞,它是 NTFS 的正常功能,Windows 自己就大量使用它。
  • 資料放進 ADS 不會自動執行。它是藏匿手段,不是執行手段;真正的執行仍需另一個管道觸發。
  • 防守方有明確的偵測切入點。ATT&CK 官方列出的偵測分析(AN1206)涵蓋含冒號語法的檔案建立與修改、相關的核心 API 呼叫,以及使用 -stream 參數的 PowerShell 與 Windows 工具行為。但要把話說準:那是給防守方的偵測建議,不等於任何一款防毒產品的實際能力;ATT&CK 條目本身正是把靜態指標掃描工具與防毒,列為這個手法可能規避的對象。

因此正確的心態是:把列出 ADS 當成排查時的一個檢查項,而不是把它當成防毒替代品。你的第一道防線仍然是即時防護開著的防毒軟體,ADS 檢查是補位,不是主力。


🔙 萬一翻車:回退步驟

資料流刪除後無法復原,以下是三種情境的處理方式。

情境一:誤刪了 Zone.Identifier

影響有限。這條資料流的作用是提醒系統「檔案來自網路」,刪掉之後 Office 巨集封鎖與 PowerShell 執行原則會對該檔案放行。如果你想恢復保護狀態,最乾淨的做法是刪掉本機檔案、從原始來源重新下載一次,Windows 會重新寫上標記。

情境二:誤刪了應用程式在用的具名資料流

部分軟體會把設定或中繼資料寫在自訂資料流。若刪除後該軟體行為異常,先重新開啟或重建該檔案讓軟體重寫;不行的話,從備份還原該檔案。若有系統還原點或陰影複本,可以試著用 Windows 內建的「以前的版本」還原整個檔案(用法見站內的 VSS 陰影複製與檔案歷程記錄說明);至於檔案歷程記錄會不會保留替代資料流,官方文件並未說明,別當成保證。

情境三:批次刪除範圍下錯

streams -s -d 加上萬用字元一次掃過整顆磁碟時,最容易誤傷。動手前先不帶 -d 跑一次,把輸出存成文字檔留底,確認清單無誤再執行刪除;真的誤刪且沒有備份,只能從原始來源重新取得檔案。


💡 總結:進階玩法與底層邏輯

站長我把這件事的重點壓成三句:ADS 是 NTFS 的正常結構,不是漏洞;你電腦上絕大多數 ADS 是 Windows 自己寫的 Zone.Identifier;真正該警覺的訊號是「檔案本體很小、附掛資料流很大」。

三個容易踩的坑,依微軟官方文件整理如下:

  1. 不要用時間戳記推論。官方文件明講資料流沒有自己的檔案時間,任一條被更新都是更新整個檔案的時間,想靠修改時間鎖定「哪條被動過」是行不通的。
  2. 不要只掃檔案。目錄也可以有替代資料流,只跑檔案清單的腳本會系統性漏掉這一塊。
  3. 不要把跨檔案系統複製當成清除手段。丟到 exFAT 再拷回來確實會讓資料流消失,但你同時銷毀了來源證據,排查中的檔案這樣做等於自斷線索。

想再往下走的話,官方文件裡的 FindFirstStreamWFindNextStreamW 這組 Win32 API 就是列舉資料流的正式介面,前面所有工具的底層都繞不開它;而 ::$LOGGED_UTILITY_STREAM 這個型別則是 EFS 加密與交易式 NTFS 實際使用的資料流,有興趣可以從官方的資料流型別對照表接著讀。

本文的機制敘述與指令語意以微軟官方文件與 MITRE ATT&CK 為據,屬第三方資料交叉查證(E3),非站長第一手實測數據;涉及工具適用範圍的比較,文中已逐處標明所依據的官方說明。


❓ 常見問題

Q:Alternate Data Streams 是病毒嗎?我電腦掃出一堆是不是中毒了?

不是。ADS 是 NTFS 的正常功能,而且你掃到的絕大多數會是 Zone.Identifier——那是 Windows 自己替下載檔案寫上的來源標記,每個從瀏覽器下載的檔案幾乎都有。真正需要進一步確認的,是名稱陌生、而且大小明顯偏大的具名資料流。

Q:刪掉 Zone.Identifier 安全嗎?

技術上安全,檔案本體不會受影響,但這等於自己解除了 Windows 的一層保護。微軟官方在 Unblock-File 的說明中明確要求:使用前請先檢視檔案與其來源、確認開啟是安全的。來源不明的檔案,正確做法是不要開,而不是解除封鎖後再開。

Q:為什麼我照做卻查不到任何資料流?

先確認磁碟區是 NTFS。ADS 是 NTFS 的功能,檔案若放在 FAT32 或 exFAT 的隨身碟上,本來就不會有;另外,直接從網路串流開啟、或由某些下載工具寫出的檔案,也不一定會被加上 Mark of the Web。

Q:這些方法在舊版 Windows 也適用嗎?

dir /r 與 PowerShell 的 -Stream 參數在 Windows 10 與 Windows 11 都可用,Unblock-File 自 Windows PowerShell 3.0 起提供。Sysinternals Streams 官方標示的執行環境為 Windows Vista 以上、Windows Server 2008 以上。更舊的系統請以官方文件當下標示為準。


🔗 延伸閱讀


📎 參考資料來源

📖 第一級|廠商官方:

📖 第二級|標準與威脅情報機構:

⚠️ 本文核心事實以第一級為準,第二級為補充。

📅 本文查證戳記:2026-08-11 依據 Windows 11 / Windows 10 之微軟官方文件撰寫,全文為官方文件與權威機構資料交叉查證(E3),非第一手實測。

若你在後續版本遇到步驟失效,歡迎在留言區回報,站長會更新文章。


廣告