Как создать альтернативный файловый поток ntfs. Особенности файловой системы NTFS. Сокрытие и запуск приложений

Вы слышали что-нибудь о потоках NTFS ? Весьма интересная функциональность файловой системы, которой можно найти практическое применение. Сегодня поговорим о том, что это и как этим можно пользоваться.

Для начала немного теории .
Поддержка альтернативных потоков данных была добавлена в NTFS для совместимости с файловой системой HFS от Macintosh, которая использовала поток ресурсов для хранения иконок и другой информации о файле. Они присутствуют в NTFS еще с самых ранних версий Windows NT . Суть технологии в том, что у файла на NTFS может быть несколько потоков, содержащих данные. Проводник и большинство популярных файловых менеджеров ограничены работой лишь сглавным потоком (не имеющим имени), представляющим собой основное содержимое файла. Потоки могут использоваться для хранения метаданных файла, таким образом они использовались в Windows 2000 , насколько мне известно.

В Windows 7 альтернативные потоки NTFS , наличествующие у файла, штатными средствами не увидеть. И напрасно: адски хитрые вирусы, например, могут писать себя в потоки какого-нибудь вполне безобидного файла. Удалив файл с потоками, содержащими объёмные данные можно обнаружить, что места освободилось значительно больше, чем занимал файл по мнению Проводника .
Для просмотра имеющихся потоков мы будем пользоваться консольной утилитой , созданной небезызвестным Марком Руссиновичем.

Как создать альтернативный поток NTFS

Некоторые консольные команды позволяют создать и отобразить содержимое потока NTFS , например команда echo может позволить создать альтернативный поток для текстового файла. Чтобы было понятно, как это работает, рассмотрим пример. Введите следующее в командой строке:
echo Hello Happy Bulldozer > hello.txt
echo Hello World > hello.txt:test

А теперь откройте файл hello.txt в Блокноте:

Текст Hello World остался "за кадром", находясь в потоке с именем test . Если указать в имени открываемого файла и имя потока, открыть файл в потоке не получится: двоеточие - недопустимый символ для названия файла. Однако, можно воспользоваться командной строкой, которая несколько лояльней и позволит выполнить вот такую команду:
more < hello.txt:test

Просмотр потоков NTFS , как я писал выше, можно выполнить через утилиту streams.exe
streams.exe hello.txt


Я полагаю, тут всё понятно.

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

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

Стандартный Блокнот будет приписывать расширение txt к имени потока. Если вы хотите использовать его, потоки именовать надо следующим образом:
echo Hello World > hello.txt:test.txt
Тогда выполненная из cmd.exe команда даст положительный результат:
notepad hello.txt:test.txt

Альтернативные потоки NTFS и файлы различных типов

У вас может сложится мнение, что область применения альтернативных потоков NTFS не простирается дальше текстовых файлов. Это не так. В следующем примере я добавил к файлу hello.txt поток, содержащий данные архива 7z:

Отмечу, что потоки можно создавать не только для файлов, но и для папок и даже для разделов жесткого диска.

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

Видимо-невидимо

Читатель блога Виктор не смог запустить скачанный из Интернета скрипт PowerShell. Внимательное чтение моих инструкций позволяло избежать проблемы, но корень ее был вовсе не в строгих политиках безопасности PowerShell.

Виктор скачал из галереи TechNet архив со скриптом PSWindowsUpdate.zip для управления Windows Update, о котором я рассказывал . Однако распакованный скрипт отказывался работать. Когда я подсказал читателю, что в первом пункте моих инструкций говорится о необходимости разблокировать архив, все пошло как по маслу.

Виктор попросил объяснить, почему система заблокировала скрипт, и откуда она знает, что архив был скачан с другого компьютера.

Честно говоря, сегодняшняя тема не нова, но я решил осветить ее в своем блоге по нескольким причинам:

  • Многие статьи написаны еще во времена Windows XP или Windows 7 и не учитывают встроенных возможностей более новых ОС Microsoft.
  • В одной из запланированных на ближайшее время статей эта тема затрагивается, и мне проще сослаться на материал, за актуальность и правильность которого отвечаю я сам.
  • У блога большая аудитория, и для многих читателей эта тема все равно окажется в новинку:)

Сегодня в программе

Потоки данных NTFS

Windows черпает сведения об источнике файла из альтернативного потока данных (alternate data stream, далее ADS) файловой системы NTFS. В свойствах файла она скромно пишет, что он с другого компьютера, но на деле знает чуть больше, как вы увидите дальше.

С точки зрения NTFS, файл – это набор атрибутов . Содержимое файла – это атрибут данных с именем $DATA. Например, текстовый файл со строчкой “Hello, World!” обладает атрибутом данных “Hello, World!”

В NTFS атрибут $DATA является потоком данных и называется основным или безымянным, потому что… не имеет имени. Формально он выглядит так:

$DATA:""

  • $DATA – имя атрибута
  • : – разделитель
  • "" – имя потока (в данном случае имя отсутствует – между кавычками ничего нет)

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

В контексте примеров выше я хочу отметить несколько любопытных моментов.

Невидимые изменения

Создав первой командой текстовый файл, вы можете открыть его в текстовом редакторе и убедиться, что все дальнейшие манипуляции никак не влияют на содержимое файла.

Интересно становится, когда файл открыт, скажем, в Notepad++. Этот редактор умеет предупреждать об изменениях файла. И он сделает это, когда вы запишете в файл альтернативный поток, однако содержимое при этом останется прежним!

Запись и просмотр ADS из CMD

ADS можно создавать и отображать из командной строки. Следующие команды записывают скрытый текст во второй ADS с именем MyStream2, а затем отображают его.

Echo Hidden Text > C:\temp\test.txt:MyStream2 more < C:\temp\test.txt:MyStream2

Просмотр ADS в текстовых редакторах

Тот же Notepad++ покажет вам содержимое ADS, если указать название потока в командной строке

"C:\Program Files (x86)\Notepad++\notepad++.exe" C:\temp\test.txt:MyStream1

Результат:

С блокнотом такой фокус пройдет только в том случае, если в конце имени потока есть .txt . Команды ниже добавляют третий ADS и открывают его в блокноте.

Echo Hidden Text > C:\temp\test.txt:MyStream3.txt notepad C:\temp\test.txt:MyStream3.txt

Результат:

Блокировка скачанных файлов

Давайте вернемся к вопросу, который задал мне читатель. Будет ли файл блокироваться зависит в первую очередь от программы, в которой он был скачан, а во вторую — от параметров ОС. Так, все современные браузеры поддерживают блокировку, и она включена в Windows.

Помните, что когда заблокирован архив, все распакованные файлы будут заблокированы «по наследству». Также не забывайте, что ADS — это функция NTFS, т.е. при сохранении или распаковке архива на FAT32 никакой блокировки не происходит.

Просмотр сведений об источнике заблокированного файла

В PowerShell перейдите в папку со скачанным файлом и посмотрите информацию обо всех потоках.

Get-Item .\PSWindowsUpdate.zip -Stream * FileName: C:\Users\Vadim\Downloads\PSWindowsUpdate.zip Stream Length ------ ------ :$DATA 45730 Zone.Identifier 26

Как вы уже знаете, $Data – это содержимое файла, но в списке фигурирует еще и ADS Zone.Identifier . Это прозрачный намек на то, что файл получен из какой-то зоны. Знаете, откуда эта картинка?

Чтобы выяснить зону, надо прочесть содержимое ADS.

Get-Content .\PSWindowsUpdate.zip -Stream Zone.Identifier ZoneId=3

Очевидно, он нацелен на пакетную разблокировку (например, когда архив уже распакован). Команда ниже разблокирует в папке Downloads все файлы, содержащие в имени PS :

Dir C:\Downloads\*PS* | Unblock-File

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

Как предотвратить блокировку файлов

За блокировку отвечает групповая политика Не хранить сведения о зоне происхождения вложенных файлов . Из названия следует, что блокировка является стандартным поведением Windows, а политика позволяет его изменить.

Однако из названия неочевидно, что политика распространяется не только на почтовые вложения, но и скачанные из Интернета файлы. Подробнее о диспетчере вложений читайте в KB883260 .

В домашних изданиях редактора групповых политик нет, но реестр никто не отменял: SaveZoneInformation.zip .

Другие примеры практического применения ADS

Область применения ADS не ограничивается добавлением зоны скачанного файла, равно как вовсе необязательно хранение в ADS только текста. Любая программа может задействовать эту функцию NTFS для хранения каких угодно данных, поэтому я приведу лишь пару примеров из разных областей.

Инфраструктура классификации файлов

Об авторе

Интересный материал, спасибо. Узнал что-то новое про PowerShell, который мне всё ещё мало знаком:)

Для общения с семьёй чаще использую WhatsApp — пока с этим сервисом было меньше всего проблем, даже родители там освоились. Контактик тоже в основном для семьи, хотя там обмен сообщений в основном вокруг публикуемых альбомов с фото и видео. Некоторые родственники хранят верность Viber — у меня с ним не сложилось как-то, держу просто для них, не оставляя попыток перетащить и их в WhatsApp.

Для работы в основном Slack, когда что-то срочное — WhatsApp, очень срочное — SMS. ВКонтакте для общения по работе с внешним миром.

Skype использую только для видеозвонков, в основном с семьей опять же. С удовольствием заменил бы его на WhatsApp, будь там видеозвонки.

urix

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

Андрей Кузнецов

Материал интересный, спасибо. Я знал про существование потоков, но не знал, что с ними так просто работать через PowerShell.
Что касается IM: К скайпу у меня есть нарекания только по времени запуска на Windows Phone. На ipad и Windows такой проблемы нет. Использую для голосовой связи, когда по каким-то причинам неудобно использовать GSM.
А переписка через Whatsapp. Наличие его только на телефоне скорее плюс, с точки зрения конфиденциальности.

  • Андрей Кузнецов : А переписка через Whatsapp. Наличие его только на телефоне скорее плюс, с точки зрения конфиденциальности.

    Андрей, поясните, в чем тут плюс

Павловский Роман

1. Пользуюсь чаще всего: Skype и Hangouts — по работе на ПК, по остальной переписке «ВКонтакте» с любого устройства, так как клиенты по работе обычно сидят на Скайпе, а друзья и знакомые в Соц.Сетях.

2. Хотел бы пользоваться в идеале: Jabber — для переписки и звонков с любых устройств. Как по мне, клиент можно установить на любое устройство и переписываться, где бы не находился пользователь, даже на слабом Интернет-соединении + к этому можно развернуть свой jabber-сервер и хранить всю переписку на сервере, чтобы потом можно было быстро найти нужную переписку, если клиент не умеет хранить историю, а плагины для звонков через jabber можно будет найти (например, через тот же SIP Asterisk 1.8+)

Андрей Баятаков

Чаще всего пользуюсь WhatsApp (в основном по работе), для звонков (аудио/видео/международные звонки) Skype. Хотя десктопный Skype ужасно бесит (у меня трансформер и дома я им пользуюсь в основном как планшетом)… Viber — не прижился. Чтобы звонить через WhatsApp нужно иметь просто железные нервы. Скажешь что-нибудь собеседнику и ждешь минуту-две когда он тебя услышит (подключение 50Mbit)…
Была бы возможность перешел бы совсем на Skype. На Windows 10 Mobile после недавнего обновления сообщения из Skype приходят прямо во встроенное приложение Сообщения (как СМС), что очень удобно.

Maxim

1. Скрепя сердце пользуюсь ICQ (для заказчиков-ретроградов) и Slack (для более современных).
2. Хотел бы пользоваться Jabber - по тем же причинам, что у Романа Павловского выше.

Владимир Кирюшин

Здравствуйте Вадим!
Прочитал перед этой статьёй вашу статью про то, как прочитать отчёт проверки всего системного диска командой chkdsk . Отличная статья! Благодаря ей сегодня после поверки командой chkdsk системного диска я получил текстовый файл отчёта. А эта статья тоже много чего проясняет в программе PowerShell. Кое-что мне пенсионеру бывает непонятно, но я стараюсь не паниковать и читаю усердно до конца. Спасибо вам за учёбу,которую вы с нами проводите! Всего Вам хорошего!

Lecron

Какие браузеры и программы-даунлоадеры создают этот поток?

Какие еще есть варианты использования потоков самим пользователем? И в частности, пользователем скриптописателем? Так как, хоть и знал про них давно, ни разу не использовал. При реальной работе с компом про них просто не вспоминаешь, и из-за этого, возможно городишь костыли, вместо удобного инструмента, а без этой работы, по памяти, ничего придумать не получается.
Сообразил только об одном варианте. Комментарий к файлу, если нет возможности или желания писать длинный текст в имя файла. Но для этого нужна поддержка со стороны файл менеджера, который раньше, да и сейчас, пишет их в descript.ion или files.bbs.

Speed Guru

Очередная мусорная технология наподобие USN журнала. Много ли вам будет пользы от ZoneIdentifier или от вируса, прикреплённого к фалу или папке? Конечно нет. Более того — это захламление системы лишними, ни коим образом не нужными нормальному пользователю «подфайлами». Каждое лишнее чтение в каталоге MFT и прочие операции, сопутствующие обслуживанию и содержанию альтернативных потоков, это лишние затраченные циклы процессора, оперативной памяти, а самое главное лишняя нагрузка на жёсткий диск.
Вы можете сказать мне что эта технология очень нужна системе. Но это чушь — система отлично работала бы и без потоков. Но пользователя никто не спрашивает — впарили (как USN журнал) и возможности полностью отключить ведение этих потоков не дали. А ведь мне как пользователи они вовсе не нужны, думаю как и вам…
Всё что мы можем сделать это «streams -s -d %systemdrive%». Но и это не даёт возможности удалить потоки на системном разделе.

Alexiz Kadev

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

Жаль в голосовалке нельзя было выделить несколько мессенджеров: я пользуюсь несколькими, поскольку некоторые мои контакты предпочитают какие-то определённые. Так, я использую WhatsUp, ICQ(правда, конечно, не родной клиент),Skype, SkypeforBusiness (тихий ужас, а не клиент, впрочем когда он назывался Lync был ещё хуже) и Viber (вот тут спама больше чем в других как минимум раз в 5).
А в идеале использовать какой-то один, типа Миранды с плагинами, поскольку найти в случае необходимости, кто где когда что-то говорил/писал во всей этой куче просто нереально. Но увы, ряд производителей закрывают свои протоколы и оберегают их как Кащей свою иголку.

  • VSh

    Vadim Sterkin : Роман, я не включил Jabber в опрос. Решил, что им мало кто пользуется и перспектив нет.

    Зря
    Я, например, использую OpenFire (freeware xmpp) как офисный коммуникатор на нескольких доменах.

    Поэтому у меня основной это XMPP (Pidgin.exe, Spark.exe), но 99.8% из этих сообщений — внутридоменные.
    Skype — для внешних IM
    WhatsApp и Viber — для «случайных связей», последние n месяцев только СПАМ, думаю — не удалить ли?

  • Артем

    У меня все почему-то в вайбере. И качество связи вполне устраивает. А так телеграмм бы. Да пусто там.

    hazet

    1. Skype (на ПК) и Viber (на Мобиле). Причины в основном как и у большинства — количество имеющихся контактов и естественно нежелание этих самых контактов, пересесть на другой мессенджер.
    2.uTox. Миниатюрный, ничего лишнего, клиент для Win, Linux, Mac и Android. Позиционируется как защищенный.
    P.S. ЩаЗ займусь перетягиванием своих контактов на него поплотней:-)

    Евгений Карелов

    Cпасибо Вам за Вашу работу!

    Касательно опроса, на ПК для переписки использую QIP 2012, к которому подключены контакты ICQ, ВКонтакте и другие. Лично мне удобно, использовать для общения по нескольким протоколам одну программу. Да и возможность просматривать ленты соцсетей из одного места очень радует. В идеале, не хватает только поддержки Skype, который я использую для голосовой связи, но она явно не появится.
    Хотя эта программа и выглядит «заброшенной», ибо обновлений уже давно не было, возложенные функции выполняет прекрасно.

    strafer

    Интересная мешанина из темы поста про потоки данных и опроса по IM.

    По опросу: Jabber/Jabber, который вы таки зря не включили в список, хотя там есть вотсап, основанный на XMPP, и даже идущая к успеху асечька.

    Jabber в общем-то решает все указанные проблемы ввиду открытости протокола, наличия клиентов под множество платформ и наличия серверов, которые можно поднимать самостоятельно. Но кактусы жевать традиционнее, да.

    • В списке клиенты, а не протоколы.
      ICQ… ну, я не стал там смайлики ставить, ибо должно быть и так понятно.
      Jabber точно не решает одну проблему — там никого нет.

      • strafer

        Vadim Sterkin : В списке клиенты, а не протоколы.

        Из-за того, что протокол и исходные коды официального клиента закрыты, устанавливается закономерная тождественность между единственным клиентом и протоколом.

        Vadim Sterkin : ICQ… ну, я не стал там смайлики ставить, ибо должно быть и так понятно.

        Гнилой мейлрушечке недостаточно того, что асечька умирает естественной смертью - они ещё и дополнительные усилия прилагают, чтобы она быстрее загнулась.

        Vadim Sterkin : Jabber точно не решает одну проблему - там никого нет.

        Тем не менее для Telegram вы же сами написали

        выглядит здорово, но там пусто (что поправимо)

        Jabber имел все шансы стать тем же, чем сегодня является экосистема e-mail (полная открытость протокола, возможность поднимать свои сервера кому угодно и обеспечивать взаимодействие между серверами и т.д.), но корпорациям это не нужно, что отлично видно на примере отхода от него гугла или проприентизирования вотсапа.

        • Для Telegram — поправимо, для Jabber — очень маловероятно. Поэтому первый есть в списке, а второго — нет.

          • strafer

            Конечно, Telegram - стильно, модно, молодёжно, а Jabber никто прикольный вроде Паши Дурова не двигает. Какие уж тут перспективы.

            Гм… да вылезите вы уже из своего танка теорий заговора «весь мир против свободного ПО». Все намного проще

            Если непонятно, так выглядит для человека первый опыт взаимодействия с официально рекомендуемым клиентом Jabber на самой распространенной мобильной платформе.

            strafer

          • Немного не понял, где в моём комментарии про заговор.

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

            А что я должен увидеть на скриншоте?

            Предложение ввести номер телефона ~~~O~

          • strafer

            strafer : Вы пытаетесь списать неудачи jabber на немодность и немолодежность

            Ну так если оно так.

            strafer : в то время как его клиенты с первого экрана не приспособлены для современной реальности.

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

            Собственно я отказался от асечьки, несмотря на несколько оставшихся там контактов, именно по этой причине - мейрушечка в ультимативной форме потребовала привязать номер телефона к учётке, вследствие чего была послана по известным координатам.

            Да, не понимаете, даже после объяснений с картинками… Это не мода, это единственный способ максимально упростить регистрацию с мобильных устройств, составляющих основу аудитории современных мессенджеров и единственный источник для ее роста.

            strafer

            На скриншоте запрос на имя, пароль и опциональный ник. Куда сильнее упрощать-то? Или кроме учащихся коррекционных школ уже не осталось больше резервов для роста аудитории, и надо чтоб была одна кнопка «сделать за*сь»?
            Зачем тут вообще номер телефона и что мессенджер должен с номером телефона делать?

  • Поддержка альтернативных потоков данных (AltDS) была добавлена в NTFS для совместимости с файловой системой HFS от Macintosh, которая использовала поток ресурсов для хранения иконок и другой информации о файле. Использование AltDS скрыто от пользователя и не доступно обычными средствами. Проводник и другие приложения работают со стандартным потоком и не могут читать данные из альтернативных. С помощью AltDS можно легко скрывать данные, которые не могут быть обнаружены стандартными проверками системы. Эта статья даст основную информацию о работе и определении AltDS.

    Создание AltDS

    Создать AltDS очень легко. Для этого воспользуемся командной строкой. Для начала создадим базовый файл, к которому будем прикреплять наши потоки.
    C:\>echo Just a plan text file>sample.txt

    C:\>type sample.txt
    Just a plan text file


    Далее мы воспользуемся двоеточием в качестве оператора, чтоб указать на то что будем использовать AltDS:
    C:\\>echo You can"t see me>sample.txt:secret.txt

    Для просмотра содержимого можно использовать следующие команды:
    C:\ more < sample.txt:secret.txt

    или
    C:\ notepad sample.txt:secret.txt

    Если все работает хорошо то увидите текст: You can"t see me, а при открытии из проводника данный текст виден не будет.Также AltDS можно прикрепить не только к файлу, но и к папке. Для этого создадим папку и прицепим к ней какой-нибудь текст:
    C:\>md stuff
    C:\>cd stuff
    C:\stuff>echo Hide stuff in stuff>:hide.txt
    C:\stuff>dir
    Volume in drive C has no label.
    Volume Serial Number is 40CC-B506Directory of C:\stuff
    09/28/2004 10:19 AM .
    09/28/2004 10:19 AM

    0 File(s) 0 bytes2 Dir(s) 12,253,208,576 bytes free
    C:\stuff>notepad:hide.txt

    Теперь вы знаете, как блокнотом просмотреть и отредактировать прикрепленный AltDS, а так же как прикреплять его к файлам и папкам.

    Сокрытие и запуск приложений

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

    Далее поместим наше приложение в поток, для примера я использовал notepad.exe:
    C:\WINDOWS>type notepad.exe>test.txt:note.exe

    Теперь убедимся что в нашем файле все также текст:
    C:\WINDOWS>type test.txt
    Test

    А теперь самое интересное, запустим наше спрятанное приложение:
    C:\WINDOWS>start .\test.txt:note.exe
    C:\WINDOWS>

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

    UPD:

    Утилиты по работе с AltDS (список взят из статьи по ссылке выше):

    LADS - List Alternate Data Streams by Frank Heyne
    www.heysoft.de/Frames/f_sw_la_en.htm

    Streams.exe from SysInternals.

    Статья написана для журнала "Хакер" в 2004 году. Она вышла в номере 09/04 (69) под названием "Деструктивные потоки".

    Захватывая очередную NT-систему и устанавливая в нее свой самодельный шпионский софт, необходимо решать проблему хранения собираемой информации на компьютере жертвы. Обычно лог пишется в простой файл в каталоге с большим количеством файлов, например, в system32.

    Возможности NTFS

    Это распространенный, но далеко не лучший способ спрятать информацию на локальном компьютере. Есть шанс, что пользователь заметит лишний, постоянно обновляющийся файл, который вдруг неожиданно появился у него в системном каталоге. Дописывать лог к уже существующему файлу? Для начала надо найти такой файл, добавление к которому информации не испортит его содержимого. А как насчет того, чтобы сохранять инфу в такое место, которое не будет видно ни из проводника, ни из командной строки, ни из любого файлового менеджера? Такую возможность нам предоставляет файловая система NTFS. На обычной домашней персоналке ее редко встретишь, так как большинство пользователей по-прежнему предпочитают FAT32, даже те, кто сидит под XP. Но зато в локальной сети какой-либо фирмы, работающей под Win2k/XP, почти наверняка используется NTFS, потому что эта файловая система предоставляет такие возможности, как назначение прав доступа пользователям, шифрование и компрессию файлов. Кроме того, NTFS гораздо более надежна, чем FAT32. Так что метод сокрытия данных, который я опишу, идеально подходит для промышленного шпионажа. С появлением Longhorn, NTFS имеет шанс обосноваться и на дисках домашних компов, так как грядущая файловая система WinFS, основанная на NTFS, обещает дополнительные возможности по упорядочиванию и поиску информации, которые должны привлечь обычных пользователей.

    Прикрепи к файлу любые данные

    Способ заключается в том, чтобы сохранять данные не в файл, как обычно, а в файловый поток NTFS. Поток можно прикрепить к другому файлу (при этом его размер не меняется, и данные остаются нетронутыми, а значит, утилиты, проверяющие чексуммы файлов, не заметят изменений), к каталогу или к диску. Альтернативные файловые потоки NTFS – это одна из возможностей NTFS, присутствующая в ней еще с самых ранних версий Windows NT. Она заключается в том, что у одного файла может быть несколько потоков, содержащих данные, причем пользователю доступен лишь главный поток, в котором хранится содержимое файла. Нечто похожее есть в файловой системе HFS на Макинтошах. Там потоки (streams) называются разветвлениями (forks). До недавнего времени они использовались как хранилище ресурсов файла или содержали информацию о типе файла. С появлением MacOS X, Apple рекомендовала помещать ресурсы в отдельные файлы, а типы файлов определять по расширениям. Но поддержка разветвлений все равно остается. В Windows потоки обычно используются для хранения какой-либо дополнительной информации о файле. Например, в потоке может содержаться сводка документа. Если система стоит на диске с NTFS, то файл explorer.exe наверняка содержит сводку. В зависимости от содержимого сводки, к файлу могут прикрепляться потоки с именами SummaryInformation, DocumentSummaryInformation и некоторые другие. У себя на компьютере я обнаружил поток с именем $MountMgrRemoteDatabase, прикрепленный к диску C.

    О прикрепленных к файлу потоках юзер может узнать лишь в некоторых случаях, например, при копировании файла с прикрепленным потоком на диск с FAT/FAT32. Эти файловые системы их не поддерживают, поэтому система выдаст запрос на подтверждение потери информации в потоках, указав их названия. Разумеется, такая ситуация никогда не возникнет, если поток прикреплен к диску или к системной папке. Необязательно использовать потоки в шпионских целях. Если ты разработчик shareware программ, то ты вполне можешь использовать потоки для хранения информации о регистрации, количестве дней до истечения срока использования, словом, все то, что должно быть скрыто от пользователя твоей проги.

    Работа с потоками

    В работе с файлами и потоками есть и сходства, и различия. Похожего не так уж много. И файлы, и их потоки создаются и удаляются одними и теми же WinAPI функциями CreateFile и DeleteFile. Чтение и запись реализуются, соответственно, функциями ReadFile и WriteFile. На этом сходства кончаются, дальше идут одни различия. В именах потоков могут содержаться спецсимволы, которые не могут быть частью имени нормального файла: такие как “*”, “?”, “<”, “>” ,“|” и символ кавычки. Вообще, любое имя потока сохраняется в формате Unicode. Еще могут использоваться служебные символы из диапазона 0x01 – 0x20. Нет стандартной функции копирования и переноса потока: MoveFile и CopyFile с потоками не работают. Но никто не мешает написать свои функции. У потоков отсутствуют собственные атрибуты, даты создания и доступа. Они наследуются от файла, к которому прикреплены. Если в самом файле есть какие-либо данные, то их тоже можно представить в виде потока. Имена потоков отображаются как «имя_файла:имя_потока:атрибут». Стандартный атрибут потока, в котором находятся данные, называется $Data. Есть много других атрибутов, имена которых также начинаются со знака “$”. Содержимое файла находится в безымянном потоке (имя_файла::$DATA). С этим свойством файловой системы представлять содержимое файла в виде потока был связан баг в старых версиях Microsoft IIS, когда хакер, который хотел узнать текст какого либо скрипта на уязвимом сервере, просто добавлял к его имени “::$DATA”, и сервер, вместо того чтобы выполнить скрипт, выдавал его исходный код. Работа с потоками похожа на работу с файлами. Взгляни на листинг 1. Это простой пример программы, создающей файл с потоком и записывающей в него информацию. После запуска программы в ее каталоге появится пустой файл «testfile». Увидеть содержимое прикрепленного потока можно, набрав в командной строке «more < testfile:stream». Как видишь, имя потока указывается после имени файла, отделенное от него знаком двоеточия. Самое трудное при работе с потоками – это получить их список для конкретного файла. Стандартной функции нет, и поэтому придется писать ее самому. Напишем небольшую консольную программу, которая бы возвращала список потоков по имени файла. Такая прога есть у ребят из Sysinternals, с открытым кодом, и она работает, но мне не понравился их способ. Они используют вызовы Native API, и поэтому их код большой и трудный для понимания. Мы же напишем свою прогу, которая будет работать из командной строки, с алгоритмом попроще и со стандартными API функциями.

    Получаем список потоков

    Алгоритм основан на применении функции BackupRead. Она предназначена для резервного копирования файлов. Когда делаешь резервную копию файла, важно сохранить как можно больше данных, включая и файловые потоки. Информация берется из структуры WIN32_STREAM_ID. Оттуда можно достать имя потока, его тип и размер. Нам понадобятся только потоки типа BACKUP_ALTERNATE_DATA. Все функции и структуры описаны в заголовочном файле winnt.h. Для начала надо открыть файл для чтения с помощью CreateFile. В параметре dwFlagsAndAttributes надо указать флаг FILE_FLAG_BACKUP_SEMANTICS, что позволит открывать не только файлы, но и каталоги. Затем запускаем цикл while, который считывает информацию о файле в структуру sid, из которой мы будем доставать информацию о каждом потоке. Перед следующим проходом цикла очищаем структуру и сдвигаем указатель файла к следующему потоку с помощью функции BackupSeek. После того как все потоки найдены, очищаем lpContext, содержащий служебную информацию, и закрываем файл. Исходный код программы приведен в листинге 2. Уже скомпилированную прогу ты можешь взять с нашего диска. Для работы с потоками необязательно писать специальные программы. Можно кое-что сделать прямо из командной строки. Несколько примеров приведено на врезке.

    Обнаружение

    Прикрепив поток с информацией к чему-нибудь, до его содержимого трудно добраться, не зная его имени. Если поток прикрепить к логическому тому, то в Windows вообще нет стандартных средств, чтобы его обнаружить. Так как в имени потока могут содержаться символы, недопустимые в именах обычных файлов, это создает дополнительные трудности при попытке узнать содержимое потока, пользуясь командной строкой. Содержимое сводки документа обычно хранится в потоке с названием, которое содержит символ с кодом 0x05. Этот символ можно набрать в консоли (Ctrl+E), но если бы это был символ 0x10 или 0x13 (возврат каретки и перевод строки), то набрать их было бы невозможно. Теоретически ты можешь узнать о прикрепленных потоках случайно, используя некоторый софт, который с большой вероятностью есть на твоем компьютере. В WinRAR есть опция, и если она включена, то ты можешь заметить, что размер небольшого файла, помещенного в архив, не только не уменьшается, а даже увеличивается (за счет того, что данные в потоках тоже помещаются в архив). Это может вызвать подозрения. Программа для отслеживания обращений к файловой системе - FileMonitor от тех же Sysinternals - не делает различий между обращениями к файлам или потокам. Соответственно, внимательное изучение лога обращений к диску подозрительной программы (твоего кейлоггера) выдаст и название потока, куда пишется лог, и имя файла, к которому он прикреплен.

    Вирусы

    В сентябре 2000 года появился первый вирус, использующий для своего распространения альтернативные файловые потоки. W2k.Stream был первым представителем нового типа вирусов - stream companion. Он ищет в своем каталоге файлы.exe, и если находит, то начинает процесс заражения. К файлу прикрепляется дополнительный поток, в который вирус переносит содержимое оригинального файла, а потом копируется тело вируса в основной поток файла. После запуска зараженного файла вирус снова пытается заразить файлы в своем каталоге, а затем запускает программу из дополнительного потока. Действительно, с помощью функции CreateProcess можно запускать процесс из потока. Причем файл с потоком можно спокойно удалить, а процесс останется. Просто сказка для троянов! Несмотря на то, что с момента появления W2K.Stream прошло уже почти четыре года, еще не все антивирусы способны обнаруживать вредоносный код в файловых потоках. Поэтому появление новых червей и вирусов, использующих их, может представлять серьезную опасность.

    Другие вирусы, использующие потоки

    Кроме W2K.Stream, потоки нашли применение и в других вирусах и червях. Первым червем, использовавшим файловые потоки, являлся I-Worm.Potok. Эта зверушка прикрепляет несколько потоков к файлу odbc.ini в каталоге Windows и хранит там скрипты для рассылки себя по почте. Еще одним вирусом является W2k.Team. Описание этих и других подобных вирусов ты можешь найти на сайте http://www.viruslist.com/

    Работа с потоками из консоли

    Создание файла с потоком:
    type nul > somefile.txt:Stream

    Запись в поток:
    echo "Something" >> somefile.txt:Stream

    Чтение из потока:
    more < somefile:Stream

    Копирование содержимого существующего файла в поток:
    type file1.txt >> somefile.txt:Stream

    Копирование содержимого потока в файл:
    more < somefile.txt:Stream >> file2.txt

    Удаление потоков

    Существует мнение о том, что поток можно удалить только вместе с файлом, к которому он прикреплен. Это не так. Если ты знаешь название потока, то ты всегда сможешь удалить его стандартной функцией DeleteFile.

    Листинг 1. Пример создания потока.

    #include int main() { DWORD dwRet; HANDLE hStream = CreateFile("testfile:stream", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, NULL, NULL); WriteFile(hFile, "This is a stream", 17, &dwRet, NULL); CloseHandle(hStream); return 0; }

    Листинг 2. X-Stream: Программа, показывающая список потоков

    #include #include #include #include int _tmain(int argc, _TCHAR *argv) { WIN32_STREAM_ID sid; ZeroMemory(&sid, sizeof(WIN32_STREAM_ID)); DWORD dw1,dw2,dwRead; INT numofstreams = 0; //Буфер для имени потока в формате Unicode WCHAR wszStreamName; LPVOID lpContext = NULL; /* * Открываем файл для чтения с параметром * FILE_FLAG_BACKUP_SEMANTICS, что позволяет нам * открывать не только файлы, но и каталоги с дисками. */ HANDLE hFile = CreateFile(argv,GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL); if (hFile == INVALID_HANDLE_VALUE) {printf("\nError: Could"t open file, directory or disk %s\n",argv); exit(0); } DWORD dwStreamHeaderSize = (LPBYTE)&sid.cStreamName - (LPBYTE)&sid + sid.dwStreamNameSize; printf("\nStreams information for %s:\n",argv); while (BackupRead(hFile, (LPBYTE) &sid, dwStreamHeaderSize, &dwRead, FALSE, TRUE, &lpContext)) { //Если тип потока неверный, значит прерываем цикл if (sid.dwStreamId == BACKUP_INVALID) break; ZeroMemory(&wszStreamName,sizeof(wszStreamName)); //Получаем имя потока if (!BackupRead(hFile, (LPBYTE) wszStreamName, sid.dwStreamNameSize, &dwRead, FALSE, TRUE, &lpContext)) break; if (sid.dwStreamId == BACKUP_DATA || sid.dwStreamId == BACKUP_ALTERNATE_DATA) { numofstreams++; printf("\n\nStream\t\t#%u",numofstreams); switch (sid.dwStreamId) { case BACKUP_DATA: printf("\nName:\t\t::$DATA"); break; case BACKUP_ALTERNATE_DATA: printf("\nName:\t\t%S",wszStreamName); break; } printf("\nSize:\t\t%u\n",sid.Size); } //Перемещаемся к следующему потоку BackupSeek(hFile, sid.Size.LowPart, sid.Size.HighPart, &dw1, &dw2, &lpContext); //Очищаем структуру перед следующим проходом цикла ZeroMemory(&sid,sizeof(sid)); } //Очищаем lpContext, содержащий служебную информацию //для работы функции BackupRead BackupRead(hFile, NULL, NULL, &dwRead, TRUE, FALSE, &lpContext); //Закрываем файл CloseHandle(hFile); return 0; }

    По теме файловых потоков также есть следующее:

    • NTFS Stream Explorer 2.00 Программа для работы с потоками NTFS и

        Большинство пользователей современных операционных систем семейства Windows сталкивались с ситуацией, когда файл справки в формате CHM (Compiled Help Module) открывается лишь частично – можно просматривать только оглавление без содержимого его пунктов:

    Кроме этого, при попытке открыть файл CHM, содержащийся в общей сетевой папке, используя путь в формате UNC (Universal Naming Convention), например \\server\h\help.chm его разделы не отображаются. Другими словами, нормально просматривать файлы.chm можно только в тех случаях, если они не были получены по сети.

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

    Причем, этот же файл, извлеченный из архива который также был загружен из сети Internet, на данном компьютере может открываться без каких-либо проблем. Фактически, вся разница состоит лишь в том, что открываемый файл был создан локально, в процессе разархивирования, а не загружен по сети. Другими словами, Windows имеет возможность определить сетевое происхождение файла, и отреагировать на него с использованием определенных настроек системы безопасности.

    Механизм определения сетевого происхождения файлов.

    В файловой системе NTFS каждый файл (или каталог) представлен как набор отдельных элементов, называемых атрибутами . Такие элементы, как имя файла, параметры безопасности и даже данные - все это атрибуты файла. Каждый атрибут идентифицирован кодом типа атрибута и, необязательно, именем атрибута. Так, например, имя файла содержится в атрибуте Filename , содержимое – в атрибуте DATA , сведения о владельце и правах доступа – в атрибуте Security Descriptor и т.д. Содержимое каждого файла (атрибут $DATA) представляет собой набор потоков , в которых хранятся данные. Для каждого файла или каталога в NTFS существует, как минимум один, основной поток, в котором, собственно и хранятся данные. Однако, кроме основного потока, с файлом или каталогом могут быть связаны и альтернативные (A lternate D ata S tream - ADS), которые также могут содержать некоторые данные, никак не связанные с данными основного потока. Основной поток файла не имеет имени и обозначается как $DATA:"" . Альтернативные же потоки обязательно имеют имя, например - $DATA:"StreamData" - альтернативный поток с именем StreamData

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

    Например, запись в файл test.txt текста командой echo :

    echo Main stream Data > test.txt - записать текст ” Main stream Data” в файл test.txt ,что означает запись в основной неименованный поток.

    Но можно изменить команду:

    echo Alternate stream Data > test.txt:stream1 - записать текст ” Alternate stream Data” в альтернативный поток с именем stream1 файла test.txt

    Теперь можно открыть, например, блокнотом каждый из потоков:

    notepad test.txt - откроется содержимое основного потока с текстом ” Main stream Data”

    notepad test.txt:stream1 - откроется содержимое альтернативного потока с текстом ”Alternate stream Data”

    Альтернативные потоки, будучи невидимыми для стандартных средств работы с объектами файловой системы, тем не менее, очень часто используются для хранения дополнительных сведений о файлах и другой служебной информации. Так, например, при скачивании файлов из Интернет, браузеры добавляют к ним альтернативный поток с именем Zone.Identifier , который можно открыть блокнотом, как и в примере выше

    notepad %USERPROFILE%\Downloads\ChromeSetup.exe:Zone.Identifier - открыть в блокноте альтернативный поток с именем Zone.Identifier ChromeSetup.exe Путь к файлу можно не задавать, предварительно выполнив команду перехода в каталог загружаемых файлов текущего пользователя (при стандартном расположении служебных пользовательских папок):

    cd %USERPROFILE%\Downloads - перейти в каталог загружаемых файлов.

    notepad ChromeSetup.exe:Zone.Identifier - открыть альтернативный поток с именем Zone.Identifier для инсталляционного файла браузера Google Chrome с именем ChromeSetup.exe в текущем каталоге.

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

    - признак секции с описанием зоны передачи данных
    ZoneId=3 - идентификатор зоны.

    Эта информация дает возможность определить происхождение файла по номеру идентификатора ZoneId :

    0 - локальный компьютер (Local).
    1 - местная локальная сеть (Intranet)
    2 - надежные сайты Интернет (Trusted Sites)
    3 - Интернет (Internet)
    4 - опасные сайты (Restricted Sites)

    Такое определение зон, например, соответствует настройкам безопасности обозревателя Internet Explorer:

    В данном случае, можно определить, что файл ChromeSetup.exe был получен из Интернет (идентификатор зоны = 3). При запуске такого файла, будет выдано предупреждение системы безопасности о ненадежном источнике. Аналогичным образом работают средства безопасности приложений Microsoft Office, когда предупреждают об опасности открытия файлов, которые были загружены из Интернет. По этой же причине не открывается содержимое файлов справок в формате CHM – содержимое альтернативного потока позволяет классифицировать их как опасные, независимо от реально существующей или несуществующей опасности.

    Попробуйте изменить тем же блокнотом, значение ZoneId на 0 , что будет соответствовать локальному происхождению файла, и предупреждение системы безопасности исчезнет, как и проблемы с открытием офисных документов или разделов справок в.chm-файлах.

    Аналогичное поведение систем безопасности будет и в тех случаях, если удалить содержимое альтернативного потока (сделать его пустым), или вообще удалить сам альтернативный поток.

    Начиная с Windows 7 для получения перечня альтернативных потоков файлов можно использовать команду DIR с параметром /R :

    dir /r %UserpRofile%\Downloads - отобразить список файлов и альтернативных потоков в каталоге Downloads текущего пользователя.

    Для работы с альтернативными потоками в любой версии ОС Windows можно использовать утилиту streams.exe из состава программного пакета Microsoft Sysinternals Suite . Пакет содержит множество небольших программ для диагностики, оптимизации и администрирования, в том числе, и утилиту, позволяющую восполнить недостатки в работе с альтернативными потоками.

    Формат командной строки:

    streams.exe [-s] [-d]file or directory

    Параметры командной строки:

    -s - обрабатывать подкаталоги.
    -d - удалять альтернативные потоки.
    -nobanner - не отображать стартовый баннер и сведения об авторских правах.

    Примеры использования:

    streams.exe /? - отобразить справку по использованию программы.

    streams myfile.txt - отобразить сведения о потоках файла myfile.txt

    streams –d myfile.txt - удалить альтернативные потоки файла myfile.txt

    streams -d -s D:\Downloads\*.* - удалить альтернативные потоки всех файлов и подкаталогов в каталоге D:\Downloads\

    В операционных системах Windows 8 и более поздних, командная оболочка PowerShell также позволяет работать с альтернативными потоками:

    Get-Item -Path -Path C:\FirefoxSetup.exe -Stream * - отобразить сведения о потоках файла C:\FirefoxSetup.exe.

    Get-Content -Path C:\FirefoxSetup.exe -Stream Zone.Identifier - отобразить содержимое альтернативного потока Zone.Identifier файла C:\FirefoxSetup.exe

    Remove-Item -Path C:\FirefoxSetup.exe -Stream * - удалить все альтернативные потоки, связанные с файлом C:\FirefoxSetup.exe

    Remove-Item -Path C:\FirefoxSetup.exe -Stream Zone.Identifier - удалить альтернативный поток Stream Zone.Identifier , связанный с файлом C:\FirefoxSetup.exe .

    Информация о зонах безопасности широко используется в групповых политиках, и в частности, Диспетчером вложений Windows, выполняющим функции защиты от вредоносного ПО, которое может содержаться в почтовых вложениях или файлах, загруженных из Интернет. На сайте Microsoft размещена подробная статья о способах настройки диспетчера вложений и решения проблем, связанных с ним:
    Описание работы диспетчера вложений, который входит в систему Microsoft Windows.

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