Классические вирусы, Троянские программы, Adware, Riskware, Pornware, Spyware, Руткиты, Кейлогены, Сетевые черви, Макровирусы, Скрипт-вирусы, HijackThis, Хакерские утилиты, Bad-Joke (злые шутки) , Фишинг-обман.
Трояны, Шпионы, Черви, Кейлоггеры. Достаточно?
Трояны, стелс, файловые, бутовые, скрипт -вирусы, черви, порнодилеры и прочее и прочее.
Какие скрипты блока Внешность вы знаете?
ДИСКЛЕЙМЕР: Статья написана в информационно-познавательных целях и не претендует на высокий уровень «технической» составляющей. Диаграммы приведенные в статье не носят рекламный характер.
История появления компьютерных вирусов насчитывает уже почти 40 лет. Один из самых первых вирусов был разработан для компьютера Apple (но, в последствии, он так и не привёл к массовому заражению «яблочных» ПК). Произошло это в 1981 году, а звали «пионера» Elk Cloner (в вольном переводе «клонировщик лосей»). Этот «сохатый» был довольно безобиден, но надоедлив: при каждой загрузке пользователь заражённого компьютера видел на экране забавный (но не для владельца ПК) стишок, после чего компьютер начинал снова работать в обычном режиме.
Elk Cloner заражал компьютеры с дискеты: загружаясь с заражённой дискеты система запускала копию вируса. Никакого серьёзного влияния на работу компьютера он не оказывал, поскольку был написан американским школьником Ричардом Скрента забавы ради. Таким образом, Elk Cloner, который было бы правильнее назвать программой-шуткой, положил начало обширной категории «загрузочных вирусов», так как прописывался в сектор загрузки Apple II. Интересно, что в сети нередко можно встретить утверждение, что под OS X и iOS вирусов не бывает. Так вот, помимо «клонировщика лосей» есть и современные вирусы под ПО «яблочников», хотя надо признать, что их в разы меньше, чем под Windows и Android. А первый распространённый вирус для ПК под управлением операционной системы MS DOS, появился в 1986 году, и назывался он Brain (в переводе с английского «мозг»). Впрочем, разработчики этого вируса, пакистанские братья Фарук Альви, не хотели вредить людям: они написали Brain для того, чтобы защитить написанную ими медицинскую программу от нелицензионного копирования.
Работал он так: в случае обнаружения пиратской программы вирус несколько замедлял работу дискеты, а также ограничивал память при взаимодействии с программой. Интересно, что создатели «Мозга» позаботились о том, что при его загрузке пользователь получал не только сообщение о заражении, но и телефон разработчиков, которые обещали выслать «лекарство» (привычных антивирусных программ тогда ещё, разумеется, не было). И слово своё до поры до времени братья держали, однако заражений оказалось так много, что можно было говорить уже о целой эпидемии: пользователи со всего мира стали атаковать несчастный пакистанский номер, и братьям ничего не оставалось, как просто отключить телефон. Так мир пережил первую «пандемию», вызванную компьютерным вирусом.
Какими бывают вирусы?
С момента своего появления компьютерные вирусы прошли большой эволюционный путь, и современные вредоносные программы работают куда тоньше, чем программы 80-х и 90-х годов, а обнаружить их значительно сложнее. В этом отношении компьютерные вирусы очень походят на своих «старших собратьев» вирусов биологических. Сегодня пользователи могут годами не замечать, что в их компьютере работает программка, которая либо тихо собирает информацию о ПК или ином электронном устройстве, либо заставляет компьютер пользователя выполнять определённые действия, либо маскирует действия других, куда более опасных программ. У каждого типа таких программ есть своё название и предназначены они для достижения злоумышленниками различных корыстных целей.
Worms или черви
Древнейшие вирусы были именно «червями». В 1961 году сотрудники американской Bell Labs придумали игру под названием «Дарвин», которая заключалась в том, что программы-«организмы» одного типа должны были захватывать «организмы» другого типа, а побеждал тот, чьи «организмы» захватывали всю память компьютера. Именно эта безобидная игрушка легла в основу принципа работы программы-червя, захватывающего дисковое пространство компьютера с тем, чтобы замедлить, а в некоторых случаях и полностью парализовать его работу.
Особую и наиболее распространённую сегодня группу представляют сетевые черви. Используя уязвимости сетевого ПО, такие программы автоматически перебираются из одного компьютера в другой, заражая всё большее количество ПК. Некоторые черви умеют перебирать пароли по составленным словарям и, взламывая почтовые ящики и аккаунты, распространяются дальше, самостоятельно выискивая новые жертвы. Цели создателей червей могут быть разными, но чаще всего их запускают ради рассылки спама или затруднения работы компьютерных сетей конкурентов вплоть до полной блокировки.
Trojans или троянцы
Как и древние троянцы, спрятавшиеся в деревянном коне, чтобы проникнуть в лагерь данайцев, эти вирусы проникают в компьютер в составе других совершенно безобидных программ, и, пока пользователь не запустит программу, в которой притаился троянец, ведут себя тише воды ниже травы. Однако, с запуском исполняющего файла программы вы активируете этого опасного гостя, который, в зависимости от типа, будет вам пакостить: красть информацию, распространять другие, не менее опасные вирусы, повреждать определённые файлы. За редким исключением троянцы не умеют размножаться, но по степени вреда они куда опаснее червей и могут нанести огромный ущерб владельцу компьютера.
Rootkits или маскировщики
Главной целью этих внешне безобидных программок является скрытие активности других вредоносных программ и действий злоумышленников. Для этого руткиты пускаются на самые разные ухищрения: изменяют режимы работы операционной системы, незаметно отключают или подключают различные функции, а особо продвинутые умеют даже почти незаметно блокировать работу антивирусных программ, чтобы те не нашли маскируемых руткитами электронных вредителей или ещё более опасных злодеев в человеческом облике, шарящих по вашему ПК.
Zombies или зомби
В природе существуют так называемые осы-дементоры, яд которых полностью парализует волю тараканов и подчиняет командам ос, направляющих их в свои гнёзда с тем, чтобы затем откладывать в них свои яйца — и таракан-зомби становится пищей для маленьких осят. Зомбирование так же распространено и в виртуальном мире. Такие вирусы-зомби действуют как те самые осы, заставляя компьютерную систему выполнять команды (например, совершать массовые атаки на различные ресурсы, рассылать спам и т. При этом владельцы ПК в большинстве даже не догадываются, что их железный друг «зомбирован» и выполняет команды злоумышленника.
Spyware или шпионы
Adware или рекламные вирусы
Один из самых неприятных типов вирусов, парализующий работу ПК появлением окна, которое невозможно закрыть без перезагрузки. Блокировщики выводят на экран информацию, что необходимо сделать пользователю, чтобы создатель вируса разблокировал его компьютер. В 100% случаев это платёжные данные злоумышленника, но не торопитесь отправлять деньги — блокировку вам никто не снимет.
Bootkits или загрузочные вирусы
В отличие от блокировщиков, явно сообщающих пользователю о своих целях, буткиты действуют незаметно, что куда более опасно для владельцев ПК. Прописываясь в загрузочные сектора дисков, буткиты тихо берут на себя управление ОС и получают доступ к личной информации хозяев компьютеров. Так злоумышленники завладевают аккаунтами пользователей, видят всю переписку, в том числе зашифрованную (ключи шифрования буткиты тоже воровать умеют) и даже могут похищать файлы.
Последние угрозы
Современные вирусы пишутся уже не только для ПК, но и для устройств под управлением Android, iOS и других мобильных ОС. Однако принцип их действия всё тот же, и в целом они укладываются в приведённую выше классификацию.
Кибепреступники по-прежнему используют любую возможность причинить вред другим в корыстных целях. Вот и недавно объявленная пандемия COVID-19 стала почвой для злоумышленников, стремящихся завладеть пользовательскими ценными данными. Так, в марте было запущено новое приложение, ворующее данные пользователей под видом приложения от ВОЗ по короновирусу. Запуская его, активируется троянец, который начинает собирать и пересылать своему создателю информацию об аккаунтах пользователей.
Также было организовано несколько кибератак на медицинские учреждения — одни злоумышленники пытались парализовать работу больниц, а другие (разработчики программы-вымогателя Maze) попытались заработать на шантаже, пообещав в случае невыполнения материальных требований слить данные о пациентах одного исследовательского центра в сеть. Денег вымогатели не получили, поэтому данные всех бывших пациентов были обнародованы.
Из других интересных новостей отметим 26 марта 2020 похищение одним из хакеров исходных кодов новых графических процессоров AMD. В сети появилось объявление от хакера о том, что он выложит эту информацию в открытый доступ, если не найдёт покупателя. Кроме этого, была обнаружена группа злоумышленников, разработавшая буткит Milum, который предоставляет своим владельцам полный доступ к заражённым хостам сайтов.
Легенды со знаком минус
Несмотря на то, что компьютерным вирусам нет ещё и полувека, за такой короткий период они уже успели хорошенько пошуметь и неоднократно вызывали страх у пользователей по всему миру.
Одна из самых первых эпидемий компьютерного вируса случилась в уже далёком 1988 году, когда по сети Arpanet в США стал гулять «великий червь» или червь Морриса, названный так по имени своего создателя, Роберта Морриса. Червь, подбирая пароли, наводнял своими копиями компьютеры пользователей сети и сумел таким образом заразить около 6 тысяч ПК, нанеся ущерб порядка 100 миллионов долларов — колоссальную по тем временам сумму, тем более для компьютерной программы. Создатель вируса добровольно во всём признался, поэтому получил 3 года условно, крупный штраф и был направлен на общественные работы. Это было первое наказание за компьютерное мошенничество. Впрочем, эпидемия червя Морриса сослужила добрую службу компьютерной безопасности — именно после атаки «великого червя» компьютерщики задумались о том, что после ввода неправильного пароля неплохо бы делать паузы. Сам же Моррис не потерялся и создал после этого несколько успешных проектов в сфере ПО.
В апреле 1999 года виртуальный мир узнал о новой угрозе — смертоносном для информации и ОС тайваньском вирусе CIH, который получил известность под другим названием: «Чернобыль» (был запущен в сеть 26 апреля). «Чернобыль» не только уничтожал файлы на жёстких дисках пользователей, но даже повреждал предустановленную систему BIOS, заразив таким образом около 500 тысяч ПК по всему миру. Впрочем, до массового распространения своего вируса тайваньский студент Чэнь Инхао (в 2000 году он был арестован, но затем отпущен) сначала потренировался «на кошках», беспечно заразив в июне 1998 года компьютеры родного университета, а затем под уже не контролируемую атаку вируса попали американские серверы, распространявшие компьютерные игры. Как потом выяснилось, ничего плохого Чэнь не замышлял, а вирус создал просто забавы ради, и после массового заражения переживал так сильно, что даже публично извинился перед пользователями китайского интернета, которые больше всего пострадали от «Чернобыля».
В мае 2000 года в компьютеры более трёх миллионов пользователей по всему миру проник через электронную почту филиппинский вирус ILOVEYOU, однако сделан он был не для признаний в любви. Ничего не подозревающие пользователи открывали вложения и через некоторое время обнаруживали, что важные файлы или уничтожены, или безнадёжно испорчены. При этом хитрый ILOVEYOU маскировался под текстовую программку (файлы вируса имели двойное расширение), поэтому распознать его было непросто. Этот «признавашка» нанёс ущерба приблизительно на 10 миллиардов долларов — больше, чем какой-либо другой компьютерный вирус.
Одним из самых долгоиграющих вирусов, который распространяется до сих пор, является буткит Backdoor. Win32. Sinowal. Этот загрузочный вирус прописывается в систему и берёт управление ей на себя, причём на уровне секторов диска. Этот вирус похищает даже ключи шифрования и отправляет разработчику личные данные, а также данные от аккаунтов пользователей. Подсчитать точный ущерб от него пока не представляется возможным, однако учитывая, что несколько лет антивирусные программы были не в состоянии даже обнаружить этого вредителя (Backdoor. Win32. Sinowal был разработан в 2009 году), то потери пользователей могут исчисляться многими миллионами и даже миллиардами долларов.
Одним из самых распространённых сетевых червей, использовавших уязвимости защиты Windows, стал Conficker (не совсем приличное англо-немецкое сокращение от Config Ficker, что можно перевести, как «имеющий конфигурации») запущенный в ноябре 2008 года. Уже через два месяца червь заразил более 12 миллионов компьютеров. Вычислить злодея было непросто, поскольку создатели научились оперативно менять серверы, с которых распространялась угроза. Помимо сетевого доступа, червяк мог также проникать в компьютеры через заражённые флешки. Conficker доставил пользователям немало неудобств: во-первых, он умел отключать обновления и «защитника» Windows и блокировать доступ к сайтам антивирусного ПО, из-за чего было невозможно получить актуальные базы данных вирусов. А главным неудобством было серьёзное замедление работы ПК: червяк на 100% нагружал процессор, не давая нормально работать. Также этот вредитель организовывал сетевые атаки с заражённых компьютеров.
Король электронного спама Festi, запущенный в 2009 году, ежедневно рассылал около 2,5 миллиардов имейлов с 250 тысяч айпи, то есть генерировал 25% всего мирового спама. Чтобы затруднить распознавание, разработчики снабдили свою вредоносную программку шифрованием, так что сигнатурный поиск антивирусными программами становится бесполезным и выручить может только глубокое сканирование. Распространяется этот вирус через установку платного кода (PPI), когда вебмастер получает деньги за то, что кто-то скачал файл с его сайта.
Вирус Stuxnet, в отличие от большинства «собратьев», приносит ущерб не виртуальной, а реальной инфраструктуре, проникая в цифровые системы управления и вызывая диверсии на промышленных и других важных объектах: например, электростанциях и аэропортах. Считается, что Stuxnet был разработан американцами и израильтянами для нанесения ущерба ядерной программе Ирана, однако успел навредить не только иранским объектам. Распространяется данный червь через USB-накопители и действует в компьютерах под управлением различных версий Windows.
Настоящим кошмаром для банкиров стал вирус Carbanak, который в 2014 году нанёс ущерб российским, американским, швейцарским, голландским, японским и украинским банкам на общую сумму 1 миллиард долларов. Carbanak действовал медленно, но уверенно, сначала собирая данные рядовых сотрудников банков, к которым попадал через вложения в электронных письмах, а затем внедряясь в верха и выводя крупные суммы. От проникновения в систему банка до успешного вывода могло пройти от 2 до 4 месяцев.
Более 500 тысяч пользователей компьютеров уже плачут из-за блокировщика WannaCry (переводится как «хочу плакать»), появившегося в мае 2017 года. Этот вымогатель, очень распространённый в России, на Украине и в Индии, шифрует содержимое ПК и выдаёт информацию на экран с требованием денег за разблокировку. Проникновение в систему происходит через открытые TCP-порты ПК. Сам червь не выбирает жертв по каким-либо признакам, поэтому парализует работу и обычных пользователей, и различных учреждений. Так, WannaCry стал причиной задержки важных операций в нескольких больницах в Великобритании, а у нас на некоторое время была парализована онлайн деятельность сотового оператора «Мегафон» и МВД России. Хотя сам по себе червь и «слеп», WannaCry может сознательно использоваться хакерами: например, в том же 2017 году при помощи этого червя были предприняты хакерские атаки на сетевую инфраструктуру «Сбербанка», но они были успешно отражены службой безопасности банка.
Интересно, что этот блокировщик был написан не с нуля: WannaCry представляет собой модифицированную версию Eternal Blue — вируса, написанного для нужд американского Агентства нацбезопасности (АНБ). Американцы в распространении этого вируса обвиняют спецслужбы КНДР, российское правительство уверено в том, что распространению WannaCry способствовали спецслужбы США, в то время как Microsoft использует более обтекаемые формулировки и говорит о «спецслужбах разных стран».
Как не заразить свой компьютер вирусами?
Переходим к рубрике Капитана очевидность 🙂
Прежде всего нужно позаботиться о наличии надёжного файервола, антивирусной и антишпионской программ (последние более эффективны при обнаружении и удалении вирусов категорий Spyware и Adware). Также существуют встроенные антивирусные решения для браузеров, ну а о том, что антивирусник должен работать с защитой в режиме реального времени, говорить, думаем, излишне.
Если на вашем ПК или в телефоне есть важные файлы (например, для работы), не забывайте регулярно делать их резервные копии («бэкапить»), причём копии должны храниться не в самом устройстве, а на внешних накопителях или в надёжных облачных хранилищах, которые в идеале должны быть защищены методом сквозного шифрования, чтобы никто, даже владельцы этого хранилища, не мог получить доступ к вашим файлам.
Позаботьтесь о безопасности при сёрфинге в интернете и отучитесь от привычки бездумно нажимать на баннеры и ссылки (тем более в электронных письмах!), а лучше вообще кликать только на те ссылки, в которых вы на 100% уверены. Сравнительно недавно (в 2014-2016 гг. ) был весьма распространён способ воровства аккаунтов Skype: пользователю приходило сообщение со взломанного аккаунта из списка контактов, в котором содержалась только ссылка. После нажатия на ссылку со своим аккаунтом можно было попрощаться.
Также могут помочь и блокировщики рекламы, которые, помимо прочего, активно борются со всплывающими окнами, которые могут содержать вредоносный код. Не забывайте периодически чистить кэш браузера — в этих файлах могут таиться шпионские и рекламные программы.
Если вы бороздите океаны интернета под пиратским флагом, будьте осторожны при скачивании и установке хакнутых платных программ: далеко не все хакеры альтруисты и выкладывают взломанные программы по доброте душевной. Поэтому, если антивирусник громко ругается на кряк, задумайтесь, так ли уж важна для вас эта программа, ведь сказать с уверенностью, что это срабатывание ложное, не может никто. Не скачивайте программы с сомнительных сайтов по распространению софта — они, как правило, подсовывают в установщики (исполняемые файлы exe) шпионское и другое ПО. Так что лучшим решением будет качать приложения непосредственно на сайтах разработчиков.
Файлы из сторонних источников следует проверять на соответствие расширению — например, двойное расширение почти наверняка говорит о том, что перед нами программа-вирус, поэтому не забудьте включить в Windows отображение расширений. Также заведите привычку обязательно проверять все скачанные файлы антивирусной программой и не открывайть те файлы, в безопасности которых вы не уверены. Сканировать, кстати, нужно и подключаемые накопители USB.
Безвредные вирусы — такое тоже бывает
Были в истории компьютерных вирусов и примеры забавных безвредных программ, которые технически являлись вирусами, но никакого ущерба пользователям при этом не наносили. Так, ещё в 1997 году был разработан вирус HPS, который был ориентирован на временное изменение графические bmp-файлов, которые могли отображаться в перевёрнутом или отражённом виде, что, правда, могло доставлять неудобства пользователям старых версий Windows, ведь они были построены с использованием как раз bmp-графики. Впрочем, никакого реального ущерба HPS не наносил, поэтому его с полным основанием можно назвать безвредным шуточным вирусом.
«Заботливый» Welchia
Мы поговорим о компьютерных вирусах, как о коде, который способен порождать собственные копии, изменяясь от поколения к поколению. Которому, как и его биологическим собратьям, необходим файл-носитель, работоспособный, и остающийся работоспособным, чтобы давать жизнь новым поколениям вируса. Которому для размножения необходима благодатная среда, много вкусных исполняемых файлов, а также, много глупых и активных пользователей, чтобы они их запускали. Так что название «вирус» не просто красивый ярлычок для описания вредоносной программы, компьютерный вирус, в его классическом понимании, является сущностью весьма близкой к его биологическому аналогу. Человечество, как это не раз доказывалось, способно создавать весьма изощренные решения, особенно когда дело касается создания чего-нибудь наносящего вред другим людям. Итак, давным-давно, после того, как DOS пришел к людям, и у каждого программиста появилась своя маленькая вселенная, где адресное пространство было единым, а права на файлы были всегда rwx, появилась мысль о том, может ли программа копировать сама себя. «Конечно, может!», – сказал программист и написал код, который копирует собственный исполняемый файл. Следующая мысль была «а могут ли две программы объединиться в одну?». «Конечно, могут!», – сказал программист и написал первый инфектор. «Только вот зачем?» – подумал он, и это стало началом эпохи компьютерных вирусов. Как оказалось, гадить на компьютере и всячески пытаться избежать обнаружения очень весело, а создание вирусов является очень интересным с точки зрения системного программиста делом. Кроме того, появившиеся на рынке антивирусы предоставляли создателям вирусов серьёзный вызов их профессионализму.
В общем, для статьи вполне достаточно лирики, перейдем к делу. Я хочу рассказать о классическом вирусе, его структуре, основных понятиях, методах детектирования и алгоритмах, которые используются обеими сторонами для победы.
Анатомия вируса
Мы будем говорить о вирусах, живущих в исполняемых файлах форматов 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
»
db “Hello, World!”, 0Dh, 0Ah
push 0x68732f2f ; “hs//”
push 0x6e69622f ; “nib/”
mov ebx, esp ; в ESP теперь адрес строки «/bin/sh»
mov al, 11
int 0x80
Все эти варианты кода при определенных условиях можно просто скопировать в память и сделать JMP на первую инструкцию. Правильно написав такой код, позаботившись о правильных смещениях, системных вызовах, чистоте стека до и после исполнения, и т. , его можно внедрять внутрь буфера с чужим кодом.
Предположим, вирмейкер имеет возможность написать код вируса в таком стиле, и теперь ему надо внедрить его в существующий исполняемый файл. Ему необходимо позаботиться о двух вещах:
- Куда положить вирус? Необходимо найти достаточно места, чтобы вирус туда поместился, записать его туда, по возможности не разломав файл и так, чтобы в области, в которой вирус окажется, было разрешено исполнение кода.
- Как передать управление на вирус? Просто положить вирус в файл недостаточно, надо еще совершить переход на его тело, а после завершения его работы вернуть управление программе-жертве. Или в другом порядке, но, в любом случае, мы же договорились не ломать ничего, да?
Итак, разберемся с внедрением в файл. Современные исполняемые форматы для платформы 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, используемый далее, – это точка входа, то есть адрес, на который системный загрузчик передаст управление после того, как подготовит исполняемый файл к запуску):
- JMP на тело вируса замещает первые байты, находящиеся в Entry Point файла. Затёртые байты вирус сохраняет в своём теле, и, по окончании собственной работы, восстанавливает их и передает управление на начало восстановленного буфера.
- Способ, похожий на предыдущий, но вместо байтов вирус сохраняет несколько полных машинных инструкций в Entry Point, тогда он может, ничего не восстанавливая (проследив только за корректной очисткой стека), выполнить их после окончания собственной работы и передать управление на адрес инструкции, следующей за «сворованными».
- Как и в случае с внедрением, есть способы и похитрее, но мы их тоже рассмотрим ниже, или отложим до следующей статьи.
Всё это – способы сделать корректную вставку буфера с кодом в некоторый исполняемый файл. При этом п. 2 и п. подразумевают функционал, позволяющий понять, какие байты являются инструкциями, и где находятся границы между инструкциями. Ведь мы не можем «разорвать» инструкцию пополам, в этом случае все сломается. Таким образом, мы плавно переходим к рассмотрению дизассемблеров в вирусах. Понятие принципа работы дизассемблеров нам понадобится для рассмотрения всех нормальных техник работы с исполняемым кодом, поэтому ничего страшного, если я немного опишу его сейчас.
Если мы внедрим свой код в позицию точно между инструкциями, то сможем сохранить контекст (стек, флаги) и, выполнив код вируса, восстановить все обратно, вернув управление программе-хосту. Конечно, с этим тоже могут быть проблемы, если используются средства контроля целостности кода, антиотладка и т. , но об этом тоже во второй статье. Для поиска такой позиции нам необходимо вот что:
- поставить указатель точно на начало какой-нибудь инструкции (просто так взять рандомное место в исполняемой секции и начать дизассемблирование с него нельзя, один и тот же байт может быть и опкодом инструкции, и данными)
- определить длину инструкции (для архитектуры x86 инструкции имеют разные длины)
- переместить указатель вперед на эту длину. Мы окажемся на начале следующей инструкции.
- повторять, пока не решим остановиться
Это минимальный функционал, необходимый для того, чтобы не попасть в середину инструкции, а функция, которая принимает указатель на байтовую строку, а в ответ отдает длину инструкции, называется дизассемблером длин. Например, алгоритм заражения может быть таким:
- Выбираем вкусный исполняемый файл (достаточно толстый, чтобы в него поместилось тело вируса, с нужным распределением секций и т.п.).
- Читаем свой код (код тела вируса).
- Берем несколько первых инструкций из файла-жертвы.
- Дописываем их к коду вируса (сохраняем информацию, необходимую для восстановления работоспособности).
- Дописываем к коду вируса переход на инструкцию, продолжающую исполнение кода-жертвы. Таким образом, после исполнения собственного кода вирус корректно исполнит пролог кода-жертвы.
- Создаем новую секцию, записываем туда код вируса и правим заголовок.
- На место этих первых инструкций кладем переход на код вируса.
Это вариант вполне себе корректного вируса, который может внедриться в исполняемый файл, ничего не сломать, скрыто выполнить свой код и вернуть исполнение программе-хосту. Теперь, давайте его ловить.
Анатомия детектора
Вдруг, откуда ни возьмись, появляется рыцарь на белом компе, в левой руке у него отладчик, а в правой – дизассемблер, программист антивирусной компании. Откуда он там взялся? Вы, конечно, догадались. С большой долей вероятности, он появился там из «смежной области». Антивирусная область в плане программирования весьма уважаема теми, кто в теме, ибо возиться этим ребятам приходится с весьма изощренными алгоритмами, причем в довольно стеснённых условиях. Сами посудите: у вас на входе сотня тысяч экземпляров всякой заразы и исполняемый файл, работать вы должны практически в реальном времени, а цена ошибки весьма высока.
Для антивируса, как и для любого конечного автомата, принимающего бинарное решение «да/нет» (инфицирован/здоров), существует два типа ошибок – 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», что не так уж и страшно. Обобщаем все вышеописанное, вот примерная структура записи в нашей антивирусной базе:
- ID вируса
- флаги, указывающие откуда считать смещение (от EP, от конца заголовка, от конца первой секции, от начала всех секций, от адреса перехода инструкции JMP в EP и т.п.)
- смещение (offset)
- длина сигнатуры (Lsig)
- CRC32 сигнатуры (CRCsig)
Оптимизируем вход (оставляем только сигнатуры, которые «влазят» в данный файл, сразу из заголовка подготавливаем набор необходимых смещений) и далее:
Сбор и каталогизация этой «гадости» является задачей весьма нетривиальной, но совершенно необходимой для качественного тестирования детектора. Сбор эталонной базы исполняемых файлов задача непростая: попробуйте найти все экземпляры зараженных файлов (для сложных случаев в нескольких экземплярах), каталогизировать их, перемешать с «чистыми» файлами и регулярно гонять по ним детектор с целью выявления ошибок детектирования. Такая база собирается годами, и является очень ценным активом антивирусных компаний. Возможно, я ошибаюсь, и её реально достать (всякие сервисы online-проверок на вирусы вполне в состоянии предоставить некоторый её аналог), но, когда я занимался этим вопросом, ничего похожего достать было нельзя (по крайней мере, под Linux).
Эвристический анализатор
Какое страшное слово – «эвристический анализатор», сейчас его и не увидишь в интерфейсах антивирусов (наверное, пугает пользователей). Это одна из самых интересных частей антивируса, так как в нее пихают все, что не укладывается ни в один из движков (ни сигнатурный, ни в эмулятор), и похож на доктора, который видит, что пациент кашляет и чихает, но определить конкретную болезнь не может. Это код, который проверяет файл на некоторые характерные признаки заражения. Примеры таких признаков:
- некорректный (испорченный вирусом, но работоспособный) заголовок файла
- JMP прямо в точке входа
- «rwx» на секции кода
Ну, и так далее. Помимо указания факта заражения, эвристик может помочь принять решение – запускать ли более «тяжелый» анализ файла? Каждый признак имеет разный вес, от «подозрительный какой-то» до «не знаю чем, но файл заражен точно». Именно эти признаки дают большинство ошибок «false positive». Не забудем также о том, что именно эвристик может предоставить антивирусной компании экземпляры потенциальных вирусов. Сработал эвристик, но ничего конкретного не было найдено? Значит файл точно является кандидатом на отправку в антивирусную компанию.
Межвидовое взаимодействие и эволюция
Как мы увидели, для быстрого и точного сравнения детектору необходимы сами байты сигнатуры и ее смещение. Или, другим языком, содержимое кода и адрес его расположения в файле-хосте. Поэтому понятно, как развивались идеи сокрытия исполняемого кода вирусов – по двум направлениям:
- сокрытие кода самого вируса;
- сокрытие его точки входа.
Сокрытие кода вируса в результате вылилось в появление полиморфных движков. То есть движков, позволяющих вирусу изменять свой код в каждом новом поколении. В каждом новом зараженном файле тело вируса мутирует, стараясь затруднить обнаружение. Таким образом, затрудняется создание содержимого сигнатуры.
Сокрытие точки входа (Entry Point Obscuring) в результате послужило толчком для появления в вирусных движках автоматических дизассемблеров для определения, как минимум, инструкций перехода. Вирус старается скрыть место, с которого происходит переход на его код, используя из файла то, что в итоге приводит к переходу: JMP, CALL, RET всякие, таблицы адресов и т. Таким образом, вирус затрудняет указание смещения сигнатуры.
Гораздо более подробно некоторые алгоритмы таких движков и детектора мы посмотрим во второй статье, которую я планирую написать в ближайшее время.
Параллельно с развитием вирусных движков и противостоящих им детекторов активно развивались коммерческие защиты исполняемых файлов. Появилось огромное количество небольших коммерческих программ, и разработчикам нужны были движки, позволяющие взять EXE-файл и «завернуть» его в некоторый «конверт», который умеет защищенным образом генерировать валидный серийный номер. А кто у нас умеет скрывать исполняемый код, и внедрять его в исполняемые файлы без потери работоспособности? Правильно, те самые разработчики из «смежной области». Поэтому написание хорошего полиморфного вируса и навесной защиты исполняемого файла – это очень похожие задачи, с использованием одних и тех же алгоритмов и инструментов. Так же схожи и процесс анализа вирусов и создания сигнатур и взлом коммерческого ПО. В обоих случаях надо добраться до истинного кода и либо создать сигнатуру, либо достать из него алгоритм генерации серийного номера.
Рассмотренный в статье детектор легко детектирует неполиморфные (мономорфными их назвать, что ли) вирусы. Ну а переход к полиморфным вирусам является отличным поводом, наконец, завершить эту статью, пообещав вернуться к более интересным методам сокрытия исполняемого кода во второй части.
Пользователи компьютеров Windows и Mac, смартфонов и планшетов находятся под постоянно растущей угрозой, исходящей от компьютерных вирусов и вредоносных программ. Принятие мер означает понимание того, с чем вы столкнулись. Рассмотрим основные типы вредоносных программ и их последствия.