Анимация
JavaScript


Главная  Библионтека 

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

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