⚡ 站長快讀:核心重點
- 文章屬性:教學實戰
- 適用系統: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-FileCmdlet 內部所做的事,就是移除 Zone.Identifier 這條替代資料流,而它執行的操作與檔案總管內容對話方塊上的「解除封鎖」按鈕完全相同。
所以「解除封鎖」不是什麼神祕開關,它就是刪掉一條大約幾十個位元組的文字資料流。反過來說,這個標記只活在 NTFS 上——微軟在 Office 巨集封鎖文件裡寫得很直接:Mark of the Web 只適用於存放在 NTFS 檔案系統的檔案,不適用於存到 FAT32 格式裝置的檔案。所以把檔案丟到 FAT32 隨身碟再拷回來,標記就跟著消失;exFAT 官方雖未逐字點名,但它同樣沒有資料流機制,結果可合理預期一致(需要選檔案系統時可參考站內的 FAT32 / NTFS / exFAT 格式化教學)。這個副作用要知道,但不建議拿來當「解除封鎖」的偷吃步,因為你同時也丟掉了這個檔案的來源證據。
🛠️ 實戰步驟:三種檢查方式
⚠️ 本文只教檢視與清除,不教如何利用。 下面第三步涉及刪除資料流,刪除後無法復原;執行前請先確認該資料流不是應用程式正在使用的資料。
停止條件(符合任一請先停手):不確定檔案來源或用途、目標是公司或學校管控的設備而未取得 IT 授權、該檔案是唯一副本且尚未備份、指令輸出與本文描述明顯不符。
步驟一:用 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-Item、Get-Content、Set-Content、Add-Content、Clear-Content 與 Remove-Item;其中萬用字元只有在 Get-Item 與 Remove-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-Item與Remove-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;真正該警覺的訊號是「檔案本體很小、附掛資料流很大」。
三個容易踩的坑,依微軟官方文件整理如下:
- 不要用時間戳記推論。官方文件明講資料流沒有自己的檔案時間,任一條被更新都是更新整個檔案的時間,想靠修改時間鎖定「哪條被動過」是行不通的。
- 不要只掃檔案。目錄也可以有替代資料流,只跑檔案清單的腳本會系統性漏掉這一塊。
- 不要把跨檔案系統複製當成清除手段。丟到 exFAT 再拷回來確實會讓資料流消失,但你同時銷毀了來源證據,排查中的檔案這樣做等於自斷線索。
想再往下走的話,官方文件裡的 FindFirstStreamW 與 FindNextStreamW 這組 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 以上。更舊的系統請以官方文件當下標示為準。
🔗 延伸閱讀
- CompactOS 是什麼?壓縮 Windows 系統檔能省多少空間、會不會變慢? — 同樣是 NTFS 層級「看不見但真的有影響」的機制
- Windows 路徑為什麼不能超過 260 個字元?MAX_PATH 的歷史與解法 — 檔案命名與路徑規則的另一個歷史包袱
- NTFS_FILE_SYSTEM(0x24)藍屏怎麼修? — 當 NTFS 本身出問題時的排查路線
- Windows 內建防毒夠用了嗎?Microsoft Defender 設定與實用性完整說明 — 排查 ADS 之前,先確認第一道防線是開著的
📎 參考資料來源
📖 第一級|廠商官方:
- File Streams (Local File Systems) — Microsoft Learn — 2026-08-11 查證
- Streams v1.6 — Sysinternals, Microsoft Learn — 2026-08-11 查證
- [[MS-FSCC] 5.6.1 Zone.Identifier Stream Name — Microsoft Learn](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/6e3f7352-d11c-4d76-8c39-2516a9df36e8) — 2026-08-11 查證
- dir 指令參考 — Microsoft Learn — 2026-08-11 查證
- Unblock-File — Microsoft Learn — 2026-08-11 查證
- about_FileSystem_Provider — Microsoft Learn — 2026-08-11 查證
- Macros from the internet are blocked by default in Office — Microsoft Learn — 2026-08-11 查證
📖 第二級|標準與威脅情報機構:
- MITRE ATT&CK T1564.004 Hide Artifacts: NTFS File Attributes — 2026-08-11 查證
⚠️ 本文核心事實以第一級為準,第二級為補充。
📅 本文查證戳記:2026-08-11 依據 Windows 11 / Windows 10 之微軟官方文件撰寫,全文為官方文件與權威機構資料交叉查證(E3),非第一手實測。
若你在後續版本遇到步驟失效,歡迎在留言區回報,站長會更新文章。