Поговорим немного об эвристическом анализе
Автор: Климентьев К.
Все нижесказанное - плод авторских размышлений и догадок, оно может истине и не соответствовать :)
Под эвристическим анализом (греч. heurisco - искать, открывать) в вирусологии сейчас принято понимать комплекс методов, позволяющих произвести автоматическую оценку "вирусности" любой конкретной программы.
Вы, вероятно, сталкивались с интересным фактом - при работе некоторых антивирусов на экран выдаются предупреждающие сообщения типа: файл возможно заражен EXE.COM.CRYPT-вирусом. Это означает, что антивирус изучил код программы и пришел к выводу - этот код (или его часть) может принадлежать зловредному электронному микроорганизму. Это - результат произведенного антивирусом эвристического анализа.
Принцип действия подобных эвристических анализаторов, вероятнее всего, заключается в следующем: антивирус содержит в себе интереснейший механизм эмуляции работы процессора. Антивирус считывает код программы и начинает ее выполнять, но не по-настоящему, а "понарошку" :) Он делает вид, что выполняет процессорные команды, а на самом деле, анализируя их код, видоизменяет соответствующим образом значения своих внутренних образов регистров и ячеек оперативной памяти.
Этот процесс можно увидеть визуально, запустив антивирус MScan с ключом /as. В правом верхнем углу появляется окно, несколько напоминающее окно некоего отладчика и содержащее дизассемблированный фрагмент исследуемой программы и значения всех регистров. Словно бы невидимая рука нажимает клавишу пошаговой трассировки, и цветовой селектор, отмечающий текущую команду, скачет по окну, вызывая перемигивание отображаемых значений регистров и флагов.
Если код программы зашифрован, то антивирус пошагово "раскрутит" его. И не помогут никакие ухищрения с Int1/Int3, обычно затрудняющие работу в "настоящих" отладчиках, ведь все это исполнение - понарошку !
Даже если вирус полиморфный, рано или поздно- после отработки всех его расшифровщиков- в памяти будет лежать его "ядро" - неизменяемый фрагмент, содержащий сигнатуру. Таким образом, к определению сигнатуры достаточно добавить всего один параметр - число шагов, после которых заведомо эта сигнатура появится в памяти.
Собственно эвристический анализ заключается в следующем в процессе пошагового выполнения антивирус "загибает пальцы":
- встретилось call Next - загнули большой палец;
- появилось pop si - загнули указательный, а если все-таки выполнился ret - просто разогнули большой;
- если sub si, 103h - загнули средний и т.п.
После окончания работы антивирус "считает фишки", и если их больше чем надо - раздается вопль: вероятен вирус! :-)
Конечно, это очень упрощенная схема. Но уже на ней видны основные недостатки современных эвристических анализаторов:
а) если гипотетический вирус в процессе своей работы взаимодействует с железом, то эмулятор процессора не сможет этого отловить, это для него - verboten!
б) "глубина" эвристического анализа не слишком велика, ибо приходится держать в памяти не только содержимое регистров, но и содержимоее (возможно больших) фрагментов ОЗУ, а также крайне сложно пытаться эмулировать работу "толстых" программ, написанных на языках высокого уровня.
Используют эвристический анализ многие современные антивирусы.
:: на начало ::