<<
>>

Программы поиска вирусов

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

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

У многих антивирусных компаний есть веб-сайт, с которого клиенты могут скачать описания недавно обнаруженных вирусов в свои базы данных. Если у пользователя 10 000 файлов и база данных содержит сведения о 10 000 вирусов, то, конечно же, для быстрой работы требуется создать толковую программу.

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

Как вы думаете, что сделает пользователь, получив следующее сообщение: «Внимание! В файле xyz.exe может содержаться вирус lahore-9x. Удалить?».

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

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

Другим способом обнаружения антивирусной программой зараженного файла является запись и сохранение на диске длины всех файлов. Если файл стал длиннее со времени последней проверки, то он может быть заражен. Эта ситуация показана на рис. 9.28, а и б. Но хорошо продуманный вирус может избежать обнаружения, сжимая программу и приводя файл к его исходному размеру. Чтобы эта схема работала, вирус должен содержать процедуры сжатия и распаковки, показанные на (рис. 9.28, в). Другой способ, позволяющий вирусу избежать обнаружения, заключается в изменении его внешнего вида на диске, чтобы он не был похож на имеющийся в базе данных.

Один из путей достижения этой цели — самошифрование с разными ключами для каждого зараженного файла. Перед изготовлением новой копии вирус генерирует случайный 32-разрядный ключ шифрования, к примеру, применяя операцию исключающего ИЛИ (XOR) к показаниям текущего времени с содержимым, скажем, слов памяти по адресам 72 008 и 319 992. Затем он проводит пословную операцию XOR над своим кодом, применяя этот ключ для получения зашифрованного вируса, хранящегося в зараженном файле (рис. 9.28, г). Этот ключ хранится в файле. С точки зрения секретности хранение ключа в файле не является идеальным решением, но здесь ставится цель помешать работе сканера вирусов, а не препятствовать специалистам антивирусной лаборатории получить код вируса путем обратной операции. Разумеется, чтобы запуститься, вирус сначала должен сам себя расшифровать, поэтому ему нужно, чтобы в файле присутствовала и функция дешифрования.

Эта схема еще далека от совершенства, поскольку во всех копиях будут присутствовать аналогичные процедуры сжатия, распаковки, шифрования, расшифровки и антивирус-

Рис. 9.28. Программа: а — незараженная; б — зараженная; в — сжатая зараженная; г — зашифрованный вирус; д — зашифрованный вирус с зашифрованным кодом сжатия

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

Но последнее слово за Вирджилом, поэтому он делает следующее.

Предположим, что процедуре расшифровки необходимо произвести вычисление

X = (A + B + C - 4).

Простой ассемблерный код этого вычисления для обычного двухадресного компьютера показан на рис. 9.29, а. Первый адрес — источник, второй — получатель, поэтому команда MOV A, R1 помещает значение переменной A в регистр R1. Код на рис. 9.29, б делает то же самое, но менее эффективным способом, используя пустую команду NOP (no operation) в качестве вкраплений в реальный код.

Но это еще не все. Можно также изменить внешний вид кода расшифровки. Существует множество пустых команд: к примеру, добавление нуля к содержимому регистра, проведение операции ИЛИ над своим собственным содержимым, сдвиг влево на нуль разрядов, а также переход на следующую команду. Программа на рис. 9.29, в работает точно так же, как программа на рис. 9.29, а. При копировании самого себя вирус может вместо программы, показанной на рис. 9.29, а, воспользоваться программой, показанной на рис. 9.29, в, сохраняя в дальнейшем свою работоспособность. Вирус, мутирующий от копии к копии, называется полиморфным вирусом (polymorphic virus).

Теперь предположим, что регистр R5 в этом фрагменте программы совершенно не нужен. Тогда код, приведенный на рис. 9.29, г, также эквивалентен коду, показанному на рис. 9.29, а. И наконец, во многих случаях можно переставить команды без изменения работоспособности программы. Таким образом, получается, что код, показанный на рис. 9.29, д, — еще один фрагмент кода, логически эквивалентный коду на рис. 9.29, а. Фрагмент кода, способный видоизменять последовательности машинных команд без изменения их функциональности, называется мутационным механизмом (mutation engine), он содержится в изощренных вирусах для видоизменения процедуры расшифровки от копии к копии. Мутации могут состоять из вставок бесполезного, но безопасного кода, перестановки команд, обмена содержимого регистров и замены команд на их эквиваленты. Сам мутационный механизм может быть спрятан за счет шифрования его вместе с телом вируса.

Заставлять бедную антивирусную программу разбираться в том, что код, представленный в рис. 9.29, а, является функциональным эквивалентом кода, представленного во всех последующих примерах вплоть до кода на рис. 9.29, д, — значит предъявлять к ней слишком высокие требования, особенно если у мутационного механизма припрятано в рукавах еще множество трюков. Антивирусная программа может проанализировать код, чтобы разобраться в том, что он делает, и даже попытаться симулировать выполнение команд кода, но принимая во внимание тот факт, что встретиться могут тысячи вирусов и требуется проанализировать тысячи файлов, можно прийти к выводу, что у нее просто не будет времени на каждый такой тест или она будет работать очень медленно.

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

До сих пор рассматривалась лишь попытка распознать присутствие вирусов в зараженных исполняемых файлах. Кроме этого антивирусный сканер проверяет главную загрузочную запись, загрузочные секторы, список сбойных блоков, флеш-память, CMOS-память и т. д., но что, если в памяти уже находится резидентный вирус? Он не будет обнаружен. Хуже того, представьте себе работающий вирус, отслеживающий все системные вызовы. Он запросто может обнаружить антивирусную программу, считывающую загрузочный сектор (для проверки на вирусы).

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

Чтобы не быть обманутой вирусом, антивирусная программа может читать с диска, обращаясь непосредственно к оборудованию в обход операционной системы. Но потребуются встроенные драйверы для устройств с интерфейсами SATA, USB, SCSI и для дисков других распространенных стандартов, которые снизят переносимость антивирусной программы и приведут к ее отказу на компьютерах, оборудованных дисками с редкими стандартами. Более того, если обойти операционную систему при чтении загрузочного сектора еще можно, то обойти ее при чтении всех исполняемых файлов нельзя, существует также опасность, что вирусы могут выдавать недостоверные сведения об исполняемых файлах.

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Программы поиска вирусов:

  1. ВИРУС
  2. Поиск смысла жизни – это поиск бессмертия!
  3. ИЗЛЕЧЕНИЕ ОТ «ВИРУСА ОБИДЫ»
  4. Вирусы бедности и нищеты и их причины
  5. Статья 130. Заражение вирусом иммунодефицита человека либо иной неизлечимой инфекционной болезни
  6. Программа Да и программа Нет
  7. Свободное воспроизведение программ для ЭВМ и баз данных. Декомпилирование программ для ЭВМ
  8. Статья 132. Разглашение сведений о проведении медицинского обследования на выявление заражения вирусом иммунодефицита человека либо иной неизлечимой инфекционной болезни
  9. Статья 131. Ненадлежащее исполнение профессиональных обязанностей, повлекшее заражение лица вирусом иммунодефицита человека либо иной неизлечимой инфекционной болезни
  10. ПОИСК ИНФОРМАЦИОННЫЙ
  11. Программа телевидения
  12. Музыкальные концертные программы
  13. ЧАСТЬ 2 В ПОИСКАХ УТРАЧЕННОГО «Я»
  14. ТЕОРИЯ ПОИСКА СМЫСЛА ЖИЗНЕННОГО