Защищенная ось без антивирусов и тормозов

       

Эвристики


Эвристика

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

Идея эвристики уходит корнями в эпоху ранней юности MS-DOS и в общих чертах сводится к выявлению признаков, часто встречающихся в вирусах, но практически никогда — в легальных программах. Тогда это было легко! Код вируса писался на чистом ассемблере и укладывался в линейную структуру, которую легко "переваривал" эмулятор, распознающий ряд заложенных в него шаблонов. Например, если функция FindFist

вызывалась с маской *.com или *.exe, это давало основание предположить, что мы имеем дело с программой внедряющейся в исполняемые файлы. Но стоило зашифровать маску, использовать самомодифицирующийся код или другие хитрые приемы, как эвристик шел лесом. Шаблонный поиск уже не работал, а на полный анализ не хватало вычислительной мощности и хотя существовали эвристики, срабатывающие в 90% случаев (реальных 90%, а не "макетоидных"), большого распространения они не получили, поскольку требовали огромного времени на анализ, а пользователь он, как известно, ждать не любит.

Сейчас вычислительные мощности многократно возросли, но вместе с ними возросла и сложность вирусов. На место ассемблера пришли языки высокого уровня, линейный код распался и вирус превратился в запутанный клубок функций, взаимодействующих друг с другом самым невероятным образом. Сравните структуру вируса Boot/Brain.A, написанного в далеком 1984 году с червем W32/Bagle.AG@mm, созданным десять лет спустя — в 2004.

Рисунок 4 структура вируса Boot/Brain.A, написанного в 1984 году

Рисунок 5 структура червя W32/Bagle.AG, написанного в 2004 году

Даже если антивирусу удастся побороть упаковщик и передать эвристику распакованный код… никаких вирусных признаков ему все равно там ни за что не обнаружить, ну разве что это будет совсем пионерский вирус.
Наличие незашифрованных текстовых строк с ключами реестра, ответственными за автозапуск, имен исполняемых файлов антивирусных программ, команд в стиле "rm -rf /" с высокой степенью указывает на зловредную программу, но… их очень легко зашифровать.

Еще эвристик может анализировать таблицу импорта и аргументы, переедаемые функции GetProcAddress, и, если там встретиться WriteProcessMemory, VirtualAllocEx, CreateRemoteThread

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

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

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

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

Кстати говоря, еще во времена MS-DOS мыщъх носился с идей антивируса, распознающего не вирусы, а… легальные программы! Уже тогда количество существующих вирусов и их модификаций на несколько порядков (не двоичных!) превысило число популярных программ! В антивирусной базе содержатся контрольные суммы легальных программ, рассчитанные по алгоритму MD5, который очень сложно подделать, в результате чего факт заражения распознается влет независимо от алгоритма внедрения, а все неизвестные антивирусы программы попадают в категорию потенциально зараженных.При тесной кооперации разработчиков ПО с антивирусными компаниями, "потенциально зараженных" программ будет немного и это (в основном) будет программы, написанные на коленке неизвестно кем и неизвестно как. Ошибки, допущенные при их создании, зачастую несут ничуть не меньший ущерб чем вирусы. Забавно, но к этой идеи антивирусная индустрия начала подходить только сейчас, предлагая услуги по сертификации ПО, однако, сама сертификация — чисто формальная процедура и даже если цифровую подпись напрямую подделать нельзя (криптография не велит), можно подкупить (ввести в заблуждение) выдающего его человека, то есть круг замыкается.

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


Содержание раздела