Методы обмана антивирусных прог
За минувшие годы на свалку истории были отправлены десятки тысяч вирусов, троянских коней, систем удаленного администрирования и прочей уголовной братии. Жизненный цикл этих созданий (далее по тексту просто "вирусов") очень недолог. Стоит только попасть в лапы к Евгению Касперскому (не путать с Крисом Касперски – мы не только разные люди, но даже не однофамильцы!), как в реестр "их разыскивает полиция" добавляется новая запись, после чего прога бьется влет…
Постановка задачи
Может ли вирусная экспансия противостоять антивирусной агрессии? Вопрос совсем не так прост, каким кажется. С одной стороны, создать принципиально недетектируемый вирус никому не удалось (и в обозримом будущем вряд ли удастся). С другой стороны, памятуя о том, что стадо мышей валит кота, можно сказать, что сотня тупейших, но еще не известных науке вирусов, намного опаснее одного полиморфного аристократа. При условии, что вирус не ловится эвристиком (а перехитрить эвристик очень легко), до тех пор пока он не попадет в базу данных антивируса, вирус будет жить и плодотворно размножаться. Ну а потом… "мавр сделал свое дело" и эстафету перехватит другой. Причем создавать новый вирус "с нуля" совершенно не обязательно, при желании достаточно слегка подмазать исходные тексты уже известной антивирусу программы (например, откомпилировать другим компилятором). Если же исходных текстов нет, можно поиздеваться непосредственно над самим исполняемым файлом. Вот об этом мы сейчас и поговорим!
В экспериментах участвуют: система удаленного администрирования Back Orifice 1.0 (вместо нее можно использовать любой другой исполняемый файл или DLL), антивирусы Dr.WEB, AVP, хакерский редактор HIEW, редактор pe-файлов PE-TOOLS или LordPE, упаковщик ASPack, а также некоторые другие тулзы, упоминаемые по ходу повествования.
Немного теории
И ведь находятся же такие идиоты, которые безоговорочно полагаются на антивирусы, и самодовольно похрюкивая, заявляют, что все файлы на данном диске/сайте проверены самыми последними версиями AVP/Dr.Web и типа здесь все ништяк. Наивные! Если антивирус говорит, что он ничего не нашел, то и понимать его следует буквально. Антивирус. Ничего. Не. Нашел. Стало быть, плохо искал!
Анализ показывает, что подавляющее большинство антивирусов используют сигнатурный поиск с жесткой привязкой к точке входа или физическому смещению в файле. Что все это значит? Не вдаваясь в неразбериху терминологических тонкостей, отметим, что сигнатурой называется уникальная последовательность байт, однозначно идентифицирующая вирус. Сигнатура может быть сплошной (например, "DE AD BE EF") или разряженной (например, " DE ?? ?? AD ?? BE ** EF", где знак "??" обозначает любой байт, а "**" - любое количество байт в данной позиции). Поиск по разряженной сигнатуре иначе называется поиском по маске, и это – наиболее популярный алгоритм распознавания на сегодняшний день.
Для достижения приемлемой скорости сканирования антивирусы практически никогда не анализируют весь файл целиком, ограничиваясь беглой проверкой одной-двух ключевых точек (допустим, окрестностей точки входа в файл, т.е. тех ячеек, с которых и начинается его выполнение). Реже используется привязка к смещению сигнатуры относительно начала файла.
Полиморфные вирусы пятого и шестого уровня полиморфизма, не содержащие ни одной постоянной последовательности байт, сигнатурным поиском уже не обнаруживаются, и для их детектирования приходится разрабатывать весьма изощренные методики, самой известной из которых является эмуляция процессора (называемая также технологией виртуальной машины). Антивирус прогоняет подозреваемый файл через эмулятор, дожидается, пока полиморфный движок расшифрует основное тело вируса (если файл действительно зашифрован), после чего применяет старый добрый сигнатурный поиск. Это довольно ресурсоемкая операция, и без особой нужды антивирусы к ней стараются не прибегать.
Поскольку зараженный файл может быть упакован (и тогда вирусные сигнатуры окажутся безнадежно искаженными), антивирус должен быть готов распаковать его. Простейшие упаковщики распаковываются все тем же эмулятором, но монстров, снабженных большим количеством антиотладочных приемов (ASPack, tElock и другие), так не возьмешь, и для борьбы с ними приходится реализовывать специальные распаковщики, опознающие "свой" упаковщик по его сигнатуре…
Чего мы делать не будем
Подмена вирусной сигнатуры зараженного файла – это худшая из идей, которая только может придти в голову. Начнем с того, что сигнатуры прямым текстом нигде не хранятся. Современные антивирусные базы представляют собой весьма навороченные структуры данных, на реконструкцию формата которых легко потратить всю оставшуюся жизнь. При наличии неограниченного свободного времени сигнатуру можно найти и вручную, просто затирая различные байтики в зараженном файле и скармливая его антивирусу, дожидаясь, когда он перестанет ругаться. Но стоит учесть, что детектирование вируса, как правило, осуществляется по нескольким независимым сигнатурам, живописно размазанным по всему файлу и, что самое неприятное, варьирующимся от антивируса к антивирусу. К тому же, правка исполняемых файлов в hex-редакторе – занятие не для слабонервных. Для сокрытия сигнатуры необходимо переписать один или несколько фрагментов вируса, заменяя сигнатурные ячейки аналогичными им командами/данными, но имеющими другое машинное представление. А если вирус использует самомодифицирующийся код или тем или иным способом контролирует целостность своего тела? Зашифрованные же вирусы непосредственной модификации вообще не поддаются, а для их расшифровки опять-таки необходима квалификация. В общем, мрак… Но мы будем действовать по плану (да! у нас есть два мешка отличного плана!).
Как мы будем действовать
Первое (и самое простое), что приходит на ум – обработать файл каким-нибудь навесным упаковщиком/протектором, полностью уничтожающим все сигнатуры, и скормить его антивирусу. Нехай подавится. Что?! Не хочет давиться? Значит, антивирус успешно переварил упаковщик и дорвался до внутренностей оригинального файла. Тут-то сигнатуры и поперли.
Можно ли противостоять автоматическим распаковщикам, ничего не смысля в ассемблере и не разрывая свою задницу напополам? На первый взгляд, стоит лишь откопать в Сети малоизвестный упаковщик, поновее да покруче, и все будет торчком. Взять, например, OBSIDIUM, который многим хакерам зубы пообломал, и с которым еще не справляется ни один антивирус.
Как одноразовый шприц такой прием вполне подойдет, но вот на долгосрочную перспективу его не натянешь. Как только выбранный упаковщик станет популярным, антивирусы тут же сподобятся его распаковывать! Увы, эта военная хитрость слишком ненадежна.
А другие приемы борьбы есть?! Да, и не один, а, как минимум, целых три: уничтожение сигнатур упаковщика, внедрение подложных сигнатур и дезактивация эмулятора.
Уничтожение сигнатур
Если выбранный нами упаковщик настолько крут, что не может быть распакован на виртуальной машине антивирусного эмулятора (универсальном распаковщике), антивирус пытается опознать упаковщик "в лицо", передавая бразды правления соответствующей процедуре распаковки, либо распаковывающей файл самостоятельно, либо инструктирующей эмулятор на предмет обхода антиотладочных приемов. Исказив сигнатуру упаковщика, мы предотвратим его опознание, обломав антивирус по полной программе. Причем, в отличие от сигнатур самих вирусов, до которых еще докопаться надо, сигнатуры популярных упаковщиков хорошо известны.
В частности, для ASPack/ASProtect достаточно затереть первый байт точки входа, поменяв 60h (опкод команды PUSHAD) на 90h (опкод команды NOP). Строго говоря, это не совсем корректный хак, нарушающий балансировку стека, однако никак не сказывающийся на работоспособности подавляющего большинства программ.
Как мы будем действовать? Возьмем bo2k.exe (или любой другой файл) и, предварительно убедившись, что он успешно опознается всеми антивирусами, пропустим его через ASPack, а затем повторим процедуру опознания вновь. И AVP, и Dr.WEB продолжают визжать, подтверждая тот факт, что данный упаковщик им хорошо известен.
Загружаем файл в HIEW, однократным нажатием на <ENTER> переходим в hex-режим, давим <F5>, перемещаясь в точку входа, жмем <F3> для разрешения редактирования, говорим "90", подтверждая серьезность своих намерений клавишей <F9>. Dr.WEB насупился и молчит. AVP тоже заткнулся. Естественно, помимо NOP, можно использовать и другие однобайтовые команды, такие как: inc eax/40h, inc ebx/43h, inc ecx/41h, inc edx/42h, inc esi/46h, inc edi/47h, dec eax/48h, dec ebx/4bh, dec ecx/49h, dec edx/4ah, xchg ebx,eax/93h и многие другие. Не надо злоупотреблять 90h – иначе антивирусы просто пополнятся новой сигнатурой!
Если лень возиться с hiew'ом, воспользуйся любым подходящим скремблером – программой для автоматического затирания сигнатур. Их легко найти в Сети, правда, большинство из них ни хрена не работают, потому что искажают совсем не те сигнатуры, на которые реагируют антивирусы, или в оголтелом порыве энтузиазма гробят файл так, что вместе с антивирусом его перестает узнавать и сам распаковщик. Так, в частности, ведет себя незаслуженно популярный HidePX.
Внедрение подложных сигнатур
Как альтернативный вариант - можно не затирать сигнатуру оригинального упаковщика, а, напротив, нафаршировать файл подложными сигнатурами прочих крутых упаковщиков. Ошибочное распознавание упаковщика препятствует его распаковке, и антивирус тихо кончает, отпуская вирус восвояси. Однако этот путь не обходится без проблем. Первое и главное – где брать сигнатуры? Программы-протекторы (такие, скажем, как EPProt) подкладывают сигнатуры, надерганные из pe-сканеров, против которых они, собственно, и нацелены. Антивирусы могут использовать другие сигнатуры, и тогда наживка не срабатывает.
Возьмем bo2k.exe, упакуем его ASPack'ом и внедрим одну (а лучше несколько) подложных сигнатур, услужливо предоставленных EPProt'ом. Пусть для определенности это будет tElock. В окне "select" указываем путь к подопытному файлу, в окне "insert signature" отмечаем выбранную сигнатуру (по одной за раз) и давим на "Protect EP". Зовем антивирус и говорим "фас!": AVP с победоносным хрюком свиньи, заживо спускаемой в унитаз, разрывает противника в клочья. Dr.WEB хотя и не распознает Back Orifice, но ругается на "возможно win.exe вирус", что не есть хорошо.
Причина провала операции в том, что не мы одни такие умные. Слишком уж часто хакеры пытались надурить AVP с помощью EPProt'а. Но сможет ли этот антивирус распознать те же яйца, если их развернуть в профиль? Давай проверим! Загружаем обработанный файл в HIEW, дважды нажимаем <ENTER> для перехода в ассемблерный режим, давим <F5> для перехода на entry point и наблюдаем приблизительно следующую картину (наименование и расположение машинных команд могут кардинальным образом отличаться от приведенных, ведь EPProtect – полиморфный протектор, но суть останется неизмененной):
Находим цепочку из четырех или более инструкций NOP и, нажав <F3>, давим на <ENTER> и вводим что-то вроде add eax, ebx/sub eax, ebx (где "add eax, ebx" добавляет к регистру eax значение регистра ebx, а "sub eax, ebx" вычитает его оттуда). В результате у нас получается следующее:
Нажимаем <F9> для сохранения изменений в файле и прогоняем его через AVP. Ну и почему мы не кричим? Куда девалось наше самодовольное похрюкивание? Всего две команды затоптали, а какой результат!!! Впрочем, наше положение крайне ненадежно, и поводов для пьянки нет никаких. Едва разработчикам антивируса станет известно об этом инциденте - в сигнатурной базе появится новая строка. К тому же Dr.WEB по-прежнему матерится на win.exe вирус…
Дезактивация эмулятора
Что на это сказать? Неважно, кто поит девушку. Важно – кто ее танцует! И пока остальные будут с воплями топтать сигнатуры, мы ударим в самое сердце антивируса – в его виртуальную машину. Преодолеть эмулятор можно различными путями: а) вставить конструкцию, которую антивирус проэмулировать не в состоянии (самомодифицирующийся или самотрассирующийся код, обработку структурных исключений и т.д.); б) вставить команду, привязывающуюся к своему местоположению в памяти; в) использовать команду, не известную эмулятору.
Код, отвечающий одному или нескольким вышеприведенным пунктам, мы будем называть антиотладочным кодом. Будучи внедренным в упакованный файл, он подложит хорошую свинью виртуальной машине и угробит антивирус еще до того, как распаковщик успеет получить управление. Тупое пополнение сигнатурной базы положение не спасет, и разработчикам придется всерьез засесть за совершенствование виртуальной машины, что не только дорого, но и хлопотно. Так что без крайней нужды на это никто не пойдет, и предложенная идея будет работать долго, укрывая любимый софт от загребущих антивирусных лап.
Существует множество способов внедрения своего кода в чужой исполняемый файл. Вирусы, как правило, раздвигают последнюю секцию, записываясь в ее конец, или создают новую. Дело это муторное и к тому же слишком заметное. Антивирусы матерятся так, что уши вянут. То же самое относится и к вторжению в заголовок.
Мы же поступим умнее и внедримся между секциями в середину файла. Берем файл, упакованный ASPack'ом, грузим его в HIEW, нажимаем <ENTER> для перехода в hex-режим, давим <F8> для входа в режим заголовка, жмем <F6> для просмотра таблицы секций, подгоняем курсор ко второй секции файла и ударяем по ENTER'у.
Теперь, прокручивая курсор вверх, мы оказываемся в чертогах секции .text. В этой секции обычно и размещается машинный код нормальных программ, так что наше появление не вызовет никаких подозрений у антивируса.
Если здесь расположены не нули, а что-то другое, значит, свободное пространство отсутствует. В этом случае попробуй упаковать файл с другой степенью сжатия или поищи свободное место в других секциях. В большинстве случаев AVP/Dr.WEB это воспринимают довольно благосклонно, но никаких гарантий их лояльности у нас нет, и внедрение антиотладочного кода в .text намного более предпочтительно.
Внедрять свой код можно в любое место, адрес которого начинается с точки (если точка не стоит, значит, данная область файла не отображается в виртуальную память – загрузи файл в pe-editor, войди в раздел section и приравняй virtual size секции .text к ее raw size). В нашем случае это может быть любой адрес из интервала 31490F0h – 31491F0h. Допустим, мы возьмем 3149100h как наиболее круглый. Сюда-то и будет направлена новая точка входа, для изменения которой проще всего прибегнуть к pe-editor'у.
Внимание! Точка входа задается не в абсолютных, а в относительных виртуальных адресах, отсчитываемых от базового адреса загрузки файла (image base), и pe-editor говорит, что в нашем случае она равна 01E001, что при базовом адресе в 03140000h дает 01E001h + 03140000h == 0315E001h. Именно по этому адресу наш код должен возвратить управление, чтобы упакованный файл смог начать работу. Короче говоря, для вычисления действительного адреса точки входа мы должны сложить значения полей Entry Point и Image Base, обосновавшихся за кнопочкой "optional header". Как? Ты не умеешь складывать шестнадцатеричные значения? Ну так запусти виндовый калькулятор и, переведя его в "научный" режим, нажми клавишу <F6>. Как вариант, можно затоптать комбинацию <Alt>+<=> в hiew'е, только учти, что вместо суффикса "h" это животное использует сишный префикс "0x", и число 1234h записывается как 0x1234. Запиши полученный адрес точки входа на бумажку, т.к. он нам еще не раз понадобится в дальнейшем.
Соответственно, для вычисления RVA-адреса антиотладочного кода мы должны вычесть из него image base. Тогда мы получим: 03149100h – 03140000h == 9100h. Т.е. берем адрес начала внедряемого в файл кода (который, как мы помним, в нашем случае равен 03149100h), вычитаем из него image base, сообщенный hiew'ом или pe-editor'ом (03140000h), и получаем 9100h. Как вариант можно затоптать кнопочку FLC (File Location Calculator - Калькулятор Файловых Локаций). Перемещаем радиокнопку в положение Virtual Address, топчем 03149100 и давим "calculate", после чего поле RVA будет содержать искомое значение.
Записываем это значение в поле Entry Point и вновь возвращаемся в HIEW. Если все было сделано правильно, после двойного нажатия на <ENTER>, последовательное нажатие клавиш <F8> и <F5> перенесет нас аккурат в окрестности новой точки входа. К внедрению антиотладочного кода готов? Блин… ну ты же не пионер…
Антиотладочный код
Начнем с самого просто – с самомодифицирующегося кода. Забросим на стек инструкцию перехода на оригинальную точку входа и немедленно ее исполним. Для этого нам предстоит набрать следующую последовательность команд: mov eax, абсолютный адрес старой точки входа/push 0E0FF/jmp esp, где "E0FFh" представляют собой машинный код команды jmp eax. Экран HIEW'а после завершения ввода должен выглядеть приблизительно так:
Прогнав файл через AVP, мы убеждаемся, что он даже и не порывается хрюкать! Dr.WEB рычит, но это явление временное, и скоро мы его обломаем. Открываем на радостях свежее пиво! Малость промочив горло и ощупав растущий живот, мы приступаем к более сложным фокусам. А именно – передаче управления посредством структурного исключения, более известного под аббревиатурой SEH. Никакие известные мне антивирусы SEH не эмулируют, отладчики от него едут крышей, а начинающие хакеры тонут в диспетчере, умирая за трассировкой от старости и истощения.
Один из вариантов реализации антиотладочного кода выглядит так: заталкиваем в стек адрес старой точки входа (в нашем случае это 315E001h), заталкиваем указатель на предыдущий обработчик (он лежит в двойном слове по адресу FS:[0]) и регистрируем свой обработчик установкой FS:[0] на вершину стека. Затем возбуждаем исключение, например, порываемся делить на ноль, выполняем несуществующую машинную команду или обращаемся к несуществующему/защищенному адресу памяти (скажем, лезем в ядро).
И что же? Оба антивируса молчат, а отладчики при достижении строки 3149111h забрасывают нас глубоко в ядро, и далеко не каждый хакер знает, как заставить soft-ice отобразить истинный адрес перехода (правильный ответ: дать команду xframe).
Напоследок – подсунем виртуальной машине не известную ей инструкцию. Что-нибудь из набора мультимедийных команд P-III+. Вот хотя бы prefectch [eax], которой соответствует следующий опкод: 0F 18 00, и которая осуществляет упреждающую предвыборку данных в кэш. Вряд ли антивирусы станут ее эмулировать. Но разве они не могут просто пропустить ее? В том-то и дело, что не могут! Неизвестная инструкция имеет неизвестную длину, и определить ее границы эвристическими методами невозможно. Эмулятор просто не будет знать, откуда ему продолжать разбор кода…
Приведенный выше код раскалывается всеми современными антивирусами, но стоит изменить первые три байта на 0F 18 00, как эмуляторы склеят ласты. Кстати говоря, у hiew'а тоже едет крыша:
Подытожив наши достижения, мы получим табличку, которой по праву можем гордиться.
Заключение
Тот, кто пользуется системами удаленного администрирования, джойнерами, клавиатурными шпионами и тому подобными приложениями, знает, что лучшие представители этой братии очень быстро попадают в «черные списки» антивирусных прог, после чего их ценность падает практически до нуля. Это неприятное обстоятельство заставляет большинство юзеров впустую тратить свое свободное время. Кто-то начинает искать софт на замену, кто-то замирает в ожидании свежих версий, которые антивирусам пока еще не известны. Но это – неправильный подход! Этой статьей я хотел показать тебе, что есть способ лучше. Ну, в самом деле, зачем скакать с проги на прогу, когда свой любимый, проверенный временем софт можно модифицировать так, что все антивирусы пойдут гулять лесом?!! Тем более если учесть, что методы модификации, о которых я тебе говорил, настолько просты, что воспользоваться ими может любой более-менее продвинутый пользователь.
Криптография на пеньке
Упаковываем «паленую» прогу любым подходящим архиватором, поддерживающим шифрование, и отправляем архив пользователю вместе с паролем и инструкцией по его расшифровке. Пользователь распаковать файл сможет, а антивирус – нет. Правда, при активном антивирусном мониторе зараженный файл будет автоматически проверен после его извлечения (а у большинства пользователей монитор активен). К тому же параноидально настроенные юзеры склонны проверять все запускаемые файлы вручную. Так что, увы, предложенная идея годится лишь для обхода почтовых сторожей, чтобы те не прибили вложения еще на подлете.
Как вариант, можно упрятать вирус в самораспаковывающийся архив, а для автоматизации ввода пароля использовать такую штуку, как bat-файл. Хрен какой антивирус его расшифрует! Применительно к zip'у, шифрование и упаковка целевого файла выглядит приблизительно так: "pkzip.exe –add –maximum –Sfx password=M$sux dst.exe src.exe", а распаковка (с автоматическим запуском!) так: "dst.exe –password=M$sux & src.exe", где M$sux – пароль, dst.exe – упакованный файл, а src.exe – файл-носитель. Если не хочешь возиться с командными файлами – юзай RAR – он позволяет автоматически запускать распакованную программу после ее расшифровки.
Сначала необходимо создать первичный зашифрованный носитель. Для этого, предварительно упаковав подобный файл zip'ом (с паролем), тыкаем в него левой клавишей мыши и выбираем пункт "добавить файлы в архив". Затем в появившемся диалоговом окне взводим галочку напротив "создать sfx-архив", в закладке "дополнительно" выбираем "параметры sfx", изменяем путь распаковки с "program files" на текущую папку, и в строке "выполнить после распаковки" пишем "cmd.exe /c dst.exe –extract –password=M$sux&src.exe". В "режимах" говорим RAR'у "не показывать начальный диалог", а в закладке "текст и значок" выбираем иконку по вкусу и нажимаем на "ОК". Все! После запуска упакованного файла автоматически расшифруется и запустится исходная подопытная программа, гарантированно обходящая все антивирусные заслоны. Однако под Windows 9x это, естественно, работать не будет (в ней нет cmd.exe и вообще все по-другому).
DANGER!
Не пытайся расценивать эту статью как призыв писать или того пуще распространять вирусы. На это есть УК и блюдущие органы. Моя миссия проще. Я лишь попытался показать (и доказать), что даже обычный юзер может легко поиметь не одну сотню пользователей, свято верящих в чудодейственную силу свежеобновленных антивирусов.
WWW
HIEW
wwwwasm.ru/tools/13/hiew.zip
OBSIDIUM
wwwwasm.ru/tools/12/Obsidium.zip
HidePX
wwwwasm.ru/tools/12/HidePX.zip
EPProt
wwwwasm.ru/tools/8/EPProt.zip
PE-TOOLS
wwwwasm.ru/tools/6/petools.zip
ASPack
wwwaspack.com
tElock
wwwwasm.ru/tools/12/telock.zip
Или просто топай на wwwwasm.ru/toollist.php и сливай оттуда все, что тебе надо.
INFO
PE-сканерами называют программы для автоматического определения типа используемого упаковщика/протектора/компилятора.
http://www.inattack.ru/cat_program/58.html
NFO
Я так мыслю, что разработчики антивирусов не зря свой хлеб едят и статейки из инета/бумажных изданий все же почитывают. Поэтому не надо копировать приведенные здесь примеры как есть – спустя какое-то время работать они уже не будут. Проявляй инициативу! PUSH xxx можно поменять на MOV EAX, xxx/PUSH EAX и еще тысячу других команд.