Строение вирусов

Строение вирусов

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

Распространение

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

Первый тип вирусов можно назвать паразитическим. Он распространяется, присоединяясь к файлам таким образом, что они остаются в рабочем состоянии. В системе MS-DOS для этой цели обычно использовались файлы с расширениями. COM и. EXE. В наши дни список доступных для паразитирования типов файлов увеличился. При этом вовсе не обязательно, чтобы файлы были исполняемыми. Например, макровирусы присоединяются к стандартному шаблону normal.dot, который устанавливается по умолчанию вместе с приложением Microsoft Word.

В данном случае механизм распространения включается при запуске инфицированного файла. Соответственно, если вирус присоединяется к редко используемому файлу, это несколько ограничивает возможности его действия. Однако структура MS-DOS (на основе которой построена операционная система Windows) такова, что некоторые приложения запускаются автоматически при старте операционной системы. Следовательно, вирусу всего лишь требуется инфицировать (случайно или намеренно) одно из таких приложений, и долгая жизнь ему гарантирована.

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

В соответствии с логикой загрузочного процесса вирусы, поражающие загрузочный сектор, делятся на две категории. После включения питания начинается самотестирование системы (Power On Self Test, POST), а затем базовая система ввода/вывода (Basic Input/Output System, BIOS) приступает к инициализации, то есть к проверке загрузочного диска на целостность. В зависимости от конфигурации BIOS проверяться может загрузочная дискета, загрузочный компакт-диск и, наконец, загрузочный жесткий диск.

Жесткий диск является загрузочным при наличии главной загрузочной записи (master boot record, MBR), которая представляет собой небольшой код, расположенный в самом начале жесткого диска (первый сектор первого цилиндра первого диска). Этот код обеспечивает распознавание записей в таблице разделов, описывающей размещение и размер логических дисков в рамках одного устройства. Код главной загрузочной записи ищет раздел, помеченный как загрузочный, и передает управление коду, расположенному в начале раздела (загрузочному сектору). А теперь представим, что произойдет при наличии в этом секторе вируса.

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

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

Но почему это имеет такое значение? Независимо от того, инфицируется ли файл, загрузочный сектор или главная загрузочная запись, как только вредоносный код будет выполнен, вирус сделал свое дело, не так ли? Это верно, но только отчасти. Чем раньше вирус овладевает загрузочным процессом, тем больше его шанс выжить. В мире компьютеров жизнь – это всего лишь наборы фрагментов кода. Запускаемый раньше других код влияет на вид системы для остального программного обеспечения. Поясним это с помощью аналогии, понятной каждому. Представьте себе матрицу: окружающий мир управляется чем-то, расположенным в высшем слое реальности. Соответственно, это что-то определяет, как мир будет выглядеть для нас. Вирус, проникнув в систему, при следующей загрузке начинает действовать. Почему бы не изменить систему так, чтобы можно было просматривать жесткий диск? Вирус может перехватывать вызов главной загрузочной записи (предполагаем, что речь идет о вызове от антивирусной программы) и затем направлять этот вызов к ее реальному местонахождению. В результате антивирусная программа будет считать, что диск не инфицирован. Такая тактика называется маскировкой и часто используется для того, чтобы вирус не был обнаружен.

«Полезная нагрузка»

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

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

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

Прочие уловки

Создатели вирусов и червей потратили много времени, разрабатывая новые способы работы своих творений. Наиболее неприятной уловкой является «эволюция» вируса. Другими словами, время от времени он меняет свою структуру, чтобы обмануть антивирусные программы. Это явление называется полиморфизмом, и его суть состоит в мутации вируса. Можно даже сделать так, чтобы структура вируса полностью менялась от одного воплощения к другому; однако для подобного трюка нужна разветвленная логическая схема, что неизбежно приведет к увеличению размера вируса. Кроме того, вирус со встроенным компилятором намного проще распознать. Впрочем, лучше не переписывать полностью структуру вируса, а менять его отдельные звенья в соответствии с неким случайным ключом. Представим себе вирус, кодирующийся по алгоритму DES (Data Encryption Standard – стандарт шифрования данных). Для его расшифровки применяется известный исходный ключ, а потом вирус снова зашифровывается, но уже с новым ключом. В результате вид вируса изменится.

Но сам по себе код – это еще не все. Ведь для активизации вируса как минимум должно выполниться его декодирование. А принцип работы антивирусных программ основан на просмотре известных механизмов декодирования, которые применяются в вирусах. Программа сообщает об обнаружении объекта, механизм декодирования которого совпадет с найденным в списке. Что остается делать злым гениям, пишущим вирусы? Можно создать механизм декодирования, также способный к мутациям, или же использовать порядок декодирования, встречающийся в других приложениях. Последний способ создает дополнительные проблемы для антивирусной программы, так как ей приходится отличать фальсифицированный механизм от настоящего.

Этот метод не очень надежен, так как основывается на предположении, что пользователю рано или поздно надоест реагировать на ложные срабатывания антивирусной системы и он ее отключит. А вот первый из упомянутых методов весьма интересен. Рассмотрим следующий порядок действий.

1. Вирус выполняется, используя стандартный механизм декодирования.

2. После декодирования вируса запускается на выполнение зашифрованная часть кода. С этого момента выполняемый код теоретически нераспознаваем антивирусной программой.

3. Затем вирус по случайному механизму конструирует алгоритмы кодирования и декодирования. Этот механизм может представлять собой всего лишь оператор, который выбирает между двумя слегка отличными друг от друга операциями, скомбинированными со случайными числами. В итоге из подобных комбинаций могут получиться очень длинные списки.

4. Вирус зашифровывает свою копию с помощью нового алгоритма, полученного в процессе выполнения шага 3.

5. Вместе с новым кодом вирус получает новый алгоритм расшифровки.

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

Данный текст является ознакомительным фрагментом.