Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #69, СЕНТЯБРЬ 2004 г.

Деструктивные потоки

A.M.D.F. (amdf@mera.net.ru)

Xakep, номер #069, стр. 069-076-4


Для начала надо открыть файл для чтения с помощью функции CreateFile. В параметре dwFlagsAndAttributes надо указать флаг FILE_FLAG_BACKUP_SEMANTICS, что позволит открывать не только файлы, но и каталоги. Затем запускаем цикл while, который считывает информацию о файле в структуру sid, из которой мы будем доставать информацию о каждом потоке. Перед следующим проходом цикла очищаем структуру и сдвигаем указатель файла к следующему потоку с помощью функции BackupSeek. После того как все потоки найдены, мы очищаем lpContext, содержащий служебную информацию, и закрываем файл.

Исходный код программы и собранный бинарник лежат на нашем диске, так что ты без проблем можешь его изучить и переколбасить под себя :). Кстати, для работы с потоками совсем не обязательно писать специальные программы. Некоторые элементарные операции можно выполнять даже при помощи встроенных утилит windows:

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

Создание файла с потоком:

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

Обнаружение

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

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

Вирусы

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

Назад на стр. 069-076-3  Содержание  Вперед на стр. 069-076-5