ЖАНРЫ

Записки исследователя компьютерных вирусов

Касперски Крис

Шрифт:

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

Встречаются и вирусы-спутники, вообще не «дотрагивающиеся» до оригинальных файлов, но во множестве создающие их «двойников» в остальных каталогах. Поклонники чистой командной строки, просматривающие содержимое директорий через Is, могут этого и не заметить, так как команда Is вполне может иметь «двойника», предусмотрительно убирающего свое имя из списка отображаемых файлов.

Не стоит забывать и о том, что создателям вирусов не чуждо элементарное чувство беспечности, и откровенные наименования процедур и/или переменных в стиле «Infected», «Virus», «ZARAZA» – отнюдь не редкость.

Иногда вирусам (особенно полиморфным и зашифрованным) требуется поместить часть программного кода во временный файл, полностью или частично передав ему бразды правления. Тогда в теле скрипта появляется команда chmod+х, присваивающая файлу атрибут исполняемого. Впрочем, не стоит ожидать, что автор вируса окажется столь ленив и наивен, что не предпримет никаких усилий для сокрытия своих намерений. Скорее всего, нам встретится что-то вроде chmod $ attr IFileName.


Таблица 2.1. Сводная таблица наиболее характерных признаков наличия вируса с краткими комментариями



Листинг 2.4. Ключевой фрагмент Perl-вируса UNIX.Demo


Эльфы в заповедном лесу

За всю историю существования UNIX было предложено множество форматов двоичных исполняемых файлов, однако к настоящему моменту в более или менее употребляемом виде сохранились лишь три из них: a.out, COFF и ELF.

Формат a.out (Assembler and link editor OUTput files) – самый простой и наиболее древний из трех перечисленных, появился еще во времена господства PDP-11 и VAX. Он состоит из трех сегментов:.text (сегмента кода), data (сегмента инициализированных данных) и. bss (сегмента неинициализированных данных), – двух таблиц перемещаемых элементов (по одной для сегментов кода и данных), таблицы символов, содержащей адреса экспортируемых/импортируемых функций, и таблицы строк, содержащей имена последних. К настоящему моменту формат a.out считается устаревшим и практически не используется. Краткое, но вполне достаточное для его освоения руководство содержится в man'e Free BSD. Также рекомендуется изучить включаемый файл a.out.h, входящий в комплект поставки любого UNIX-компилятора.

Формат COFF (Common Object File Format) – прямой наследник a.out – представляет собой существенно усовершенствованную и доработанную версию последнего. В нем появилось множество новых секций, изменился формат заголовка (и в том числе появилось поле длины, позволяющее вирусу вклиниваться между заголовком и первой секцией файла), все секции получили возможность проецироваться по любому адресу виртуальной памяти (для вирусов, внедряющихся в начало и/или середину файла, это актуально) и т. д. Формат COFF широко распространен в мире Windows NT (РЕ-файлы представляют собой слегка модифицированный COFF), но в современных UNIX-системах в качестве исполняемых файлов он практически не используется, отдавая дань предпочтения формату ELF, a вот как объективный – идет нарасхват.

Формат ELF (Executable and Linkable Format, хотя не исключено, что формат сначала получил благозвучное название, под которое потом подбиралась соответствующая аббревиатура, – среди UNIX-разработчиков всегда было много толкиенистов) очень похож на COFF и фактически является его разновидностью, спроектированной для обеспечения совместимости с 32– и 64-разрядными архитектурами. В настоящее время – это основной формат исполняемых файлов в системах семейства UNIX. He то чтобы он всех сильно устраивал (та же Free BSD сопротивлялась нашествию Эльфов, как могла, но в версии 3.0 была вынуждена объявить ELF-форматом, используемый по умолчанию, поскольку последние версии популярного компилятора GNU С древних форматов уже не поддерживают), но ELF – это общепризнанный стандарт, с которым приходится считаться, хотим мы того или нет. Поэтому в настоящей главе речь главным образом пойдет о нем. Для эффективной борьбы с вирусами вы должны изучить ELF-формат во всех подробностях. Вот два хороших руководства на эту тему:(«Executable and Linkable Format – Portable Format Specification») и(«Linux Viruses – ELF File Format»).

He секрет, что у операционных систем Windows NT и UNIX много общего, и механизм заражения ELF/COFF/a.out-файлов с высоты птичьего полета ничем не отличается от механизма заражения форматов семейства new-exe. Тем не менее, при всем поверхностном сходстве между ними есть и различия.

 

Существует по меньшей мере три принципиально различных способа заражения файлов, распространяемых в формате a.out:

1. «Поглощение» оригинального файла с последующей его записью в tmp и удалением после завершения выполнения (или «ручная» загрузка файла-жертвы как вариант).

2. Расширение последней секции файла и дозапись своего тела в ее конец.

3. Сжатие части оригинального файла и внедрение своего тела на освободившееся место.

Переход на файлы форматов ELF или COFF добавляет еще четыре:

1. Расширение кодовой секции файла и внедрение своего тела на освободившееся место.

2. Сдвиг кодовой секции вниз с последующей записью своего тела в ее начало.

3. Создание своей собственной секции в начале, середине или конце файла.

4. Внедрение между файлом и заголовком.

Внедрившись в файл, вирус должен перехватить на себя управление, что обычно осуществляется следующими путями:

– созданием собственного заголовка и собственного сегмента кода/данных, перекрывающего уже существующий;

– коррекцией точки входа в заголовке файла-жертвы;

– внедрением в исполняемый код файла-жертвы команды перехода на свое тело;

– модификацией таблицы импорта (в терминологии a.out – таблицы символов) для подмены функций, что особенно актуально для Stealth-вирусов.

Всем этим махинациям (кроме приема с «поглощением») очень трудно остаться незамеченными, и факт заражения в подавляющем большинстве случаев удается определить простым визуальным просмотром дизассемблерного листинга анализируемого файла. Подробнее об этом мы поговорим чуточку позже, а пока обратим свое внимание на механизмы системных вызовов, используемые вирусами для поддержания своей жизнедеятельности.

Для нормального функционирования вирусу необходимы по меньшей мере четыре основных функции для работы с файлами (как то: открытие/закрытие/

чтение/запись файла) и опционально функция поиска файлов на диске/в сети. В противном случае вирус просто не сможет реализовать свои репродуктивные возможности, и это уже не вирус получится, а Троянский Конь!

Существует по меньшей мере три пути для решения этой задачи:

1. Использовать системные функции жертвы (если они у нее, конечно, есть).

2. Дополнить таблицу импорта жертвы всем необходимым.

3. Использовать native-API операционной системы.

Ассемблерные вирусы (а таковых среди UNIX-вирусов подавляющее большинство) разительно отличаются от откомпилированных программ нетипичным для языков высокого уровня лаконичным, но в то же время излишне прямолинейным стилем. Поскольку упаковщики исполняемых файлов в мире UNIX практически не используются, всякая посторонняя «нашлепка» на исполняемый файл с высокой степенью вероятности является троянским компонентом или вирусом.

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

Заражение посредством поглощения файла

Вирусы этого типа пишутся преимущественно начинающими программистами, еще не успевшими освоить азы архитектуры операционной системы, но уже стремящимися кому-то сильно напакостить. Алгоритм заражения в общем виде выглядит так: вирус находит жертву, убеждается, что она еще не заражена и что все необходимые права на модификацию этого файла у него присутствуют. Затем он считывает жертву в память (временный файл) и записывает себя поверх заражаемого файла. Оригинальный файл дописывается в хвост вируса как оверлей либо же помещается в сегмент данных (рис. 2.1, 2.2).

Поделиться с друзьями: