Компьютерные вредоносные программы и вирусы

История компьютерных вирусов

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

Теоретические основы для построения компьютерных вирусов были заложены еще в 40-50-х годах XX века, когда Джон фон Нейман (John von Neumann) написал работу по самовоспроизводящимся автоматам, а С. Пенроуз (L. S. Penrose) и Ф. Ж. Шталь (F. G. Stahl) описали модели структур, способных к размножению, мутациям и захвату. Их модели почти сразу реализовали в виде программного кода, который в современном понимании, правда, еще не был вредоносным. В 1950-х сотрудники Bell Labs воплотили в жизнь основную идею фон Неймана, создав игру под названием Core Wars. В ней программисты выпускали в общую область памяти «бойцов», запускали их одновременно и соревновались за контроль над компьютером.

Самые ранние задокументированные вирусы появились в начале 1970-х. Первым из них часто называют Creeper Worm — экспериментальную самовоспроизводящуюся программу, написанную Бобом Томасом (Bob Thomas) из BBN Technologies. Creeper получал доступ в сеть ARPANET (предшественник интернета) и копировал себя в удаленные системы, где показывал сообщение: «Я крипер, поймай меня, если сможешь!» Позднее Рэй Томлинсон (Ray Tomlinson) написал в ответ программу REAPER, которая тоже перемещалась по Сети и, обнаруживая CREEPER, «ловила» его, прекращая выполнение. Томлинсон тем самым разработал прообраз того, что потом назовут антивирусом.

В 1983 году Фред Коэн (Fred Cohen) ввел в научный оборот привычный нам термин «компьютерный вирус». Он определил его так: «Программа, которая может заражать другие программы, модифицируя их, чтобы включать в них, возможно, развитую версию себя». В том же году в Университете Южной Калифорнии (США) предложили проект по созданию самораспространяющейся программы. Формально именно способность к саморепродукции — главное свойство вирусов.

Распространение компьютерных атак началось примерно с 1970-х, когда произошли инциденты с компаниями National CSS, AT&T и Los Alamos National Laboratory. В случае с AT&T взломщик, например, изменил внутренние часы, отвечавшие за выставление тарифов, так что пользователи этой сети получали ночные скидки даже в дневное время. Появились первые антивирусные средства — NOD, McAfee. Безопасностью данных тогда особенно не занимались, механизмы защиты использовали самые поверхностные, поскольку и атаки были, с технической точки зрения, не слишком продвинутыми.

Вредоносные программы часто распространялись полностью в автономном режиме через дискеты, переносимые с компьютера на компьютер руками человека. К середине 1970-х все уже понимали, что при проектировании компьютерных систем стоит обращать особое внимание и на обеспечение безопасности.

Компьютерные вредоносные программы и вирусы
Это шестнадцатеричный дамп загрузочного сектора дискеты (A:), содержащий первый в истории ПК-вирус — Brain. Программа: PC Tools Deluxe 4.22, файловый менеджер и низкоуровневый редактор / © Avinash Meetoo, Wikimedia

В 1983 году вышел фильм «Военные игры», где программа-мошенник захватывала ядерные ракетные системы. Общество восприняло подобную угрозу достаточно нервно. Палата представителей США вынуждена была провести специальные слушания по поводу взломов компьютеров. Кен Томпсон (Ken Thompson) в лекции на Премию Тьюринга впервые описал сценарий заражения системы с помощью программы, которую назвал «троянским конем». После все большего числа атак на правительственные и корпоративные компьютеры американский конгресс в 1986 году принял Закон о компьютерном мошенничестве и злоупотреблениях — взлом компьютерных систем начал считаться преступлением.

По мере развития компьютерных сетей авторы вредоносных программ постоянно совершенствовали свой код и пользовались преимуществами повсеместного распространения интернета. С 2000 по 2010 год число вредоносных программ значительно выросло как по количеству, так и по скорости их распространения. В 2016-м вирус Locky заразил несколько миллионов компьютеров в Европе со средней скоростью больше пять тысяч устройств в час. В 2018 году Thanatos стала первой программой-вымогателем, которая начала принимать платежи в биткойнах. На сегодня, по данным Anti-Phishing Workgroup, вредоносное ПО заражает как минимум треть компьютеров в мире. Cybersecurity Ventures сообщает, что к 2021-му убытки от киберпреступлений, в том числе вредоносных программ, составили шесть триллионов долларов в год.

Компьютерные вредоносные программы и вирусы
Это сообщение вируса MacMag — Universal Peace — на экране ПК Macintosh, 1988 год / © Mike Evangelist, Wikimedia

Правила цифровой гигиены

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

  • Не нужно устанавливать программы из источников, которым он не склонен доверять;
  • Следует быть внимательным и не вестись на фишинг — так называют мошенническую рассылку, которая имитирует письма от банков, например;
  • Не открывайте подозрительные вложения;
  • По возможности обновляйте программное обеспечение и устанавливайте исправления безопасности;
  • Используйте принцип минимальных привилегий. У каждого пользователя (как и у каждой программы) должен быть доступ только к тем разрешениям, которые необходимы для выполнения базовой работы;
  • Отдавайте предпочтение обезличенным логинам и паролям. Если в качестве логина в разных социальных сетях используется имя и фамилия, это позволит злоумышленникам связать между собой разные аккаунты одного человека;
  • Там, где можно использовать многофакторную аутентификацию, лучше ею не пренебрегать. Суть этого метода в том, что для входа в систему следует не только ввести пароль, но и применить второй способ аутентификации — например, через письмо по электронной почте или через код, присланный на телефон. Вторым фактором часто выступают биометрические данные — отпечатки пальцев либо сетчатка глаза;
  • Не храните в виртуальных облачных системах сканы и копии документов;
  • Сохраняйте приватность в соцсетях. Не выкладывайте фотографии вида из окна своего дома, постарайтесь, чтобы на фотографиях не был виден адрес. Кроме того, лучше вовсе отключить геотеги на фотографиях;
  • Аккуратно пользуйтесь общественным Wi-Fi;
  • Отслеживайте список программ в автозагрузке, отключайте неиспользуемые программы.

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

Компьютерные вредоносные программы и вирусы
© Ed Hardie, Unsplash

Выявление вредоносного ПО

Зараженный компьютер проявляет некоторые специфические «симптомы» вредоносного проникновения. По ним вполне можно определить угрозу. Трояны-майнеры, например, повышают вычислительную нагрузку тех процессов, которые раньше не потребляли ресурсов. Компьютер при них работает медленнее, программы открываются с явной задержкой. Появление новых программ на компьютере или запуск неизвестных процессов тоже сигнализирует об угрозе. Выявить более сложное ПО, не обладая технической квалификацией, проблематично. Чтобы заразить систему, атакующему достаточно подменить либо добавить собственную DLL-библиотеку в системе у функционирующей программы, рассчитывая, что пользователь вряд ли будет проверять все исполняемые файлы всех процессов.

Евгений Жуковский в связи с этим подчеркивает: «Атакующие могут использовать множество различных векторов атаки для проникновения в вашу систему. В первую очередь под угрозой те программы, которые непосредственно взаимодействуют с интернетом, — например, веб-браузеры и почтовые клиенты. К этой же категории критического ПО можно отнести офисные приложения, поскольку их часто используют при открытии недоверенных почтовых вложений и они могут быть скомпрометированы путем эксплуатации уязвимостей в программах. Поэтому важно своевременно обновлять программное обеспечение.

Если говорить о веб-браузерах, то есть несколько распространенных векторов атаки. Для начала: в браузерах, как и в любом ПО, бывают уязвимости, и атакующий может их использовать и получить доступ к вашим данным и системе, когда вы зайдете на сайт злоумышленника или перейдете по его ссылке. Но это не самый распространенный сценарий на данный момент, так как браузеры обычно автоматически обновляются, а ранее неизвестные уязвимости в последних версиях браузеров на вес золота среди атакующих: их вряд ли будут использовать в массовых атаках, потому что это слишком сложно и дорого для рядовой кражи данных. Более частый вариант использование социальной инженерии, то есть слабостей и нерационального поведения пользователей. Например, злоумышленнику нужно заставить жертву скачать и запустить исполняемый файл либо офисный документ с макросами. Поэтому всегда стоит внимательно относиться к тому, какие файлы вы открываете и насколько доверяете их отправителю.

Также атакующие зачастую используют уязвимости веб-сайтов. Пример распространенного типа веб-уязвимостей — межсайтовый скриптинг (Cross-Site Scripting, XSS). Эта уязвимость заключается в том, что злоумышленник может выполнить свой javascript-код в контексте браузера жертвы. Вредоносный код может попытаться похитить критическую информацию пользователя, прочитав cookies из браузера либо отобразив фишинговую форму, чтобы выманить данные с помощью социальной инженерии. Вредоносный код в этом случае может быть либо внедрен в код страницы уязвимого сайта, либо присутствовать в URL-ссылке, по которой перейдет жертва. Поэтому будьте аккуратны, переходя по ссылкам, полученным из недоверенных источников».

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

В этом случае прибегают к эвристическому анализу: он основан не на сигнатурах конкретных экземпляров ВПО, а на более широких правилах опасного поведения, которое свидетельствует о вредоносном назначении программы.

Компьютерные вредоносные программы и вирусы
Результат действия вируса Amoeba.DOS.Virus / © danooct1, Wikimedia

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

В целом человечество знает, как работают вредоносные программы, как их обнаружить и как с ними бороться, но все же часто им проигрывает. В 2010 году Stuxnet, 500-килобайтный компьютерный червь, заразил программное обеспечение как минимум 14 промышленных объектов в Иране, в числе которых был завод по обогащению урана. Ядерная программа страны оказалась отброшена на десятилетия назад: иранцы избавились от тысячи центрифуг для обогащения уранового топлива, пораженных Stuxnet.

В марте 2016-го неизвестные хакеры передали 30 тысяч электронных писем, отправленных Хиллари Клинтон и другими представителями Демократической партии США, сайту WikiLeaks. Клинтон в итоге проиграла президентские выборы. Эффект вредоносного ПО не всегда столь масштабен, но оно меняет нашу реальность. Если в 1994 году новый вирус появлялся каждый час, то в 2015-м появлялось больше 300 тысяч вредоносных образцов в день — уже не только вирусов.

Нашли опечатку? Выделите фрагмент и нажмите Ctrl + Enter.

Анатомия вируса

Мы будем говорить о вирусах, живущих в исполняемых файлах форматов PE и ELF, то есть о вирусах, тело которых представляет собой исполняемый код для платформы x86. Кроме того, пусть наш вирус не будет уничтожать исходный файл, полностью сохраняя его работоспособность и корректно инфицируя любой подходящий исполняемый файл. Да, ломать гораздо проще, но мы же договорились говорить о правильных вирусах, да? Чтобы материал был актуальным, я не буду тратить время на рассмотрение инфекторов старого формата COM, хотя именно на нем были обкатаны первые продвинутые техники работы с исполняемым кодом.

Основными частями кода вируса являются infector и payload. Infector – это код, который ищет подходящие для заражения файлы и внедряет в них вирус, стараясь максимально скрыть факт внедрения и при этом не повредить функционалу файла. Payload – это код, который выполняет собственно необходимые вирмейкеру действия, например, рассылает спам, DoS-ит кого-нибудь, или просто оставляет на машине текстовой файлик «Здесь был Виря». Нам совершенно непринципиально, что там внутри payload, главное, что вирмейкер всячески старается скрыть его содержимое.

Начнём со свойств кода вируса. Чтобы код удобней было внедрять, разделять код и данные не хочется, поэтому обычно используется интеграция данных прямо в исполняемый код. Ну, например, так:

    jmp message

the_back:
    mov eax, 0x4
    mov ebx, 0x1
    pop ecx		; со стека будет взят адрес «Hello, World»
    mov edx, 0xF
    int 0x80
...

message:
    call the_back       ; после исполнения на стеке будет лежать адрес «возврата», т.е. адрес «Hello, World\n»
    db "Hello, World!", 0Dh, 0Ah

Или так:

push 0x68732f2f   ; “hs//”
push 0x6e69622f   ; “nib/”
mov ebx, esp ; в ESP теперь адрес строки «/bin/sh»
mov al, 11
int 0x80

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

Читать также:  Вопросы с государственной программой развития сельского хозяйства и национальным докладом о ходе или результатах реализации в 2018 году государственной программы "Развитие сельских территорий", оба из которых были опубликованы на портале государственной программы

Предположим, вирмейкер имеет возможность написать код вируса в таком стиле, и теперь ему надо внедрить его в существующий исполняемый файл. Ему необходимо позаботиться о двух вещах:

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

Итак, разберемся с внедрением в файл. Современные исполняемые форматы для платформы x86 в Windows и Linux – это PE (Portable Executable) и ELF (Executable and Linkable Format). Вы без проблем найдёте их спецификации в системной документации, и если будете заниматься вопросами защиты исполняемого кода, то точно не пропустите. Исполняемые форматы и системный загрузчик (код операционной системы, который занимается запуском исполняемого файла) являются одним из «слонов», на которых стоит операционная система. Процедура запуска .exe файла является очень сложным алгоритмически процессом с кучей нюансов, и рассказывать об этом можно в десятке статей, которые вы обязательно найдете сами, если тема вас заинтересует. Я ограничусь простым рассмотрением, достаточным для базового понимания процесса запуска. Чтобы в меня не кидались помидорами, далее под компилятором я буду иметь в виду весь комплекс программ, превращающий исходный код в готовый исполняемый файл, то есть, фактически, компилятор + линкер.

Исполняемый файл (PE или ELF) состоит из заголовка и набора секций. Секции – это выровненные (см. ниже) буферы с кодом или данными. При запуске файла секции копируются в память и под них выделяется память, причем совсем необязательно того объёма, который они занимали на диске. Заголовок содержит разметку секций, и сообщает загрузчику, как расположены секции в файле, когда он лежит на диске, и каким образом необходимо расположить их в памяти перед тем, как передать управление коду внутри файла. Для нас интересны три ключевых параметра для каждой секции, это psize, vsize, и flags. Psize (physical size) представляет собой размер секции на диске. Vsize (virtual size) – размер секции в памяти после загрузки файла. Flags – атрибуты секции (rwx). Psize и Vsize могут существенно различаться, например, если программист объявил в программе массив в миллион элементов, но собирается заполнять его в процессе исполнения, компилятор не увеличит psize (на диске содержимое массива хранить до запуска не нужно), а вот vsize увеличит на миллион чего-то там (в runtime для массива должно быть выделено достаточно памяти).

Флаги (атрибуты доступа) будут присвоены страницам памяти, в которые секция будет отображена. Например, секция с исполняемым кодом будет иметь атрибуты r_x (read, execute), а секция данных атрибуты rw_ (read,write). Процессор, попытавшись исполнить код на странице без флага исполнения, сгенерирует исключение, то же касается попытки записи на страницу без атрибута w, поэтому, размещая код вируса, вирмейкер должен учитывать атрибуты страниц памяти, в которых будет располагаться код вируса. Стандартные секции неинициализированных данных (например, область стека программы) до недавнего времени имели атрибуты rwx (read, write, execute), что позволяло копировать код прямо в стек и исполнять его там. Сейчас это считается немодным и небезопасным, и в последних операционных системах область стека предназначена только для данных. Разумеется, программа может и сама изменить атрибуты страницы памяти в runtime, но это усложняет реализацию.

Также, в заголовке лежит Entry Point — адрес первой инструкции, с которой начинается исполнение файла.

Необходимо упомянуть и о таком важном для вирмейкеров свойстве исполняемых файлов, как выравнивание. Для того чтобы файл оптимально читался с диска и отображался в память, секции в исполняемых файлах выровнены по границам, кратным степеням двойки, а свободное место, оставшееся от выравнивания (padding) заполнено чем-нибудь на усмотрение компилятора. Например, логично выравнивать секции по размеру страницы памяти – тогда ее удобно целиком копировать в память и назначать атрибуты. Даже вспоминать не буду про все эти выравнивания, везде, где лежит мало-мальски стандартный кусок данных или кода, его выравнивают (любой программист знает, что в километре ровно 1024 метра). Ну а описание стандартов Portable Executable (PE) и Executable Linux Format (ELF) для работающего с методами защиты исполняемого кода – это настольные книжки.

Так как адреса внутри всех этих секций связаны, просто шлепнуть кусок кода в середину секции, «перевязав» его JMP-ами не получится, исходный файл сломается. Поэтому популярными местами для внедрения кода вируса являются:

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

Есть способы и похитрее, некоторые я опишу во второй статье.

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

  1. JMP на тело вируса замещает первые байты, находящиеся в Entry Point файла. Затёртые байты вирус сохраняет в своём теле, и, по окончании собственной работы, восстанавливает их и передает управление на начало восстановленного буфера.
  2. Способ, похожий на предыдущий, но вместо байтов вирус сохраняет несколько полных машинных инструкций в Entry Point, тогда он может, ничего не восстанавливая (проследив только за корректной очисткой стека), выполнить их после окончания собственной работы и передать управление на адрес инструкции, следующей за «сворованными».
  3. Как и в случае с внедрением, есть способы и похитрее, но мы их тоже рассмотрим ниже, или отложим до следующей статьи.

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

Если мы внедрим свой код в позицию точно между инструкциями, то сможем сохранить контекст (стек, флаги) и, выполнив код вируса, восстановить все обратно, вернув управление программе-хосту. Конечно, с этим тоже могут быть проблемы, если используются средства контроля целостности кода, антиотладка и т.п., но об этом тоже во второй статье. Для поиска такой позиции нам необходимо вот что:

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

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

  1. Выбираем вкусный исполняемый файл (достаточно толстый, чтобы в него поместилось тело вируса, с нужным распределением секций и т.п.).
  2. Читаем свой код (код тела вируса).
  3. Берем несколько первых инструкций из файла-жертвы.
  4. Дописываем их к коду вируса (сохраняем информацию, необходимую для восстановления работоспособности).
  5. Дописываем к коду вируса переход на инструкцию, продолжающую исполнение кода-жертвы. Таким образом, после исполнения собственного кода вирус корректно исполнит пролог кода-жертвы.
  6. Создаем новую секцию, записываем туда код вируса и правим заголовок.
  7. На место этих первых инструкций кладем переход на код вируса.

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

Анатомия детектора

Вдруг, откуда ни возьмись, появляется рыцарь на белом компе, в левой руке у него отладчик, а в правой – дизассемблер, программист антивирусной компании. Откуда он там взялся? Вы, конечно, догадались. С большой долей вероятности, он появился там из «смежной области». Антивирусная область в плане программирования весьма уважаема теми, кто в теме, ибо возиться этим ребятам приходится с весьма изощренными алгоритмами, причем в довольно стеснённых условиях. Сами посудите: у вас на входе сотня тысяч экземпляров всякой заразы и исполняемый файл, работать вы должны практически в реальном времени, а цена ошибки весьма высока.

Для антивируса, как и для любого конечного автомата, принимающего бинарное решение «да/нет» (инфицирован/здоров), существует два типа ошибок – false positive и false negative (ошибочно признал файл заразным, ошибочно пропустил зараженный). Понятно, что общее число ошибок надо снижать в любом раскладе, но false negative для антивируса куда более неприятна, чем false positive. «После скачивания торрента, перед установкой игры отключите антивирус» — знакомо? Это и есть «false positive» – crack.exe, записывающий что-то в исполняемый .exe файл для достаточно умного эвристического анализатора (см. ниже), выглядит как вирус. Как говорится: «лучше перебдеть, чем недобдеть».

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

Итак (рассматриваем классические вирусы), на входе имеем исполняемый файл и один из сотни тысяч потенциальных вирусов в нем. Давайте детектировать. Пусть это кусок исполняемого кода вируса:

XX XX XX XX XX XX	; начало вируса длиной N байт . . . 
68 2F 2F 73 68		push 0x68732f2f   ; “hs//”
68 2F 62 69 6E		push 0x6e69622f   ; “nib/”
8B DC			mov ebx, esp ; в ESP теперь адрес строки «/bin/sh»
B0 11			mov al, 11
CD 80			int 0x80
XX XX XX XX		; конец вируса длиной M байт . . .  

Сразу хочется просто взять пачку опкодов (68 2F 2F 73 68 68 2F 62 69 6E 8B DC B0 11 CD 80) и поискать эту байтовую строку в файле. Если нашли – попался, гад. Но, увы, оказывается эта же пачка байт встречается и в других файлах (ну мало ли кто вызывает командный интерпретатор), да еще и таких строк для поиска «стотыщ», если искать каждую, то никакая оптимизация не поможет. Единственный, быстрый и правильный способ проверить наличие такой строки в файле – это проверить ее существование по ФИКСИРОВАННОМУ смещению. Откуда его взять?

Читать также:  Никонов назвал основные проблемы, связанные с реализацией национального проекта "Образование

Вспоминаем «смежную область» — особенно места про то, куда вирус себя кладет и как передает себе управление:

  • вирус внедряется в padding между заголовком и началом первой секции. В этом случае можно проверить существование этой байт-строки по смещению
    «длина заголовка» + N (где N – число байт от начала вируса до байт-строки)
  • вирус лежит в новой, отдельной секции. В этом случаем можно проверить существование байт-строки от начала всех секций с кодом
  • вирус внедрился в padding между концом кода и концом кодовой секции. Можно использовать отрицательное смещение от конца секции, типа «конец кодовой секции» — М (где M — число байт от конца байт-строки до конца кода вируса) – «длина байт-строки»

Теперь оттуда же про передачу управления:

  • вирус записал свои инструкции прямо поверх инструкций в Entry Point. В этом случае ищем байт строку просто по смещению «Entry Point» + N(где N – число байт от начала вируса до байт-строки)
  • вирус записал в Entry Point JMP на свое тело. В этом случае надо сначала вычислить куда смотрит этот JMP, а потом искать байт-строку по смещению «адрес перехода JMP» + N(где N – число байт от начала вируса до байт-строки)

Что-то я устал писать «байт-строка», она переменной длины, хранить ее в базе неудобно, и совершенно необязательно, поэтому вместо байт-строки мы будем использовать её длину плюс CRC32 от неё. Такая запись очень короткая и сравнение работает быстро, так как CRC32 алгоритм не из медленных. Гнаться за устойчивостью к коллизиям контрольных сумм смысла нет, так как вероятность коллизии по фиксированным смещениям мизерная. Кроме того, даже в случае коллизии ошибка будет типа «false positive», что не так уж и страшно. Обобщаем все вышеописанное, вот примерная структура записи в нашей антивирусной базе:

  1. ID вируса
  2. флаги, указывающие откуда считать смещение (от EP, от конца заголовка, от конца первой секции, от начала всех секций, от адреса перехода инструкции JMP в EP и т.п.)
  3. смещение (offset)
  4. длина сигнатуры (Lsig)
  5. CRC32 сигнатуры (CRCsig)

Оптимизируем вход (оставляем только сигнатуры, которые «влазят» в данный файл, сразу из заголовка подготавливаем набор необходимых смещений) и далее:

{ # для всех подходящих записей 
-	на основании флагов вычисляем базовое смещение в файле (начало кодовой секции, entry point и т.п.)
-	прибавляем к нему offset
-	читаем Lsig байт
-	считаем от них CRC32
-	если совпало – мы поймали вирус
}

Ура, вот наш первый антивирус. Он достаточно крут, так как при помощи достаточно полной базы сигнатур, нормально подобранных флагов и хорошей оптимизации этот детектор способен очень быстро ловить 95% всяких зараз (подавляющее большинство современного malware это просто исполняемые файлы, без всякой способности к мутации). Далее начинается игра «кто быстрее обновит базы сигнатур» и «кому раньше пришлют новый экземпляр какой-нибудь гадости».

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

Эвристический анализатор

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

  • некорректный (испорченный вирусом, но работоспособный) заголовок файла
  • JMP прямо в точке входа
  • «rwx» на секции кода

Ну, и так далее. Помимо указания факта заражения, эвристик может помочь принять решение – запускать ли более «тяжелый» анализ файла? Каждый признак имеет разный вес, от «подозрительный какой-то» до «не знаю чем, но файл заражен точно». Именно эти признаки дают большинство ошибок «false positive». Не забудем также о том, что именно эвристик может предоставить антивирусной компании экземпляры потенциальных вирусов. Сработал эвристик, но ничего конкретного не было найдено? Значит файл точно является кандидатом на отправку в антивирусную компанию.

Межвидовое взаимодействие и эволюция

Как мы увидели, для быстрого и точного сравнения детектору необходимы сами байты сигнатуры и ее смещение. Или, другим языком, содержимое кода и адрес его расположения в файле-хосте. Поэтому понятно, как развивались идеи сокрытия исполняемого кода вирусов – по двум направлениям:

  • сокрытие кода самого вируса;
  • сокрытие его точки входа.

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

Сокрытие точки входа (Entry Point Obscuring) в результате послужило толчком для появления в вирусных движках автоматических дизассемблеров для определения, как минимум, инструкций перехода. Вирус старается скрыть место, с которого происходит переход на его код, используя из файла то, что в итоге приводит к переходу: JMP, CALL, RET всякие, таблицы адресов и т.п. Таким образом, вирус затрудняет указание смещения сигнатуры.

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

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

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

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

Компьютерный вирус

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

Каталог решений и проектов ИБ — Антивирусы доступны на TAdviser

Классификация вирусов по способу заражения

Резидентные

Такие вирусы, получив управление, так или иначе остается в памяти и производят поиск жертв непрерывно, до завершения работы среды, в которой он выполняется. С переходом на Windows проблема остаться в памяти перестала быть актуальной: практически все вирусы, исполняемые в среде Windows, равно как и в среде приложений Microsoft Office, являются резидентными вирусами. Соответственно, атрибут резидентный применим только к файловым DOS вирусам. Существование нерезидентных Windows вирусов возможно, но на практике они являются редким исключением.

Нерезидентные

Получив управление, такой вирус производит разовый поиск жертв, после чего передает управление ассоциированному с ним объекту (зараженному объекту). К такому типу вирусов можно отнести скрипт-вирусы.

Классификация вирусов по степени воздействия

Безвредные

Вирусы никак не влияющие на работу компьютера (кроме уменьшения свободной памяти на диске в результате своего распространения);

Неопасные

Вирусы не мешающие работе компьютера, но уменьшающие объем свободной оперативной памяти и памяти на дисках, действия таких вирусов проявляются в каких-либо графических или звуковых эффектах;

Опасные

Вирусы, которые могут привести к различным нарушениям в работе компьютера;

Очень опасные

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

Классификация вирусов по способу маскировки

При создании копий для маскировки могут применяться следующие технологии:

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

Метаморфизм — создание различных копий вируса путем замены блоков команд на эквивалентные, перестановки местами кусков кода, вставки между значащими кусками кода «мусорных» команд, которые практически ничего не делают.

Шифрованный вирус

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

Вирус-шифровальщик

В большинстве случаев вирус-шифровальщик приходит по электронной почте в виде вложения от незнакомого пользователю человека, а возможно, и от имени известного банка или действующей крупной организации. Письма приходят с заголовком вида: «Акт сверки…», «Ваша задолженность перед банком…», «Проверка регистрационных данных», «Резюме», «Блокировка расчетного счета» и прочее. В письме содержится вложение с документами, якобы подтверждающими факт, указанный в заголовке или теле письма. При открытии этого вложения происходит моментальный запуск вируса-шифровальщика, который незаметно и мгновенно зашифрует все документы. Пользователь обнаружит заражение, увидев, что все файлы, имевшие до этого знакомые значки, станут отображаться иконками неизвестного типа. За расшифровку преступником будут затребованы деньги. Но, зачастую, даже заплатив злоумышленнику, шансы восстановить данные ничтожно малы.

Вложения вредоносных писем чаще всего бывают в архивах .zip, .rar, .7z. И если в настройках системы компьютера отключена функция отображения расширения файлов, то пользователь (получатель письма) увидит лишь файлы вида «Документ.doc», «Акт.xls» и тому подобные. Другими словами, файлы будут казаться совершенно безобидными. Но если включить отображение расширения файлов, то сразу станет видно, что это не документы, а исполняемые программы или скрипты, имена файлов приобретут иной вид, например, «Документ.doc.exe» или «Акт.xls.js». При открытии таких файлов происходит не открытие документа, а запуск вируса-шифровальщика. Вот лишь краткий список самых популярных «опасных» расширений файлов: .exe, .com, .js, .wbs, .hta, .bat, .cmd. Поэтому, если пользователю не известно, что ему прислали во вложении, или отправитель не знаком, то, вероятнее всего, в письме – вирус-шифровальщик.

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

Вирусы-шифровальщики стали набирать большую популярность начиная с 2013 года. В июне 2013 известная компания McAfee обнародовала данные, показывающие что они собрали 250 000 уникальных примеров вирусов шифровальщиков в первом квартале 2013 года, что более чем вдвое превосходит количество обнаруженных вирусов в первом квартале 2012 года .

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

Полиморфный вирус

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

Читать также:  VCSystemTray.exe

Классификация вирусов по среде обитания

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

  • загрузочные;
  • файловые
  • макро-вирусы;
  • скрипт-вирусы.

В эпоху вирусов для DOS часто встречались гибридные файлово-загрузочные вирусы. После массового перехода на операционные системы семейства Windows практически исчезли как сами загрузочные вирусы, так и упомянутые гибриды. Отдельно стоит отметить тот факт, что вирусы, рассчитанные для работы в среде определенной ОС или приложения, оказываются неработоспособными в среде других ОС и приложений. Поэтому как отдельный атрибут вируса выделяется среда, в которой он способен выполняться. Для файловых вирусов это DOS, Windows, Linux, MacOS, OS/2. Для макровирусов — Word, Excel, PowerPoint, Office. Иногда вирусу требуется для корректной работы какая-то определенная версия ОС или приложения, тогда атрибут указывается более узко: Win9x, Excel97.

Файловые вирусы

Файловые вирусы при своем размножении тем или иным способом используют файловую систему какой-либо (или каких-либо) ОС. Они:

  • различными способами внедряются в исполняемые файлы (наиболее распространенный тип вирусов);
  • создают файлы-двойники (компаньон-вирусы);
  • создают свои копии в различных каталогах;
  • используют особенности организации файловой системы (link-вирусы).

Все, что подключено к Интернету – нуждается в антивирусной защите: 82% обнаруженных вирусов «прятались» в файлах с расширением PHP, HTML и EXE.

Число вредоносных программ неуклонно растет и уже в скором будущем может достичь масштабов эпидемии. Распространение вирусов в цифровом мире не имеет границ, и даже при всех имеющихся возможностях нейтрализовать деятельность преступного киберсообщества сегодня уже невозможно. Бороться с хакерами и вирусописателями, которые неустанно совершенствуют свое мастерство, становится все сложнее. Так, злоумышленники научились успешно скрывать цифровые каналы распространения угроз, что значительно затрудняет отслеживание и анализ их онлайн-движения. Меняются и пути распространения, если раньше киберпреступники предпочитали электронную почту для распространения вирусов, то сегодня лидерские позиции занимают атаки в режиме реального времени. Также наблюдается рост вредоносных веб-приложений, которые оказались более чем пригодны для атак злоумышленников. Как заявил Говинд Раммурти, генеральный и управляющий директор компании eScan MicroWorld, сегодня хакеры научились успешно уклоняться от детектирования традиционными антивирусными сигнатурами, которые по ряду причин обречены на неудачу, когда дело доходит до обнаружения веб-угроз. Судя по образцам, исследованным в eScan, веб-угрозы превалируют среди вредоносных программ. 82% выявленных вредоносных программ — файлы с расширением PHP, HTML и EXE, а MP3, CSS и PNG — менее чем 1%.

Это явно говорит о том, что выбор хакеров – это Интернет, а не атаки с использованием уязвимостей программного обеспечения. Угрозы имеют полиморфный характер, это означает, что вредоносные программы могут быть эффективно перекодированы удаленно, что делает их трудно обнаружимыми. Поэтому высокая вероятность заражения связана, в том числе, и с посещениями сайтов. Согласно данным eScan MicroWorld, количество перенаправляющих ссылок и скрытых загрузок (drive-by-download) на взломанных ресурсах увеличилось более чем на 20% за последние два месяца. Социальные сети также серьезно расширяют возможности доставки угроз.

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

Загрузочные вирусы

MosaicRegressor (вирус)

Загрузочные вирусы записывают себя либо в загрузочный сектор диска (boot-сектор), либо в сектор, содержащий системный загрузчик винчестера (Master Boot Record), либо меняют указатель на активный boot-сектор. Данный тип вирусов был достаточно распространён в 1990-х, но практически исчез с переходом на 32-битные операционные системы и отказом от использования дискет как основного способа обмена информацией. Теоретически возможно появление загрузочных вирусов, заражающих CD-диски и USB-флешек, но на текущий момент такие вирусы не обнаружены.

Макро-вирусы

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

Скрипт-вирусы

Скрипт-вирусы, также как и макро-вирусы, являются подгруппой файловых вирусов. Данные вирусы, написаны на различных скрипт-языках (VBS, JS, BAT, PHP и т.д.). Они либо заражают другие скрипт-программы (командные и служебные файлы MS Windows или Linux), либо являются частями многокомпонентных вирусов. Также, данные вирусы могут заражать файлы других форматов (например, HTML), если в них возможно выполнение скриптов.

Классификация вирусов по способу заражения файлов

Перезаписывающие

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

Паразитические

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

Внедрение вируса в начало файла

Известны два способа внедрения паразитического файлового вируса в начало файла. Первый способ заключается в том, что вирус переписывает начало заражаемого файла в его конец, а сам копируется в освободившееся место. При заражении файла вторым способом вирус дописывает заражаемый файл к своему телу.

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

Внедрение вируса в конец файла

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

Внедрение вируса в середину файла

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

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

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

Вирусы без точки входа

Отдельно следует отметить довольно незначительную группу вирусов, не имеющих «точки входа» (EPO-вирусы — Entry Point Obscuring viruses). К ним относятся вирусы, не изменяющие адрес точки старта в заголовке EXE-файлов. Такие вирусы записывают команду перехода на свой код в какое-либо место в середину файла и получают управление не непосредственно при запуске зараженного файла, а при вызове процедуры, содержащей код передачи управления на тело вируса. Причем выполняться эта процедура может крайне редко (например, при выводе сообщения о какой-либо специфической ошибке). В результате вирус может долгие годы «спать» внутри файла и выскочить на свободу только при некоторых ограниченных условиях.

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

Вирусы-компаньоны

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

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

Возможно существование и других типов вирусов-компаньонов, использующих иные оригинальные идеи или особенности других операционных систем. Например, PATH-компаньоны, которые размещают свои копии в основном катагоге Windows, используя тот факт, что этот каталог является первым в списке PATH, и файлы для запуска Windows в первую очередь будет искать именно в нем. Данными способом самозапуска пользуются также многие компьютерные черви и троянские программы.

Вирусы-ссылки

Вирусы-ссылки или link-вирусы не изменяют физического содержимого файлов, однако при запуске зараженного файла «заставляют» ОС выполнить свой код. Этой цели они достигают модификацией необходимых полей файловой системы.

Файловые черви

Файловые черви никоим образом не связывают свое присутствие с каким-либо выполняемым файлом. При размножении они всего лишь копируют свой код в какие-либо каталоги дисков в надежде, что эти новые копии будут когда-либо запущены пользователем. Иногда эти вирусы дают своим копиям «специальные» имена, чтобы подтолкнуть пользователя на запуск своей копии — например, INSTALL.EXE или WINSTART.BAT.

Некоторые файловые черви могут записывать свои копии в архивы (ARJ, ZIP, RAR). Другие записывают команду запуска зараженного файла в BAT-файлы.

OBJ-, LIB-вирусы и вирусы в исходных текстах

Вирусы, заражающие библиотеки компиляторов, объектные модули и исходные тексты программ, достаточно экзотичны и практически не распространены. Всего их около десятка. Вирусы, заражающие OBJ- и LIB-файлы, записывают в них свой код в формате объектного модуля или библиотеки. Зараженный файл, таким образом, не является выполняемым и неспособен на дальнейшее распространение вируса в своем текущем состоянии. Носителем же «живого» вируса становится COM- или EXE-файл, получаемый в процессе линковки зараженного OBJ/LIB-файла с другими объектными модулями и библиотеками. Таким образом, вирус распространяется в два этапа: на первом заражаются OBJ/LIB-файлы, на втором этапе (линковка) получается работоспособный вирус.

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

Буткит (Bootkit)

Основная статья: Буткит (Bootkit)

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

В отличие от червей (сетевых червей), вирусы не используют сетевых сервисов для проникновения на другие компьютеры. Копия вируса попадает на удалённые компьютеры только в том случае, если зараженный объект по каким-либо не зависящим от функционала вируса причинам оказывается активизированным на другом компьютере, например:

  • при заражении доступных дисков вирус проник в файлы, расположенные на сетевом ресурсе;
  • вирус скопировал себя на съёмный носитель или заразил файлы на нем;
  • пользователь отослал электронное письмо с зараженным вложением.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *