Streams 学习笔记(12.2):看见 NTFS 隐藏的备用数据流(ADS)

Streams 学习笔记(12.2):看见 NTFS 隐藏的备用数据流(ADS)

  • [Streams 学习笔记(12.2):看见 NTFS 隐藏的备用数据流(ADS)](#Streams 学习笔记(12.2):看见 NTFS 隐藏的备用数据流(ADS))
    • [一、Streams 是什么?它在 Sysinternals 里负责哪一块?](#一、Streams 是什么?它在 Sysinternals 里负责哪一块?)
    • [二、先搞清概念:NTFS 备用数据流(ADS)是什么?](#二、先搞清概念:NTFS 备用数据流(ADS)是什么?)
    • [三、Streams 基本用法:列出 / 递归扫描 / 删除 ADS](#三、Streams 基本用法:列出 / 递归扫描 / 删除 ADS)
      • [1. 查看单个文件的 ADS](#1. 查看单个文件的 ADS)
      • [2. 递归扫描整个目录树](#2. 递归扫描整个目录树)
      • [3. 删除 ADS(慎用!)](#3. 删除 ADS(慎用!))
    • [四、典型实战场景:为什么你需要 Streams?](#四、典型实战场景:为什么你需要 Streams?)
      • [场景 1:安全告警里经常出现的 Zone.Identifier](#场景 1:安全告警里经常出现的 Zone.Identifier)
      • [场景 2:怀疑有人"藏文件"或数据异常](#场景 2:怀疑有人“藏文件”或数据异常)
      • [场景 3:恶意软件/红队隐藏持久化痕迹](#场景 3:恶意软件/红队隐藏持久化痕迹)
    • [五、Streams 常用参数小抄(适合贴在笔记里)](#五、Streams 常用参数小抄(适合贴在笔记里))
    • 六、搭配其它工具的"组合拳"思路
    • [七、使用 Streams 时的注意事项与经验小结](#七、使用 Streams 时的注意事项与经验小结)
    • [八、总结 & 下一步学习建议](#八、总结 & 下一步学习建议)

Streams 学习笔记(12.2):看见 NTFS 隐藏的备用数据流(ADS)

适用读者:Windows 运维 / 安全 / 取证 / 开发同学,尤其是负责排查"磁盘空间被吃掉但找不到文件"的那种。

你将收获:

  • 搞懂 NTFS 备用数据流(ADS)到底是个啥
  • Streams 工具的核心用法:发现 + 查看 + 删除 ADS
  • 常见安全场景:恶意代码隐藏、Zone.Identifier 等
  • 一套可以直接用在日常巡检/脚本里的命令模板

一、Streams 是什么?它在 Sysinternals 里负责哪一块?

在 Sysinternals 文件工具家族里:

  • Strings:扫文件里的可打印字符串
  • Streams:扫 NTFS 文件系统里的"备用数据流"(Alternate Data Streams, ADS)

简单说:
NTFS 上一个文件可以不仅有一个"内容" ,还可以挂很多"隐藏内容"。

这些隐藏内容就是 备用数据流,默认你在资源管理器里看不到大小变化,也不会单独显示出来。

Streams 的职责就是:

把这些你"看不见"的流,全部列出来,必要时顺手帮你删掉。


二、先搞清概念:NTFS 备用数据流(ADS)是什么?

标准文件我们习惯的名字是这样:

text 复制代码
report.docx

在 NTFS 里,它其实是这样的三段式:

text 复制代码
文件名 : 数据流名 : 类型
report.docx : $DATA

而备用数据流则长这样:

text 复制代码
report.docx:HiddenStream:$DATA

特点:

  • 同一个文件可以有多个数据流
  • 每个数据流本质上都是"一个独立的小文件"
  • 资源管理器默认只统计"主数据流"的大小
  • 绝大多数用户完全意识不到这些流的存在

典型例子:从浏览器下载来的 exe 文件,经常带一个 :Zone.Identifier 流,用来记录这个文件来自 Internet 区域,打开时会弹出安全警告。


三、Streams 基本用法:列出 / 递归扫描 / 删除 ADS

1. 查看单个文件的 ADS

bash 复制代码
streams somefile.exe

示例输出(简化版):

text 复制代码
C:\Tools>streams putty.exe

Streams v1.xx - Enumerate alternate NTFS data streams
Sysinternals - www.sysinternals.com

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

解读:

  • putty.exe 这个文件上挂了一个 Zone.Identifier
  • 大小为 26 字节,用来记录"文件来自互联网"

2. 递归扫描整个目录树

bash 复制代码
streams -s C:\Data

常用套路:

  • 对服务器某个逻辑盘做一次全盘扫描
  • 重点看"不该有 ADS 却有 ADS"的路径(比如某些业务目录)

结合 more/findstr 做简单筛选:

bash 复制代码
streams -s D:\ | findstr /i "Zone.Identifier"

3. 删除 ADS(慎用!)

如果你确认某个流是可以安全删除的,比如想去掉浏览器下载警告:

bash 复制代码
streams -d putty.exe

示例输出(简化):

text 复制代码
C:\putty.exe:
   Deleted :Zone.Identifier:$DATA

此后再双击运行,就不会弹"来自 Internet 的文件安全警告"了。

递归删除某目录下所有 ADS(极度慎重):

bash 复制代码
streams -s -d D:\Downloads

建议做法:

  • streams -s 看清楚有哪些流,导出一份报告
  • 再针对性 -d 删除单个文件或小范围目录
  • 生产环境一定要先在测试环境演练

四、典型实战场景:为什么你需要 Streams?

场景 1:安全告警里经常出现的 Zone.Identifier

很多安全加固文档会提到:

  • Windows 会在从网络下载的文件上加 :Zone.Identifier:$DATA
  • 内容类似:
text 复制代码
[ZoneTransfer]
ZoneId=3

代表这个文件来自"Internet 区域"。某些脚本会批量检查/清理这些流,用于:

  • 部署前清理告警弹窗
  • 检测是否有大批从外网下载但未审计的可执行文件

Streams 可以:

bash 复制代码
streams -s D:\ | findstr /i "Zone.Identifier"

找出所有带标记的文件,便于进一步安全审查。


场景 2:怀疑有人"藏文件"或数据异常

备份、审计或取证时,常见疑惑:

磁盘用量明显升了,但文件总大小对不上。

其中一种可能:有人用 ADS 藏数据,比如:

powershell 复制代码
# 举个例子(PowerShell),往 ADS 写东西:
Set-Content .\readme.txt:secret -Value "top secret"

资源管理器里看 readme.txt 大小完全正常,但真实占用会更大。

Streams 可以一键扫:

bash 复制代码
streams -s C:\ | more

快速确认哪些文件"多出来了"数据流。


场景 3:恶意软件/红队隐藏持久化痕迹

攻击者可能利用 ADS 做:

  • 隐藏恶意脚本(如 good.exe:evil.vbs
  • 用计划任务/服务去调用这些流
  • 普通查杀/巡检极容易漏掉

蓝队或安全运维可以:

  • 对关键目录周期性跑 Streams
  • 将扫描结果归档,对比新增的 ADS 项
  • 一旦发现可疑流名(如 :evil, :payload 等),进一步分析内容

五、Streams 常用参数小抄(适合贴在笔记里)

根据 Sysinternals 官方用法,Streams 的核心参数非常少:

text 复制代码
streams [-s] [-d] <file or directory>

-s   递归扫描子目录
-d   删除扫描到的所有 ADS

一些实践中的组合命令:

bash 复制代码
:: 1)查看某目录下所有 ADS(不递归)
streams D:\Data

:: 2)递归扫描整棵目录树
streams -s D:\Data

:: 3)只删除某个文件上的所有流
streams -d D:\Deploy\app.exe

:: 4)递归删除某目录下所有 ADS(高风险操作)
streams -s -d D:\Downloads

如果你从 GUI 启动 Streams,也可以拖文件/文件夹进去,它会弹出同样的结果窗口,适合临时排查。


六、搭配其它工具的"组合拳"思路

Streams 本身只做一件事:列出/删除 ADS

真正实战中,它通常这样配合使用:

  • 配合 Strings / Hex 编辑器
    • 用 Streams 找流 → 用其它工具打开流内容分析
  • 配合任务计划/服务列表
    • 看看是否有任务引用了 filename:streamname 的路径
  • 配合 Procmon / Sysmon 日志
    • 监控是否有进程频繁访问 ADS,定位可疑操作

可以把 Streams 扫描动作放进你的日常脚本,比如月度安全巡检:

bat 复制代码
@echo off
set OUT=C:\Reports\streams-%DATE:~0,10%.txt

echo ==== Streams Scan on %DATE% %TIME% ==== > "%OUT%"
streams -s C:\ >> "%OUT%"

echo Done. Report: %OUT%

七、使用 Streams 时的注意事项与经验小结

  1. 不要一上来就全盘 -d
    • 很多合法软件也会利用 ADS(比如下载标记、索引信息)
    • 一刀切删除可能影响某些安全提示或兼容性行为
  2. 对生产环境要"先看后动"
    • 先做扫描报告,落地成文档
    • 再与开发/安全团队核对哪些流是正常的
  3. ADS 不是"洪水猛兽",但非常适合被滥用
    • 作为管理员,至少要"看得见"它
    • Streams 就是你打开这扇门的那把小钥匙

八、总结 & 下一步学习建议

这一篇你可以带走三个关键点:

  • NTFS 文件可以挂多个数据流,备用数据流(ADS)默认"隐身"
  • Streams 是枚举/删除 ADS 的轻量级命令行工具,核心参数只有 -s-d
  • 在安全巡检、下载文件审计、疑似"藏数据"场景里,都非常好用

下一步建议:

  • 自己找一个测试目录,用 PowerShell 建几个 ADS,亲手用 Streams 扫描/删除感受一下
  • 配合 Sysinternals 的 Junction / FindLinks / PendMoves 等其它文件工具一起看,会对 "NTFS 的隐藏玩法" 有整体认知

等你把整个第 12 章的工具都按这套方式实战一遍,你看文件系统的视角就会从"二维"升级到"4D IMAX"。

相关推荐
prettyxian2 小时前
【linux】进程概念(1)PCB、系统调用与 proc 目录全解析
linux·运维·服务器
im_AMBER2 小时前
Leetcode 81 【滑动窗口(定长)】
数据结构·笔记·学习·算法·leetcode
霜雪i2 小时前
Linux MD5
linux·服务器
崇山峻岭之间2 小时前
Matlab学习笔记03
笔记·学习·matlab
崇山峻岭之间2 小时前
Matlab学习记录08
开发语言·学习·matlab
小尧嵌入式2 小时前
Linux进程线程与进程间通信
linux·运维·服务器·c语言·开发语言·数据结构·microsoft
山土成旧客2 小时前
【Python学习打卡-Day25】从程序崩溃到优雅处理:掌握Python的异常处理艺术
人工智能·python·学习
Wilber的技术分享3 小时前
【大模型实战笔记 8】深入理解 LangGraph:构建可持久化、多智能体的 LLM 工作流
人工智能·笔记·agent·langgraph·智能体开发
波比:)3 小时前
(概率)波利亚的罐子
笔记·数学