|
Файловые потоки в 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 в директорию как и в файл?
Да, это работает аналогичным образом.
Задания
Дата добавления: 2015-09-29; просмотров: 26 | Нарушение авторских прав
<== предыдущая лекция | | | следующая лекция ==> |
Listening to the Radio News Broadcasts 7 страница | | | «Фармация» мамандықтарында оқитын бірінші курс студеттеріне математика пәнінен 2-ші семестрдегі емтиханға арналған 360 сұрақтан 1 страница |