av8way

любовь с эвристикой в непристойных позах\\ (и avi-картинках)

крис касперски ака мыщъх, no-email

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

Эвристические анализаторы обладают поразительной способностью «палить» ни в чем не повинные программы (см. рис. 9, 10), пропуская деструктивную заразу ниже радаров. Убытки от ложных позитивных срабатываний на самом деле очень значительны. Никакой дилер не возьмется распространять программу, если антивирус ругается на нее матом. Тоже самое относится и к простым пользователям, скачавшим дистрибутив непосредственно с web/ftp сервера самого разработчика. Вот и докажи после этого, что ты не козел, или, говоря математическим языком, козел не ты. Требуется приложить большие усилия, доказывая производителю антивируса, что твоя компания «левых» людей в своем штате не держит и деструктивного кода здесь нет (кто не верит, может заглянуть в исходные тексты, естественно под подписку о неразглашении). Если повезет, создатели антивируса пойдут на уступки и добавят новое правило в базу, устанавливающее для _данного_ файла флаг исключения, но… запятнанной репутации (и потерянных клиентов) это, увы, не вернет.

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

Мыщъх благодарит BrokenSword'а, supersonic'а, slow'a, Dr.Golov'a и Brutaller'а за тактико-техническую стратегическую поддержку и прицельный артиллерийский огонь.

Антивирусы, как известно, стоят денег (причем, немалых) и этих антивирусов достаточно много для того, чтобы оставить мыщъх'а без штанов, если покупать весь этот арсенал за живую наличность. Можно, конечно, добыть их в осле или ином парнокопытном, но… это будет нечестно, да и места они занимают не меньше чем стадо слонопотамов, а уж как конфликтуют друг с другом — только бивни летят! Демонстрационные версии, распространяемые забесплатно, зачастую поставляются в урезанном виде без эвристического анализатора (причем, этот факт далеко не всегда отмечен в документации), так что для объективного тестирования они категорически не подходят.

К счастью, практически все крупные игроки, присутствующие на антивирусном рынке, поддерживают бесплатные on-line сканеры, а некоторые (как, например, Лаборатория Касперского — www.avp.ru) даже предоставляет полноценный антивирус в виде ActiveX модуля с поддержкой автоматического обновления (см. рис. 1) — просто фантастика!

Рисунок 1 бесплатный ActiveX сканер от Лаборатории Касперского за работой

Проблема в том, что антивирусных компаний _очень_ много и плановый обход их служб занимает значительное время. Вот почему в сети появились мета-антивирусы, самостоятельно прогоняющие закаченный пользователем файл через все известные им on-line сервисы. Одним из таких антивирусов является знаменитый http://virusscan.jotti.org, поддерживающий AntiVir, ArcaVir, Avast, AVGAntivirus, BitDefender, ClamAV, Dr.Web, F-ProtAntivirus, Fortinet, KasperskyAnti-Virus, NOD32, NormanVirusControl, VirusBuster и VBA32.

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

Рисунок 2 знаменитый мета-антивирус http://virusscan.jotti.org говорит, что прежде нас обслужат придется подождать еще 27 секунд (на самом деле, как правило, значительно дольше)

Другой не менее знаменитый мета-антивирус с громким именем VIRUS TOTAL (http:www.virustotal.com/en/indexf.html) намного более выносив в плане нагрузки, к тому же он автоматически ведет мониторинг вирусной активности (см. рис. 3), да и список поддерживаемых антивирусов у него побогаче: AntiVir, Authentium, Avast, AVG, BitDefender, CAT-QuickHeal, ClamAV, DrWeb, eTrust-InoculateIT, eTrust-Vet, Ewido, Fortinet, F-Prot, F-Prot4, Ikarus, Kaspersky, McAfee, Microsoft, NOD32v2, Norman, Panda, Sophos, TheHacker, UNA, VBA32 и VirusBuster. Рисунок 3 мета-антивирус VIRUSTOTAL Всякий уважающий себя программист просто обязательно должен проверить только что откомпилированный файл на «вшивость» — вдруг эвристикам захочется поругаться?! К счастью, все эвристики, не смотря на их крутость, довольно тупые создания и их легко обмануть и чуть позже мыщъх покажет как (для людей в «погонах»: речь идет о _честных_ программах, созданных _законопослушными_ программистами без мысли кому-то что-то оторвать, или где-то навредить, а если статьей воспользуются серые крысы со стальным хвостом, то это уже _ваша_ проблема! и нечего вешать ее на меня). ===== секс с эвристиком - с перезервативом и без ===== Женская суть, как известно, есть точка схождения двух прямых — ее ног. Из этой точки на свет появляются антивирусы (ну, если не сами антивирусы, то их создатели — наверняка). Собственно говоря, живого вируса (то есть программу, паразитирующую на других программах) народ не видел уже давно и сейчас все чаще встречаются черви, троянские компоненты и другие программы, копирующие свою тушу на компьютер и передающую на нее управление тем или иным путем. Ни в какие файлы они _не_ внедряются, поскольку это довольно сложно запрограммировать (намного сложнее, чем написать троянскую лошадь), да и какой смысл внедряться в файл? Это в эпоху ранней молодости MS-DOS и тотального отсутствия Интернета, пользователи менялись файлами как любовницами, «опыляя» и «переопыляя» друг друга перекрестным способом. Скорость распространения вирусов определялась именно интенсивностью «опыления», сейчас же основная масса файлов скачивается из Сети. Достаточно выложить программу, начиненную взрывчаткой, на какой-нибудь сервер, устроить массовую рассылку или забросить shell-код через дыру в системе… Отказ от механизма внедрения в исполняемый файл на 90% упрощает конструкцию вируса, попутно открывая невиданные ранее перспективны. На смену изощренным полиморфным генераторам пришли упаковщики и протекторы. Троянская лошадь, обработанная новой версией крутого (или не крутого, но малоизвестного) протектора, уже не будет распознана. Сигнатурный поиск отдыхает. Сейчас троянские компоненты пишутся на языках высокого уровня всеми кому не лень, увеличивая свою популяцию на пару десятков экземпляров каждый день. А многие атакующие программы разрабатываются специально под конкретно взятую жертву и в антивирусные базы никогда не попадают! Спасти ситуацию может только правильная политика разграничения доступа и эвристический анализ. Операционные системы семейства NT позволяют выборочно назначать привилегии и устанавливать произвольные права доступа к файлам и ветвям системного реестра. Троянская лошадь, запущенная из-под ограниченного аккаунта, может обильно унавозить территорию, но ничего деструктивного совершить не сможет. Естественно, при условии, что в системе нет дыр, а тот кто сидит за штурвалом этой самой системы, умеет рулить. К сожалению, подавляющее большинство пользователь знает только две кнопки (одна из которых — тормоз). А программисты до сих пор не могут научиться писать программы, работающие на минимально возможном уровне привилегий. Вот пользователи и сидят под «администраторами», молясь на эвристику словно на икону. Но икона — это только графический интерфейс. Что же находится под ним?! ===== »> врезка расстрел без распаковки ===== Для «опознания» уже известного червя или троянского коня (содержащегося в антивирусной базе) совершенно необязательно его распаковывать. Достаточно просто выделить сигнатуру _упакованного_ файла. Большинство антивирусов именно так и поступают. Конечно, повторная упаковка скрывает сигнатуру на все 100%, вынуждая антивирус прибегнуть к распаковке, но… большинство червей распространяют свое тело, не внося в него никаких изменений! Полиморфные черви, уделяющие большое внимание запутыванию кода, зачастую совершенно забывают о PE-заголовке и множество записей антивируса NOD32, относящиеся к полиморфным червям, ловят их именно по неизменному (или предсказуемому) содержанию PE-заголовка, структуре раскладке секций и т. д. Подлинный полиморфизм — очень редкая вещь, в живой природе практически не встречающаяся. ===== внутри эвристика ===== Архитектурно эвристик состоит из следующих модулей: набора статических распаковщиков, эмулятора ЦП (а, в некоторых случаях, и операционной системы), реконструктора структур данных и поток управления (dataandcontrolflows) поверх которых «натянут» собственно сам эвристический анализатор, представляющий собой совокупность детекторов «правил». В чистом виде система правил совершенно бесполезна, и чтобы эвристический анализатор работал как полагается, ему необходимы данные, собираемые остальными компонентами антивируса. AVP славится своим арсеналом статических распаковщиков и оперативно обновляемой базой данной. Эмулятор (или что они называет эти словом) у них явно слабоват. Простая модификация кода упаковщика «ослепляет» AVP и с протекторами уровня ASProtect эмулятор AVP уже не справляется. У NOD32, напротив, база статических упаковщиков так себе, на уровне слабого подобия левой руки, но зато эмулятор поддерживает практически полный набор инструкций процессора в том числе MMX и FPU. Но NormanVirusControl в этом смысле еще круче. Помимо виртуального процессора он создает своеобразною «песочницу» (sandbox), эмулирующую реестр и файловую систему, что позволяет ему запускать исследуемый файл и безо всякой эвристики обнаруживать происходящие изменения. Но это все, что касалось распаковщиков — первой стадии анализа, за которой немедленно следует вторая — выявление совокупности признаков, характерных для троянских коней и практически никогда не встречающихся в «честных» программах. В общем виде поставленная задача решения не имеет и потому приходится создавать так называемые «наборы правил». Например, если аргумент szFileName функции UrlDownloadToFile (равно как и FTPGetFileA) указывает на исполняемый файл, NOD32 выставляет флаг 142h, означающий «probablyunknownNewHeur_PEvirus». То же самое происходит, если вслед за UrlDownloadToFile идет вызов ShellExecute. Вся сложность — разобраться в потоке вызовов, ведь во вредоносном коде эти функции не всегда следует непосредственно друг за другом, а разделяются мусорными инструкциями, аргументы функций «перегоняются» через несколько регистров/переменных и т. д. Вот тут-то анализатор потока управления и выручает. Вместо утомительной и совершенно бесперспективной трассировке (выполняемой, естественно, на виртуальном ЦП), эвристик просто «хватает» константные смещения, пытаясь преобразовать их в указатели, образующие паутину перекрестных ссылок (по такому же принципу, кстати говоря, работает и IDA Pro). Имея в своем распоряжении распакованный образ файла в памяти, эвристический анализатор находит все используемые переменные (которые только может найти), затем по перекрестным ссылкам определяет места их инициализации, а так же использование этих переменных всеми возможными способами ('o' – offset: загрузка указателя, 'r' – read: чтение содержимого, 'w' – write: запись). Конечный результат работы представляет собой сложную структуру данных, в которой все переменные представлены теми значениями, какие они будут иметь на момент вызова соответствующих API-функций. Естественно, без помощи эмулятора анализатор структур данных не обходится, поскольку, в противном случае, простейший XOR мог бы замаскировать всю нежелательную троянскую активность или вот например, как без эмулятора определить какое значение имеет переменные foo и pAPI в следующем коде: MOV [foo], offset text_file XOR EAX,EAX JNZ init_aAPI MOV [foo], offset exe_file init_aAPI: MOV [pAPI], offset CreateFileA XOR ECX,ECX JNZ call_pAPI MOV [pAPI], offset GetVersion call_pAPI: Листинг 1 пример кода, требующего применения эмулятора ЦП Если учитывать _только_ перекрестные ссылки, то антивирус увидит, что обе переменные инициализируются дважды, но какое значение из двух правильное? Без эмулятора, антивирус должен перебрать четыре комбинации, а в реальной программе этих комбинаций окажутся сотни миллионов!!! Напротив, эмулятор ЦП тут же покажет какие условные переходы выполняются, а какие нет. Однако, эмуляторы не всесильны. В частности, они не понимают самомодифицирующегося кода, недокументированных инструкций да и просто незнакомым им команд. Поскольку, в x86 команды имеют разную длину, то продолжить декодирование и эмуляцию инструкций после встречи с неизвестной командой эмулятор не может. Но тут его выручают перекрестные ссылки на данные и тогда вместо анализа всего кода программы от точки входа до многодетной матери, происходит «отрывочный» анализ тех фрагментов, на которые указывает хотя бы одна перекрестная ссылка. Вывод: чтобы «ослепить» анализатор потоков данных следует исключить все константные смещения, заменив их сложными математическими преобразованиями, неподвластными эмулятору. Впрочем, многие программы «палятся» и без всякой эмуляции. Антивирусу достаточно взглянуть на точку входа и, если она указывает на последнюю загружаемую секцию файла или лежит внутри PE-заголовка, файл приговаривается к расстрелу без предупреждений. Но вот что интересно — если в оригинальной точке входа находится jump на вирусный код, эвристические анализаторы оставляют этот факт без внимания. Интересно почему? Ведь в честных программах такие трюки практически не встречаются…. Но это все была теория. Теперь самое время перейти к практике и продемонстрировать несколько _совершенно_ _безобидных_ программ, вызывающих недовольство эвристических анализаторов. ===== »> врезка антивирус как универсальный распаковщик ===== Во времена старушки MS-DOS, когда новые упаковщики исполняемых файлов появлялись как грибы, а достойных отладчиков (не считая CUP'а) не существовало, очень многие хакеры в качестве универсального распаковщика использовали… антивирус Dr. WEB, содержащий большое количество грамотно написанных статических распаковщиков, выдающих на выходе вполне работоспособные EXE, записываемые во временные файлы, автоматически удаляемые в процессе сканирования. Кто-то давил на RESET, чтобы опередить антивирус и не дать распакованному «добру» бесславно погибнуть, кто-то запускал утилиты UNERASE/UNDELETE, а кто-то вешал на функцию 41h (unlink) прерывания INT 21h специальную «заглушку» имитирующую удаление файла… И что же изменилось за прошедший десяток лет (да какой там десяток! на наших глазах сменилось несколько поколений операционных систем, оставивших позади себя занесенную песком вечность, навеки ставшую достоянием истории). А ничего! То есть ни хрена! Все как было, так и осталось! Тот же NOD32 кладет распаковываемый файл в каталог \documents‑n‑settings\user-name\local settings\temp\, только XOR'ит его байтом A5h. Аналогичным образом поступают и другие антивирусы. Для чего это делается? Шифровать-то зачем?! Все очень просто — поскольку Windows это совсем не MS-DOS и «зоопарк» антивирусов для нее вполне обычное дело, только представьте себе, что произойдет, если NOD32 начнет распаковывать вредоносный файл в temp, где его тут же словит антивирусный монитор Dr.WEB или AVP! Как определить ключ (и алгоритм!) шифровки?! Можно, конечно, дизассемблировать антивирус, распотрошив его как рождественского гуся, только зачем так напрягаться?! В подавляющем большинстве случаев шифровка происходит по XOR, ну а ключ восстанавливается прямой атакой на открытый текст: «MZ», «PE» и т. д., причем удается восстановить не только байтовые ключи, но и более длинные гаммы, поскольку любой PE-файл содержит до фига предсказуемой информации, к тому же всегда существует возможность запаковать _свой_ _собственный_ файл и скормить его антивирусу. Исключение составляют антивирусы, заново генерирующую гамму для каждого нового файла, но такие «уродцы» мне пока не встречались. ===== [N0]: не выносите точку входа за пределы .text ===== Утро начинается с зарядки (если только не брать тяжелое похмелье в расчет), ну а хакерство — с легкой разминки, которой в данном случае будут игры с точкой входа в PE-файл. Создадим простейшую программу следующего содержимого, откомпилируем ее и будем пытать, прямо как немцы в Гестапо: #include <stdio.h> main() { printf(«hello!\n»); } Листинг 2 программа, предназначенная для экспериментов с точкой входа Убедившись, что все (до единого!) антивирусы к ней благосклонны, загружаем файл в HIEW, нажимаем <ENTER> для перехода в hex-режим и давим <F8>, чтобы отобразить PE-заголовок. Смотрим на RVA-адрес точки входа (в моем случае он равен 1043h), складываем его с Image base (400000h) и получаем: 401043h. Записываем на бумажке и нажимаем <F6>, показывающую каталог секций. Подгоняем курсор к секции .data, давим <ENTER> и спускаем курсор на несколько строк вниз, где начинаются сплошные нули (в моем случае это: 4060A0h). Нажимаем еще раз <ENETR> для перехода в ассемблерный режим и <F3> для разрешения редактирования. После чего вводим следующую последовательность команд: MOV EAX, 401043h/JMP EAX, где 401043h адрес «моей» точки входа. Сохраняем изменения по <F9>, двойным нажатием на <ENTER> возвращаемся в hex-режим, переходим в начало файла, находим сигнатуру «PE», отсчитываем от ее начала 28h байт и записываем RVA-адрес новой точки входа, в нашем случае равный 60A0h (4060A0h - Imagebase), естественно, записывать его надлежит в обратном порядке (A0h 60h). Сохраняем изменения, выходим из hiew'а и загружаем файл в свой любимый мета-антивирус, например, virusscan.jotti.org. Все антивирусы отвечают гробовым молчанием (см. рис. 4), лишь «sandboxemulation» (эмуляция в песочнице) выбрасывает желтый флаг опасности, предупреждая, что это может быть malware. Рисунок 4 реакция антивирусов, собранных под крышей virusscan.jotti.org на точку входа в файл, находящуюся в последней секции PE-файла А вот VIRUS TOTAL дает куда более суровый результат и ворчит довольно-таки здорово (см. рис. 5), выдавая нам следующую замечательную табличку (см. таблицу 1). ^антивирус^версия^обновление^результат| |CAT-QuickHeal|8.00|11.07.2006|(Suspicious) - DNAScan| |Fortinet|2.82.0.0|11.08.2006|suspicious| |Ikarus|0.2.65.0|11.07.2006|Win32.SuspectCrc| |Panda|9.0.0.4|11.07.2006|Suspicious file| Таблица 1 результат проверки файла с точкой входа, находящейся в последней секции файла мета-антивирусом VIRUS TOTAL (антивирусы, не обнаружившие ничего подозрительного, для наглядности опущены) Рисунок 5 реакция антивирусов, собранных под крышей VIRUS TOTAL на точку входа в файл, находящуюся в последней секции PE-файла А теперь слегка изменим тактику и передвинем точку входа в PE-заголовок (например, можно разместить MOV EAX, 401043h/JMP EAX за концом таблицы секций, следом за .text, .data…). Товарищ virusscan.jotti.org сразу же взводит красный флаг «INFECTED/MALWARE», а антивирус ArcaVir говорит: Heur.Win95. «Heur», очевидно, сокращение от «heuristic» – эвристика (см. рис. 6). Рисунок 6 реакция антивирусов, собранных под крышей virusscan.jotti.org на точку входа в файл, находящуюся в PE-заголовке VIRUSTOTAL тоже ругается, но как-то невнятно (см. рис. 7), тем не менее, сразу два антивируса: CAT-QuickHeal и Fortinet предупреждают нас о грозящей опасности. Рисунок 7 реакция антивирусов, собранных под крышей VIRUS TOTAL на точку входа в файл, находящуюся в PE-заголовке ===== [N1]: не пользуйтесь полиморфными упаковщиками ===== Упаковывая свой файл крутым полиморфным протектором, вы серьезно рискуете нарваться на крупные неприятности. Возьмем, к примеру, одну из поздних версий популярного hex-редактора HIEW (со штампом времени 3EDAFCCFh), упакованную ASPack'ом и для «надежности» еще и Viogen Crypt'ом, что PEiD замечательно подтверждает (см. рис. 8) Рисунок 8 PEiD показывает, что HIEW запакован протектором VirogenCrypt 0.75 А теперь пропустим этот HIEW (в котором _доподлинно_ ничего деструктивного нет) через строй антивирусов. Батюшки! Какой шухер поднимается!!! Несмотря на то, что virusscan.jotti.org успешно распознает упаковщик (см. рис. 9), антивирусы от этого не успокаиваются и вопят как свиньи, заживо смываемые в унитаз (по классификации гн. Голубицкого, ну того который в шлеме)! AntiVir категорично классифицирует его (HIEW, а не Голубицкого) как «Backdoor-Server/Bifrose.B backdoor». Avast, чуть более деликатный в своих суждениях, видит в нем типичный троянский компонент, неизвестный науке: «Win32:Trojan-gen. {Other}», NormanVirusControl без всякой эвристики выдает конкретное имя «W32/Bifrose.CRL», ну а VBA32 просто говорит, что это «Backdoor.Win32.Rbot.on». Вот так, безо всяких церемоний опустили HIEW'а! Раньше на него ругался и AVP на пару с Dr.WEB'ом, но теперь они чего-то притихли. Наверное, стыдно стало. Или Сусликов их запинал. Рисунок 9 реакция антивирусов, собранных под крышей virusscan.jotti.org на HIEW, упакованный протектором Viogen Crypt VIRUS TOTAL, использующий другую версию антивируса AntiVir**, говорит что это «BDS/Bifrose.B» (см. рис. 10), к нему же присовокупляются и другие ругающиеся, объединенные для наглядности в следующую таблицу (см. таблицу 2). ^антивирус^версия^обновление^результат| |AntiVir|7.2.0.39|11.07.2006|BDS/Bifrose.B| |Avast|4.7.892.0|11.07.2006|Win32:Trojan-gen. {Other}| |CAT-QuickHeal|8.00|11.07.2006|(Suspicious) - DNAScan| |Fortinet|2.82.0.0|11.08.2006|SPY/BDoor| |McAfee|4890|11.07.2006|BackDoor-CKA| |Norman|5.80.02|11.07.2006|W32/Bifrose.CRL| |Sophos|4.11.0|11.07.2006|Mal/Packer| |UNA|1.83|11.07.2006|Backdoor.Bifrose.70FA| |VBA32|3.11.1|11.07.2006|Backdoor.Win32.Rbot.on| Таблица 2 результат проверки HIEW'а мета-антивирусом VIRUS TOTAL Рисунок 10 реакция антивирусов, собранных под крышей VIRUS TOTAL на HIEW, упакованный протектором Viogen Crypt Отсюда следует два вывода и оба неутешительные: первое — никаким антивирусам доверять нельзя! второе — прежде чем релизить продукт, прогонять его через VIRUS TOTAL _обязательно_ ===== [N2]: инсталляторы и троянские лошади ===== При разработке инсталляторов следует быть предельно осторожным, поскольку некоторые последовательности вызовов API-функций трактуются эвристическими анализаторами как потенциально вредоносные. Вот только одна из таких последовательностей, детектируемся антивирусом NOD32: ; создаем .dll в системной директории ; ======================================= call[GetSystemDirectory]; получаем путь к системной директории Windiws call[CreateFile]; создаем [там] файлтипа .dll call[WriteFile]; пишем [в этот файл] всякую хрен (любую) ; копируем в системную директорию самого себя ; =============================================== call[GetSystemDirectory]; получаем путь к системной директории Windiws call[GetModuleFileName]; узнаем как нас зовут call[CopyFile]; копируем себя в системную директорию Листинг 3 псевдокод последовательности API-вызовов, классифицируемый эвристическим анализатором NOD32 как потенциально вредоносный А вот конкретный программный пример ее программного воплощения на языке Си: based on animaTOR's and Bill_Prisoner's code from www.wasm.ru ============================================================== #include <windows.h> int main(int argc, char* argv[]) { объявляем необходимые переменные char buf[255];char buf2[255]; int len; HANDLE hFile; DWORD N; получаем имя системной директории и добавляем к нему имя нашей .dll GetSystemDirectory(buf,255);len=lstrlen(buf);lstrcat(buf,«\\nezumi.dll»); открываем файл на запись hFile = CreateFile(Buffer,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,0); записываем туда что-нибудь (хотя бы даже и мусор) WriteFile(hFile,«matrix has you», sizeof(«matrix has you»),&N,0); закрываем файл CloseHandle(hFile); получаем имя системной директории и добавляем к ней имя нашего .exe GetSystemDirectory(buf,255); lstrcat(buf,«\\nezumi.exe»); копируем самого себя в системную директорию под [новым] именем GetModuleFileName(0,buf2,255);CopyFile(buf2,buf,0); return 0; } Листинг 4 код, копирующий в системную директорию фиктивную динамическую библиотеку вместе со своей тушей И хотя из всех антивирусов, один лишь NOD32 невнятно выругается на «probablyunknownNewHeur_PE» (см. рис. 11, 12) создателям инсталляторов это оптимизма не добавляет и вполне может стоить им карьеры. Рисунок 11 реакция NOD32 на определенную последовательность API-вызовов, встречающуюся как в троянских программах, так и в честных инсталляторах Рисунок 12 реакция NOD32 на определенную последовательность API-вызовов, встречающуюся как в троянских программах, так и в честных инсталляторах Правда, если между вызовом GetSystemDirectory и CreateFile вставить холостой цикл (см. листинг 5), то эмулятор отвалится по тайм-ауту и NOD32 ничего не скажет, однако, это крайне ненадежный примем и никаких гарантий облома эвристика он не дает. _asm { mov ecx,144440 next: mov eax,edx loop next } Листинг 5 «холостой» цикл, «ослепляющий» эвристический анализатор антивируса NOD32 ===== [N3]: искусство скачивания файлов ===== При использовании API-функций семейства URLDownloadToFile никогда не запускайте только что полученный файл (чем пользуются некоторые программы с функцией автоматического обновления). Антивирусы начинают материться так, что уши вянут, причем выдают свои подозрения за прямое обвинение! Действительно, среди троянских программ такой прием весьма популярен, но… это еще не повод, чтобы хвостом махать! Как минимум следует убедиться, что скачивается что-то действительно вредоносное и весьма деструктивное. Ниже приведен фрагмент программы (впервые опубликованной на форуме WASM'а), загружающей из сети графический файл формата .gif и запускающий его на выполнение через API-функцию ShellExecute, вызывающую ассоциированное с ним приложение: ; based on Brutaller's example ; ================================== GetTempDir:; получаем путь к каталогу %TEMP% invoke GetTempPath, 256, WinTempDir ; копируем имя каталога %TEMP% в буфер FullPath, ; добавляя туда его имя, под которым он будет записан на диск invoke lstrcpy, FullPath, WinTempDir invoke lstrcat, FullPath, FileNameToSave Down:; скачиваем файл из сети invoke URLDownloadToFile, 0, UrlOfFile, FullPath, 0, 0 Exec:; запускаем скаченный файл invoke ShellExecute, NULL, NULL, FullPath, NULL, NULL,1 … section '.data' data readable writeable ж UrlOfFile db 'http://wasm.ru/pic/header.gif',0; url файла FileNameToSave db 'header.gif',0; имяфайланадиске WinTempDir rb 256; буфердля %TEMP% FullPath rb 256; буфердля FullPath Листинг 6 фрагмент программы, считывающий header.gif с WASM'а и запускающий ассоциированное с ним приложение (полный исходный текст лежит по адресу http://www.wasm.ru/forum/viewtopic.php?id=15667) После трансляции FASM'ом, мы получаем вполне безобидный exe, результатом работы которого (при наличии доступа к сети, конечно, и молчания всех брандмауэров) будет логотип WASM'а отображающийся в MS Paint'е или другой графической программе (см. рис. 13). Рисунок 13 результат работы «троянской» программы А вот что произойдет, если прогнать этот exe через VIRUS TOTAL (см. рис. 14). Для удобства восприятия (качество полиграфии продолжает хромать), все ругательства объединены в одну таблицу (см. таблицу 3). ^антивирус^версия^обновление^результат| |AntiVir|7.2.0.39|11.07.2006|HEUR/Malware| |Authentium|4.93.8|11.07.2006|Possibly a new variant of W32/Downloader-Sml-based!Maximus| |BitDefender|7.2|11.08.2006|Generic.Malware.dld!!.BFA2DC85| |DrWeb|4.33|11.08.2006|DLOADER.Trojan| |F-Prot|3.16f|11.07.2006|Possibly a new variant of W32/Downloader-Sml-based!Maximus| |F-Prot4|4.2.1.29|11.07.2006|W32/Downloader-Sml-based!Maximus| |NOD32v2|1.1858|11.07.2006|probably unknown NewHeur_PE virus| |Norman|5.80.02|11.07.2006|W32/Downloader| |Panda|9.0.0.4|11.07.2006|Suspicious file| |VBA32|3.11.1|11.07.2006|suspected of Win32.Trojan.Downloader (http://...)| Таблица 3 результат анализа нашего downloader'а различными антивирусами Рисунок 14 безобидный downloader под перекрестным эвристическим огнем агрессивно настроенных антивирусов, собранных под крышей мета-антивируса VIRUS TOTAL Впечатляет, не правда ли?! А вот NormanVirusControl с virusscan.jotti.org (см. рис. 15), воспользовавшись могуществом своего эмулятора, даже показал какие изменения произошли в файловой системе (см. листинг 7). Рисунок 15 реакция антивирусов, собранных под крышей мета-антивируса virusscan.jotti.org на совершенно безобидный downloader Sandbox: W32/Downloader; [ General information ] * File length: 2048 bytes. [ Changes to filesystem ] * Creates file C:\WINDOWS\TEMP\header.gif. [ Network services ] * Downloads file from http://wasm.ru/pic/header.gif as C:\WINDOWS\TEMP\header.gif. [ Security issues ] * Starting downloaded file - potential security problem. [ Process/window information ] * Attemps to NULL C:\WINDOWS\TEMP\header.gif NULL. Листинг 7  антивирус NormanVirusControl отчитывается об изменениях, произошедших в виртуальной файловой системе после запуска downloader'а Что же делать?! Как усмирить всю эту ораву?! Можно, конечно, запутать код, нагромоздить кучу лишних API-вызовов или даже прибегнуть к шифровке, но… все это мутроно и нудно, к тому же нет никаких гарантий, что эвристик не расколет эти хитрости и не завопит с еще большей силой. Остается скачивать файлы «вручную», то есть через сокеты или предлагать пользователю ходить за обновлениями самостоятельно. ===== заключение ===== Эвристические анализаторы не спасают от вредоносного кода (и массовые эпидемии — лучшее тому подтверждение), но высаживают на измену честных программистов, продукция которых «палится» совершенно ни за что и ни про что. Так что, борьба с эвристическими анализаторами приобретает коллективный характер и ей начинают интересоваться не только хакеры, но и вполне респектабельные производители программного обеспечения (особенно коммерческого, поскольку, в этом случае перепуганный клиент может и в суд подать, а суд дело такое… его исход никогда неясен, а вот с open-source продуктов взятки гладки — как бы там ни визжал антивирус, недовольных пользователей всегда можно ткнуть носом в исходный код и попросить найти то «деструктивное» место, которое антивирусу так не понравилось). ===== »> у какого антивируса эвристик самый лучший? ===== Сравнивать антивирусы — это все равно, что меряться пиписьками, но в общем зачете NOD32, NormanVirusControl и BitDefender отлично рулят (правда, последний не всегда дружит с сетевыми драйверами). AVP и Dr. Web хоть и не находятся в аутсайдерах, до лидеров им еще далеко. Впрочем, этот вопрос очень спорный и ответ на него зависит в основном от того, «кто больше заплатил». Ознакомится с достаточно независимым отчетом качества антивирусов можно на http://www.av-comparatives.org.