Заметки о Windows и других программных продуктах Microsoft...

Альтернативные потоки данных в NTFS

Альтернативные потоки данных в NTFS

Файловая система NTFS обладает множеством интересных возможностей, одной из которых является наличие альтернативных потоков данных  (Alternate Data Stream, ADS). Суть их в том, что каждый файл в NTFS представляет из себя набор потоков, в которых хранятся данные. По умолчанию все данные находятся в основном потоке, но при необходимости к файлу можно добавлять дополнительные, альтернативные потоки данных.

Примечание. Альтернативные потоки данных в NTFS появились давным-давно, еще в Windows NT. Созданы они были для совместимости с файловой системой HFS, использующейся тогда на MacOS. HFS хранила данные о файле в специальном ресурсном потоке.

Файлы в NTFS поделены на атрибуты, одним из которых является $DATA, или атрибут данных. Потоки же являются дополнительными свойствами атрибута $DATA. По умолчанию существует один, основной поток $DATA:″″. Как видите, он не имеет названия, поэтому зовется неименованным. Также при желании можно создавать дополнительные, именованные потоки, напр. $DATA:″Stream1″. У каждого файла в NTFS может несколько потоков данных, содержащих различные, никак не связанные между собой данные.

Все данные, записываемые в файл, по умолчанию попадают в основной поток данных. Когда мы открываем файл, то видим именно основной поток, альтернативные же потоки скрыты от пользователя и не отображаются с помощью обычных средств. Их нельзя увидеть стандартными способами, хотя некоторые программы умеют читать скрытые в них данные. Также для работы с потоками можно использовать командную строку.

Для примера откроем консоль и с помощью команды echo создадим текстовый файл streams.txt и запишем в него текст:

echo This is main stream>streams.txt

А следующей командой запишем текст в альтернативный поток stream1:

echo This is alternate stream>streams.txt:stream1

Если теперь открыть файл streams.txt в любом текстовом редакторе, то мы увидим только первую запись, текст «This is alternate stream» останется скрытым. Прочитать скрытую в потоке stream1 информацию можно командой:

more <stream.txt:stream1

Альтернативные потоки можно добавлять не только к отдельным файлам, но и к директориям. Для примера добавим альтернативный поток stream2, содержащий текст «Hide stream in Streams», к текущей директории Streams:

echo Hide stream in Streams>:stream2

И выведем поток stream2 следующей командой:

more <:stream2

работа с альтернативными потоками в CMD

 

Содержимое альтернативных потоков можно открывать не только в консоли. К примеру Блокнот (Notepad) тоже умеет обращаться к скрытым в потоках данным, если в имени файла через двоеточие указать имя альтернативного потока. Повторим предыдущий пример, немного изменив название потока на stream1.txt:

echo This is alternate stream>streams.txt:stream1.txt

И откроем альтернативный поток в блокноте  командой:

notepad streams.txt:stream1.txt

содержимое альтернативного потока в Блокноте

 

Примечание. Стандартный Блокнот требует расширение txt в названии потока, иначе он не сможет его открыть. Более продвинутые редакторы, например тот же Notepad++, могут показывать содержимое альтернативного потока вне зависимости от его названия.

Наличие альтернативных потоков у файла никак не отображается в Проводнике и других файловых менеджерах. Для того, чтобы их найти, самый простой способ — это воспользоваться командой dir /R (начиная с Windows Vista), которая показывает все потоки данных, в том числе и альтернативные.

поиск альтернативных потоков с помощью dir

 

Вам может показаться, что применение альтернативных потоков ограничено текстовыми данными. Это совсем не так, и в альтернативных потоках можно хранить абсолютно любую информацию. Для примера создадим файл picture.txt и добавим к нему поток pic1.jpg, в который поместим одноименное изображение:

echo Picture>picture.txt
type pic1.jpg>picture.jpg:pic1.jpg

Таким образом, внешне мы имеем обычный текстовый файл, а для открытия изображения из альтернативного потока в графическом редакторе Paint воспользуемся командой:

mspaint picture.txt:pic1.jpg

изображение в альтернативном потоке

 

Подобным образом можно добавлять к любым типам файлов любые данные — к текстовым файлам добавлять изображения, к медиафайлам добавлять текстовую информацию и т. п. Что интересно, альтернативное содержимое не увеличивает видимый размер файла, к примеру добавив к 1кБ текстовому файлу HD-видео на 30Гб, проводник все равно покажет размер файла 1кБ.

Еще в альтернативные потоки можно прятать исполняемые файлы. К примеру возьмем файл test.txt и добавим приложение Блокнот (notepad.exe) в альтернативный поток note.exe:

type notepad.exe>test.txt:note.exe

А для запуска скрытого блокнота воспользуемся командой:

start .\test.txt:note.exe

Кстати этой возможностью пользуются некоторые вредоносные программы, добавляя исполняемый код в альтернативные потоки NTFS.

Утилита Streams

Для работы с альтернативными потоками существует несколько сторонних утилит, например консольная утилита Streams от Sysinternals. Она может определять наличие альтернативных потоков и удалять их. Утилита не требует установки, достаточно распаковать ее и запустить. Для примера проверим наличие потоков в папке Streams командой:

Streams.exe -s C:\Streams

И удалим альтернативные потоки из файла streams.txt:

Streams.exe -d C:\Streams\streams.txt

утилита Streams.exe от Sysinternals

PowerShell

PowerShell также умеет работать с альтернативными потоками — создавать, обнаруживать, выводить их содержимое и даже удалять. Для примера создадим текстовй файл:

New-Item -Type file -Path C:\Streams\stream.txt

Добавим запись в основной поток:

Set-Content -Path C:\Streams\stream.txt -Value ″Main stream″

И в альтернативный поток с именем Second:

Set-Content -Path C:\Streams\stream.txt -Value ″Second stream″ -Stream Second

Затем выведем содержимое основного

Get-Content -Path C:\Streams\stream.txt

и альтернативного потоков:

Get-Content -Path C:\Streams\stream.txt -Stream Second

альтернативными потоками с помощью PowerShell

 

Для того, чтобы обнаружить наличие альтернативных потоков, можно воспользоваться командой:

Get-Item -Path C:\Streams\stream.txt -Stream *

А удалить лишние потоки можно командой:

Remove-Item -Path C:\Streams\streams.txt -Stream *

поиск и удаление альтернативных потоков в PowerShell

Использование

Альтернативные потоки используется как самой Windows, так и некоторыми программами. К примеру, Internet Explorer делит сеть на 4 зоны безопасности и при загрузке файлов добавляет к ним метки, которые содержат информацию о зоне, из которой они были загружены.

зоны безопасности IE

Метки эти хранятся в альтернативном потоке и представляют из себя число от 0 до 4:

• Интернет (3)
• Местная сеть (1)
• Надежные сайты (2)
• Опасные сайты (4)
• Локальный компьютер (0)

Чтобы убедится в этом, перейдем в папку загрузок, возьмем файл, загруженный из интернета и проверим его на наличие альтернативных потоков. Как видите, в нем присутствует поток с именем Zone.Identifier, в котором есть строка ZoneID=3.

применение альтернативных потоков в IE

 

Это значит, что файл относится к недоверенной зоне Интернет, и при его открытии надо быть осторожным. Некоторые программы, например Word, считывают эти данные при открытии файла и выдают соответствующее предупреждение.

предупреждение word

 

Также инфраструктура классификации файлов (File Classification Infrastracture, FCI) основана на использовании альтернативных потоков. Из сторонних программ альтернативные потоки используют некоторые антивирусные программы, в частности антивирус Касперского хранит в них контрольную сумму, полученную в результате проверки.

Впрочем, применение альтернативных потоков этим не ограничивается, вы сами можете придумать для них любое применение. К примеру, с их помощью можно спрятать от посторонних глаз личную информацию. Файлы, содержащие альтернативные потоки, можно свободно копировать или переносить с диска на диск, все потоки будут скопированы вместе с файлом.

И еще, при использовании альтернативных потоков надо помнить, что они жестко привязаны к файловой системе NTFS. Для того, чтобы использовать их, файлы должны располагаться на дисках с NTFS, соответственно работать с ними можно только из под Windows. Если же переместить файл на любую другую файловую систему, то все потоки кроме основного будут потеряны. Также альтернативные потоки обрезаются при передаче файлов по FTP или при пересылке в качестве почтового вложения.

 
 
Комментарии

Очень полезная статья, беру на заметку. Спасибо!!!

Спасибо. Давно знал но без подробностей. Полезно.

Подскажите пожалуйста! Я когда привязываю .exe к .txt и пытаюсь запустить через start то W7 говорит что не может найти данный файл! Как решить данную проблему?

Действительно, из консоли CMD запускается не всегда. Как вариант, можно попробовать консоль PowerShell, к примеру у меня на семерке команда «start .\test.txt:note.exe» в CMD выдает ошибку, а команда «.\test.txt:note.exe» открывает блокнот.