Что такое альтернативные потоки данных в Windows
Если вы запустите скачанный из интернета файл реестра или скрипт, то неожиданно для себя можете обнаружить, что система блокирует его выполнение. Обратившись за помощью к Google или к более опытному в делах компьютерных другу, вы, наконец, найдете для себя ответ. Оказывается, полученные из интернета файлы могут автоматически блокироваться системой безопасности Windows, и чтобы иметь возможность их запускать, нужно сначала снять блокировку в их свойствах.
Что такое альтернативные потоки данных в Windows
Ну ладно, это понятно, но откуда Windows узнала, что вы скачали файл с интернета? Если честно, тема эта довольно старая, с корнями, уходящими еще в эпоху Windows NT, но поскольку число новых пользователей, ничего об этой версии не ведающих, постоянно растет, считаем нужным времени от времени ее освещать. Другой вопрос, найдете ли вы полученным знаниям практическое применение.
Что, собственно, представляет собой файл? Если говорить максимально доступным языком это контейнер, в котором хранятся некие данные. Возьмем обычный текстовый документ, созданный в блокноте. Пустой текстовый файл — это оболочка, а то, что в него записано — полезное содержимое или контент, отображаемый в текстовом редакторе или вьювере. Но в файл может быть записана и другая информация, которая не отображается в текстовом редакторе, например, метаданные.
Эти дополнительные сведения хранятся в так называемых потоках данных, по-английски Alternate Data Stream или ADS, являющимися свойствами атрибутов, из которых по представлению NTFS состоит любой файл. Атрибуты в NTFS играют примерно ту же роль, что и массивы данных. В свою очередь свойства атрибутов могут быть как основными, так и альтернативными. Вернее, основным может быть только один поток, безымянный, именно в нём хранится полезное содержимое файла.
Так, записанный в текстовый файл текст содержится в основном потоке атрибута $DATA ($dаta:»»). Разобьем его на части. $DATA — это название атрибута, двоеточие — это разделитель, а то, что содержится между прямыми кавычками есть название потока. Поток с пустым именем в NTFS является основным, все остальные именованные потоки — альтернативными. Например, поток $dаta: «Stream1» — альтернативный.
Как записать данные в альтернативный поток? Самый простой способ — воспользоваться командной строкой. Запишем для примера в текстовый файл content.txt, уже содержащий текст «Привет», скрытую строку «Совершенно секретно». Открываем командную строку и выполняем в ней такую команду:echo «Совершенно секретно» > D:content.txt:stream1
Если после выполнения этой команды вы откроете текстовый документ, то обнаружите, что ничего в нём не изменилось.
Но это впечатление обманчиво, файл уже содержит скрытый текст, который вы можете прочитать только в командной строке командой: more < D:content.txt:stream1.
Записать в альтернативный поток можно не только текст, но и любые другие данные, например, исполняемые файлы, так что если когда-нибудь ваш антивирус вдруг найдет в обычном текстовом документе что-то опасное, не удивляйтесь.
А теперь возвратимся к тому, откуда Windows в курсе, что файл был скачан с интернета. А потому, что в процессе его передачи в альтернативной поток Zone.Identifier, хранящий сведения о зоне безопасности, браузером были записаны соответствующие данные. Проверим присутствие альтернативных потоков в полученном из интернета скрипте WUModule.ps1. Открываем командную строку, переходим в ней в каталог с файлом и выполняем команду: dir /r
В результате в консоли будут выведены имена всех файлов в выбранной папке с указанием их размера в байтах и атрибутов, в данном примере $DATA с альтернативными потоками. Как можно видеть из скриншота выше, файл 1.tхt не имеет альтернативных потоков, файл content.tхt содержит альтернативный поток stream1, а файл скрипта WUModule.ps1 включает альтернативный поток Zone.Identifier, указывающий, что файл был получен из некой зоны. Для получения более подробных сведений можно использовать PowerShell. Проверим тот же скрипт.
Запускаем консоль, выполняем команду Get-Item D:/WUModule.ps1 -Stream * и видим, что в файл содержит атрибут $DATA с потоком Zone.Identifier. Уточняем данные командой Get-Content D:/WUModule.ps1 -Stream Zone.Identifier. В результате получаем не только номер зоны безопасности, но и URL-адрес ресурса, с которого был скачан файл. Точно так же можно получить сведения и о других альтернативных потоках. Разница во второй команде лишь в том, что вместо Zone.Identifier нужно указать название потока, которое было получено в ходе выполнения первой команды.