О вирусах и потоках
Внедрение вируса в исполняемый файл — достаточно сложный и мучительней процесс. Как минимум для этого требуется изучить формат PE-файла и освоить десятки API-функций… Такими темпами мы не накодим вируса и за сезон, а хочется поиметь его прямо здесь и сейчас. Но хакеры мы или нет? Файловая система NTFS (основная файловая система Windows XP) содержит такую фичу как "потоки" (stream) они же "атрибуты". Внутри одного файла может существовать несколько независимых потоков данных.
Имя потока отделяется от имени файла знаком ":", например: my_file:stream. Основное тело файла хранится в безымянном потоке, но мы так же можем создавать и свои потоки. Заходим в FAR, давим <Shift-F4>, вводим "xxx:yyy" и скармливаем редактору какое-нибудь восклицание, например: "легализуем гандж!". Выходим из редактора и видим файл "xxx" с нулевой длиной. Как это так с нулевой длинной?! А наше восклицание где?! Жмем <F4> и… ни хрена не видим. Все правильно! Если не указано имя потока, файловая система отображает основной поток, а он у нас пустой. Размер остальных потоков не отображается и чтобы дотянуться до их содержимого имя потока должно быть указано явно. Вводим "more < xxx:yyy" и вот он, наш, гандж.
Будем мыслить так: раз создание дополнительных потоков не изменяет видимых размеров файла, наше пребывание в нем скорее всего останется незамеченным. Конечно, чтобы передать управление на свой поток, необходимо модифицировать основной поток. Контрольная сумма при этом неизбежно изменится, что навряд ли понравится антивирусным сторожам. Ну со сторожами мы еще разберемся, а пока определимся со стратегией внедрения.
Рисунок 1 файловая система NTFS поддерживает несколько потоков в рамках одного файла (рисунок, к сожалению, на китайском – другой найти не удалось, но приблизительная структура понятна и без перевода)