Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

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



Файловые потоки в 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 есть опция <Сохранять потоки NTFS>, и если она включена, то ты можешь заметить, что размер небольшого файла, помещенного в архив, не только не уменьшается, а даже увеличивается (за счет того, что данные в потоках тоже помещаются в архив). Это может вызвать подозрения. Программа для отслеживания обращений к файловой системе - 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/

Файловые потоки на NTFS разделах (Множественные потоки данных)

1. Что это такое, и откуда выросло

Ну не могло же майкрософт усидеть на месте и не подмять под себя еще пользователей Macintosh. а тут они придумали хохму(причем давно), что файл может иметь 2 потока(forks): поток данных и поток ресурсов. в потоке данных хранятся данные файла - этот поток и копируется как единственный при переносе файла с Macintosh на PC. второй поток файла - поток ресурсов, содержащий данные операционной системы – меню, значки, шрифты, в общем, все то, что принято называть ресурсами. вот, а когда WinNT Server обслуживает клиентов Macintosh, и дает им место под хранение файлов... то тут то им и перешли дорогу, нужно чтобы и виндовсовская файловая система поддерживала такие же форматы файлов. ну вот майкрософт и сделало в NTFS...

2. Как этим пользоваться

Как обычно - легко и не принужденно:)

давным давно, когда мы были маленькими, а компутеры большими...шучу. еще во время DOS'a майкрософт придумала полезные вещи для удобства пользователей в командной строке... это такие команды как echo, type, more и перенаправление потоков ввода\вывода. рассмотрим как ими можно пользоваться и причем здесь файловые потоки NTFS

 

команда echo - это эхо... если написать "echo текст", то на экране появится искомая надпись, может и матерная, смотря что вы под словом "текст" подразумеваете

 

more и type - схожи с echo, только выводят содержимое файла на экран, т.е. more 1.txt (type 1.txt) выведут содержимое файла 1.txt на экран

 

ну и последнее... это конечно перенаправление ввода\вывода... тут вообще все просто(особенно, если иногда еще и думать)... это такие 2 маленьких значка из математики < и > (соответственно поток вывода и ввода)

 

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

Вывод надписи на экран:

C:>echo Hello, World!

Hello, World!

 

Тот же пример, но надпись выведится в file а не на экран, при помощи перенаправления стандартного вывода, соответственно на кэран тогда ничего не выведится

C:>echo Hello, World! > file

C:>

 

так же можно отправлять не только в файлы, но и на устройства, вот пример отправки в порт, lpt1(принтер типа)

C:>echo Hello, World! > lpt1

C:>

 

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

C:>more < file

Hello, World!

C:>

 

а теперь самое вкусненькое... тоже самое но с потоками! первый пример соответственно положить в поток(имя потокока через двоеточие)

C:>echo string1 > file:fork1

 

и просмотр из потока

C:>more < file:fork1

string1

 

Копирование содержимого существующего файла в поток:

type file.txt >> file.txt:fork

 

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

more < file.txt:fork >> file2.txt

 

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

 

теперь вернемся к программированию...

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

простенький пример создания потока. #include <windows.h> int main() { DWORD dwRet; HANDLE hStream = CreateFile("file:fork", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, NULL, NULL); WriteFile(hFile, "info in fork", 13, &dwRet, NULL); CloseHandle(hStream); return 0; }

 

Как удалить ADS?

Допустим вам известно, что файл important.exe содержит ADS. Файл очень нужен его потеря нежелательна, а ADS в нем очень опасен. Вам нужно оставить основной поток и удалить ADS. Самый простой способ – копировать файл на FAT раздел и переместить файл обратно. Но мы пойдем трудным путем и допустим что у вас один NTFS. Все. Что нужно сделать:

 

Код

ren important.exe temp.exe

cat temp.exe > important.exe

del temp.exe

 

 

Вышеуказанный метод не работает когда ADS прикреплен к директории. Если Вам нужно удалять, например c:\Windows:harmful.exe без переустановки Windows, Вы могли бы использовать эту хитрость. (Если Вы используете NT 5.x, Вам нужна копия Notepad.exe из NT 4!)

Откройте ADS с помощью блокнота(Notepad):

 

C:\NT4Tools\Notepad.exe c:\Windows:harmful.exe

 

Удалите полностью скрытый поток, закройте notepad. Он спросит о сохранении изменений, ответьте ДА Notpad сообщит Вам, что файл - пустой и, что он удалит его. Жмите ОК. ADS пропал.

 

Можно ли добавить ADS в директорию как и в файл?

Да, это работает аналогичным образом.

 

Задания

  1. Написать пакетный файл, который добавляет поток к текстовому файлу. Пакетный файл должен иметь три параметра: добавляемая строка, имя текстового файла, имя потока
  2. Написать пакетный файл, который просматривает поток в текстовом файле. Пакетный файл должен иметь два параметра: имя текстового файла, имя потока
  3. Написать пакетный файл, который копирует содержимое потока текстового файла в другой поток того же файла. Пакетный файл должен иметь три параметра: имя текстового файла, имя потока-источника, имя потока приёмника

 

 


Дата добавления: 2015-09-29; просмотров: 26 | Нарушение авторских прав




<== предыдущая лекция | следующая лекция ==>
Listening to the Radio News Broadcasts 7 страница | «Фармация» мамандықтарында оқитын бірінші курс студеттеріне математика пәнінен 2-ші семестрдегі емтиханға арналған 360 сұрақтан 1 страница

mybiblioteka.su - 2015-2024 год. (0.016 сек.)