Крис Касперски
Глобальных эпидемий не вспыхивало уже несколько лет, но локальные очаги
заражения продолжают разрастаться, осваивая новые территории. Покажем, как обнаруживать свыше 90% заразы бесплатным ПО. Главным
образом, мы будем говорить о Server 2003/XP, однако сказанное во многом
справедливо и для Server 2008/Vista.
Антивирусы, изначально рассчитанные на борьбу с вирусами (то есть с
саморазмножающимися программами, внедряющими свою, возможно, слегка измененную
копию в другие файлы) к нашествию троянских коней оказались совершенно не
готовы. Троянская программа никуда не внедряется, пишется (на основе готовых
компонентов) чуть ли не за несколько
минут, после чего обрабатывается упаковщиком/протектором и «сливается» в Сеть,
например, путем широковещательной/избирательной почтовой рассылки. К тому
времени, пока пользователи заподозрят что-то неладное и пошлют файл в
антивирусный центр на исследование (если еще найдут его на диске!), вредоносное
программное обеспечение (далее по тексту именуемое malware) уже сделает свое
черное дело, например, разошлет спам, найдет и передаст конфиденциальную
информацию, создаст новую учетную запись, допускающую удаленное подключение
хакера и т. д. Грамотно спроектированное malware обычно уничтожает себя
буквально через несколько минут, а то и секунд после запуска вредоносного
файла.
Основную зацепку представляют готовые компоненты,
используемые хакерами, чтобы не писать каждый экземпляр malware с нуля.
Теоретически их можно занести в базу сигнатур, детектируя заразу на ранних
стадиях внедрения. Практически же универсальный распаковщик, встроенный в
антивирусы, справляется лишь с простейшими упаковщиками. Все, что посложнее, –
распаковывается набором статических распаковщиков, запрограммированных вручную
и «тупо» повторяющих алгоритм оригинального упаковщика. Проблема в том, что
алгоритм упаковки может быть легко изменен прямо в hex-редакторе. Хакеру
достаточно перенести оригинальную точку входа (OEP – Original Entry Point) в
другое место, чтобы обхитрить антивирус или воткнуть в начало файла
конструкцию, вызывающую у антивируса «несварение желудка».
Обычно это что-то из набора команд SSE/SSE2/SSE3
– в настоящий момент их не эмулирует ни один антивирус, а переменная длина
x86-команд не позволяет продолжить декодирование инструкций после встречи с
первой же неизвестной командой. То же самое относится и к самомодифицирующемуся
коду (особенно выполняющемуся на стеке), структурным исключениям… Да что там
говорить, хакеру достаточно «закрутить» цикл, исполняющийся секунду или около
того, чтобы эмулятор антивируса «отвалился» по тайм-ауту. Никакой антивирус не
эмулирует кодов ошибок, возвращаемых API-функциями, которые могут быть
использованы для расшифровки остального тела файла (скажем, malware открывает
заведомо несуществующий файл, но антивирус-то этого не знает! А «подобрать»
правильный ключ расшифровки – выше его сил!).