Анимация
JavaScript
|
Главная Библионтека 3.2.3. Классификация антивирусных средств Все существующие антивирусные программы подразделяются на фаги, детекторы ревизоры, вакцины и резидентные сторожа. Фаг - это программа, обнаруживающая известные ей вирусы по сигнатурам, т. е. участ-кам кода, характерным именно для этого вируса. При обнаружении вируса он либо вычищается из файла (файлу при этом придается первоначальный вид или максимально близкий к таковому), либо (если файл безвозвратно запорчен) он удаляется. При этом желательно "убить" его, чтобы после случайного восстановления вирус не мог быть запущен. Детектор также обнаруживает вирусы, но в отличие от фага не может их чистить. Существуют детекторы, которые при обнаружении вируса вызывают фаг, передавая ему необходимые для чистки данные. Однако такой вариант явно не относится к числу самых удачных. Ревизор предназначен для контроля любых изменений на дисках, как-то: изменения кода зафузочных областей, изменения разбиения диска, появления/удаления/изменения файлов и т. д. Качественно разработанные ревизоры содержат также алгоритмы проверки оперативной памяти на отсутствие резидентно зафуженных стелс-вирусов. Для обнаружения конкретных вирусов по сигнатурам ревизор не предназначен. Профаммная вакцина предназначена для защиты профамм от заражения вирусами, проверяющими свое наличие в системе или в обрабатываемом файле. Это достигается установкой резидентных обработчиков прерываний, имитирующих ответ вирусов "Я уже зафужен", или дописыванием к незараженным файлам сигнатур, по которым вирус себя находит. Если резидентные вакцины вполне применимы (особенно в условиях дефицитг времени, когда нужно блокировать активность вируса в кратчайший срок), то файловьк в настоящее время безнадежно устарели. Вакцинировать файлы имело смысл в середиш 1980-х гг., когда существовало лишь несколько малочисленных семейств вирусов, мно гие из которых проверяли зараженность даже не по сигнатуре в файле, а по определен ным его атрибутам (например, ставились 62 секунды времени создания). В настояше время, когда число вирусов измеряется десятками тысяч, вакцинирование файлов бес смысленно и просто физически невозможно из-за многократного наложения сигнату друг на друга по смещению относительно начала/конца/трчки входа. Резидентный сторож - это профамма, отслеживающая обращения к системны: функциям, характерным для алгоритмов заражения профаммы вирусом, и спращивак щая у пользователя разрешение на их выполнение. Однако эти же функции (обращенр к файлам, форматирование сектора, установка резидентной программы и т. д.) активь используются и нормальными профаммами. Поэтому для всех существующих резиден: ных сторожей характерны одни и те же недостатки - большое число ложных тревг! и назойливость сообщений. При этом конкретный резидентный сторож относительна легко обходится или модификацией его обработчиков в оперативной памяти, или обр щением к аппаратным ресурсам напрямую. 3.2.4.1. Описание алгоритмов чистки Алгоритм чистки в общем случае обратен алгоритму заражения. СОМ-вирусы, записывающиеся в начало файла, HLLP-вирусы и вирусы, заражающие файлы по тем же алгоритмам, что и HLLP, вычищаются простым переносом кода или его кусков на те смещения, где им положено находится. Вирусы-спутники вычищаются переименованием файла-жертвы обратно в ЕХЕ. Перед этим может потребоваться считать из тела вируса расширение, под которым сохраняется файл-жертва, а если вирус шифрует его - то и ключ к шифру. Вирусы, замещающие профаммный код, портят файлы безвозвратно. Такие файлы можно только удалить. Для того чтобы вирус не запустился из восстановленного по ошибке файла, есть смысл записать в его начало команду 1NT 20h. Вирусы, алгоритмы заражения которыми основаны на структуре исполнимого файла, вычищаются сложнее. Однако все алгоритмы их вычищения из файлов сводятся к следующим нескольким шагам. 1) Если вирус шифруется - найти сигнатуру расшифровщика, считать ключ, расшифровать тело вируса. Сигнатура не найдена - выход, повторно считать код. 2) Проверить наличие сигнатуры вируса. Сигнатура не найдена - выход, повторно считать код. 3) Считать из тела вируса сохраненные поля заголовка профаммы-жертвы, восстановить заголовок. 4) Удалить из профаммы код вируса, восстановить код самой профаммы, переписав его по нужным смещениям. Вычищение из файлов резидентных вирусов бессмысленно, пока они находятся в оперативной памяти и могут заражать файлы повторно. Если вирус заражает файлы при их закрытии, то прогон антивируса не изменит вообще ничего. Алгоритм вычищения вируса из оперативной памяти включает в себя следующие действия: 1) Вызвать функцию "Я здесь" или проверить наличие в памяти (по определенн9му адресу или по смещениям относительно вектора соответствующего прерывания) сигнатуры вируса. Если вирус в памяти не обнаружен - выход. ) Считать из вирусного обработчика прерывания или из системных переменных адрес оригинального обработчика. ) Восстановить обработчик прерывания, освободить занятую вирусом область памяти. Затереть код вируса в памяти, например, нулями. В начало вирусного обработчика можно записать команду перехода на оригинальный. 3,2.4. Алгоритмы чистки Существуют резидентш>1е вирусы, перехватывающие одно из прерываний (например, таймера) для предотвращения освобождения векторов прерываний от вирусных обработчиков. Очевидно, что именно эти вектора при чистке вируса в ОП должны быть обезврежены первыми. Из этих же соображений вектора нужно поручать восстанавливать не функциями DOS 25h и 35h, а осуществлять эти действия прямым обращением к таблице векторов. Алгоритм вычищения загрузочного вируса включает в себя следующие шаги: 1) Считать системную область, проверить наличие сигнатуры вируса (при необходимости - после расшифрования). Не найдено - выход. 2) Переписать сохраненный вирусом код в MBR или BOOT, а если вирус нигде их не сохраняет - записать туда стандартный код из антивируса. 3) Затереть "хвост" вируса на диске. 3.2.4.2. Маскировка вирусов под другие вирусы или полезные программы Задача обнаружения любого компьютерного вируса сводится к обнаружению его сигнатуры в зараженной программе. Перед этим могут потребоваться расшифрование кода, детектирование полиморфного расшифровщика и генерация последовательности расшифрования (или прогон вируса на эмуляторе до расшифрования его кода), а в случае внедрения вируса без изменения заголовка профаммы (так называемая технология UEP) - еще и анализ команд передачи управления из точки входа. Однако авторы вирусов, зная использованную данным антивирусом сигнатуру и ее месторасположение в данном вирусе А, могут написать вирус Б, содержащий ту же сигнатуру по тому же смещению от начала/конца/точки входа. Это может привести к некорректной чистке файлов старой версией полифага, знающей вирус А и не знающей вирус Б. Возможны и другие "обманки". Почему это возможно. Одну из причин мы уже назвали. Как правило, сигнатура не является копией вируса, и вирус считается обнаруженным, если найдена заданная последовательность байт по заданному (или вычисляемому по известному алгоритму) смешению от начала/конца/точки входа. При достаточно большой (8-16 байт) длине сигнатуры и корректном ее выборе (очевидно, не стоит задавать в качестве сигнатуры 10 команл NOP или команды выхода в DOS) вероятность ложного срабатывания на незараженно файле стремится к нулю. Проще говоря, в данном месте данного незараженного файл сигнатуры достоверно не окажется. Однако все сказанное относится к незараженным файлам. Никто не мешает написать вирус, который будет подставлять именно эту сигнатуру именно по этому смешению-Что дальше? Антивирус сработает по известной ему сигнатуре, тогда как файл зара*" другим вирусом, имеющим другую длину, другие смещения сохраняемых байт и, мо* быть, даже другой алгоритм заражения. В результате "вычищенная" от вируса програМ** окажется заведомо неработоспособной. другая лазейка для "технокрыс" заключается в существовании стандартных тестов! файлов, например, EICAR. Подставив сигнатуру из этого файла в начало своего вирус можно добиться такого эффекта: не знающий данного вируса полифаг распознает зар ценные профаммы как "модификацию тестового файла E1CAR (НЕ вирус!)" или да) как неизмененный тестовый файл. Третья лазейка - это некачественные антивирусы, которые, кроме сигнатур вирусе .одержат сигнатуры "заведомо чистых" файлов. Например, TBAV при наличии такс сигнатуры в точке входа вообще не выполняет проверку файла на известные вирус! Лучше всего никаких сигнатур "заведомо чистых файлов" не использовать вообще, а у если без них не обойтись (как в случае с тестовым файлом EICAR), то проверка на i наличие должна выполняться после проверки на все вирусные сигнатуры. Как противодействовать таким вирусам. Меры противодействия авторам так1 вирусов достаточно очевидны: использовать длинные сигнатуры, выбирая для них куски кода, важнь!е для выполнен! (хотя это не всегда реально, а для вирусов, написанных на Ассемблере - нередко и з труднительно, опытный противник найдет способ вставить сигнатуру в нужное место); использовать более одной сигнатуры; сигнатурь! для стандартных тестовых файлов выбирать с таким расчетом, чтобь! пре тивнику приходилось модифицировать эти куски кода во избежание каких-либо hi желательных эффектов (например, выдачи на дисплей EICAR сообщения); реализуя антивирус, не включать в базу "неприкасаемые" сигнатуры; стандартнь!е тесп ровочные файль! (за исключением для названия вируса) описывать в вирусной базе та как если бы это был замещаюшда вирус, что приведет к его удалению в режиме чистки; в случае появления нового вируса, содержащего те же байты по тем же смещениял что и в уже известном по предыдущим версиям антивируса, включать его в антив! русную базу до этого уже известного, а лучше - переработать чистку обоих вирусо! изменив или расширив сигнатуры; антивирусь!, поддерживающие "неприкасаемые" сигнатуры (например, TBAV), сч1 тать заведомо некачественными, полностью исключить из применения, на жестки дисках не держать. 3.2.5. Пример замещающего вируса и ассемблерной подпрограммы его обнаружения в данном разделе рассматривается простой замещающий вирус Trivial.68 (он ж bHog.68), написанный на Ассемблере. Замещающие вирусы - самая примитивная разновидность компьютерных вирусов, н Одновременно и самая опасная. Если вирусы других разновидностей могут причинять вре ""За ошибок и/или специально запрофаммированных деструктивных функций, то у заме Ассемблер в задачах защиты информации ,I.C?.-"--"P°--"..".!f..:P.?.9 щающих вирусов деструктивен сам способ распространения. Они пишут себя в файл-жертву, начиная с нулевого смещения и не сохраняя где-либо замещаемый фраг-мент кода (отсюда их более точное английское название - overwriting, "переписывающие"). Вирус DHog.68, кроме необратимой порчи файлов непосредственно при заражении, оставляет в оперативной памяти так называемый "дутый резидент", т. е. выделяет блок памяти очень большого размера и не освобождает его. На компьютерах с фамотно настроенным менеджером памяти после запуска вируса остается порядка 100 килобайт, а если менеджера памяти нет, то свободной памяти может и не остаться вообще. Это, очевидно, приведет к зависанию DOS с выдачей сообщения "Не могу зафузить командный процессор!". Вирус заражает все файлы в текущем каталоге, сбрасывая атрибуты Readonly, Hidden и System. Исходный текст вируса представлен ниже. Для получения дизассемблированного исходного текста применен дизассемблер IDA 4.04. Он позволяет исследовать дизассемблированную профамму в интерактивном режиме (кстати, IDA и расшифровывается как Interactive DisAssembler), менять имена в полученном исходном тексте, именовать любые ячейки памяти, и так далее, и так далее! (Полный обзор функций и применения этой профаммы требует отдельной книги). Комментарии на английском языке в исходных текстах автоматически внесены дизассемблером. Комментарии на русском языке добавлены автором. Процесс дизассемблирования такого рода простеньких профамм несложен и не требуе! особых комментариев. Введя командную строку "idax.exe dhog.com", мы попадаем в сред) IDA, который выдает панель настройки режимов дизассемблирования. В нашем случае и> изменение не требуется. Убедитесь, что указан режим зафузки файла как СОМ-профаммь DOS и нажмите клавишу ENTER (или щелкните мышкой по кнопке ОК). Дизассемблер быстро обработает маленький вирус длиной 68 байт, выдаст сообщение "READY в верхней строке экрана и перейдет в режим ожидания команд пользователя. Войдит( в меню File\Produce outpuf file и сохраните результат дизассемблирования в ASM-файле. При перекомпиляции дизассемблированных исходных текстов надо помнить, что у вас скорее всего, окажется другой компилятор (например, TASM вместо MASM) и уж навер няка - другие настройки компилятора. Поэтому, прежде чем компилировать сохраненньп в среде IDA текст, не поленитесь исследовать его на предмет чисел, требующих замены н псевдооператоры OFFSET или EQU. Тогда компилятор автоматически подставит в коман ды правильные смещения, и перетранслированная профамма выдаст по DOS-функцин 09 требуемое сообщение. IDA хорош в этом отношении тем, что позволяет именовать ячейк памяти в интерактивном режиме. Например, ниже в исходном тексте есть такой фрагмент: mov ah, 4Eh dx, 140h 21h Это поиск по маске первого файла, flsjwo чтобы избежать лишних зависаний пр перетрансляции, нужно перейти в окне дизассемблированного кода в IDA на адрес C 140h, нажать клавишу N и ввести какое-либо имя (в примере - aMaskForVir). ПоиМ йте таким образом все переменные и только после этого сохраняйте файл с исходг текстом на диск. Итак, переходим к исходному тексту вируса DHog.68. .=== DHOG.ASM ======================================== segOOO segment byte public CODE assume csrsegOOO org lOOh assume es:nothing, public start near ah, 4Eh dx, nOh ss;nothing, ds;segOO0 start proc mov mov loc 0 107: mov mov mov mov mov mov raov int raov raov ah, al, dx, ah, al, dx, cl, 43h 1 ax, dx, 3D01h 9Eh ; xchg ax, bx raov raov nop nop ah, cl. 40h 44h ; Поиск первого файла по маске *.* ; D0S-2+ - FIND FIRST ASCIZ (FINDFIRST) ; cx = search attributes ; DS: DX -> ASCIZ filespec ; (drive, path, and wildcards allowed) CODE XREF: start+37ij Получить атрибуты найденного файла DOS - 2+ - GET FILE ATTRIBUTES DS: DX -> ASCIZ file name or directory name without trailing slash Сбросить атрибуты DOS - 2+ - SET FILE ATTRIBUTES DS: DX -> ASCIZ file name CX = file attribute bits Открыть файл-жертву ; для записи ; DOS - 2+ - OPEN DISK FILE ; WITH HANDLE ; DS: DX -> ASCIZ filename ; AL = access mode . ; 1 - write Exchange Register/Memory ; with Register No Operation No Operation 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 [ 40 ] 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |