VirusCodeGenerator by Redarc "Пишем вирус и антивирус" Хижняк.J Программа VCG_TEST.COM является демонстрацией возможностей вирусного кодогенератора. При ее старте создается (модифицируется) файл test1.com. Файл test1.com так же является программой. При ее старте выводится сообщение: VirusCodeGenerator by RedArc Смысл демонстрации в том, что программа вывода вышеприведенного сообщения формируется по полиморфному закону. При этом в качестве полиморфного энджина используется кодогенератор. Буду очень благодарен тем, кто вышлет мне программу, детектирующую все создаваемые демонстрашкой файлы test1.com как, например, DEMO_VCG. Да, при этом не стоит подсчитывать количество команд STOSW в файле ;) Это заюзано только для демки. В вирусе их может вообще не быть. PS: Никаких "сюрпризов" в программах нет: вирусов, троянов или еще чего. Можете не бояться ;) ======================================================================= ****> Клич RedArc был услышан, и уже через день DrMad запулил в comp.virus программулину, которая успешно детектировала данные вирусы. Ее саму и исходник на ASM вы можете найти в каталоге VCG. Ниже приведен ответ RedArc на эту программу. ======================================================================= От: redarc@oitsp.tsu.tula.ru <redarc@oitsp.tsu.tula.ru> Тема: Re: Re: VCG Дата: 2 апреля 1999 г. 23:26 Привет! Вобщем то да... опаньки. Но я немного не это имел ввиду. Сам виноват, что не написал. Трассировка штука хорошая, но... Во первых ее можно обламать, а во вторых, можно уйти из под детектора и вирус будет активирован самим детектором. Да и отлов конкретно этой штуки можно было еще проще сделать. 1. Проверить косвенные признаки (хотя бы то, что в конце всегда стоит набор команд: 0cdh 021h 0c3h) 2. Поставить бряк на 0c3h и посмотреть сигу по адресу 100h. Это безопаснее и проще, но только в данном случае. Я то имел ввиду детектор программ, генерируемых VCG. Ну типа, как это делает тот же AVP для VCL. То есть, отлавливать все генерируемые файлы как VCG-based. > В качестве сиги полиморфиков можно брать не последовательности > байтов, но _состояния_, т.е. определенные значения SP, других > регистров и указуемых полей памяти. А вобщем случае в качестве сиги > надо брать _действия_, т.е. То есть, нужен эмулятор? Я правильно понял? > включать динамику процесса. Это сложней, но Каспер, ДанилОфф и особенно > Валик это умеют. Фигвам. Они отвалятся на самых безобидных приемах - юзанье портов. Пример. |Начало программы| |Переход на EntryPoint вируса| |Программа| |Первые блоки вируса| |EntryPoint вируса| |Вызов VCG| |Остальные блоки вируса| |VCG| Ну как понятно из вышеприведенной схемы, вирус может внедрять переход на свою стартовую точку в пределах первых n-байт жертвы (случайное место на протяжении блока, где отсутствуют call, jmp, ret, etc). Размер внедрения (перехода на вирус) - величина не постоянная, код внедрения генерируется самим VCG. Точка входа в вирусный код содержит (или не содержит, в зависимости от того, что было сгенерировано) всякую лабуду по антиотладке, антитрассировке и антиэвристике. Так сказать, первый эшелон защиты вируса. Здесь же, в промежутках между защитным кодом, производится стартовая настройка некоторых регистров. Затем вызывается VCG, который в буфере генерирует новую копию вируса. Здесь опять же интересный факт - блоки вируса не имеют постоянной длины, это вы уже успели заметить. Они же перемешиваются в случайном порядке. Точки входа в блоки запоминаются опять же в буфере и после окончания генерации всех блоков, заносятся как адреса перехода. Ну типа: - первый проход: @@Block1: ;<- адрес сохраняем в буфере ......... @@JumpNext1: ;<- в этой метке адрес перехода на ;следующий блок. Сохраняем в буфере jmp 01234h ;начальное значение ;--- @@Block2: ;<-адрес сохраняем в буфере ......... ;ну и так далее - второй проход @@Block1: ......... @@JumpNext1: jmp [@@Block2] ;--- @@Block2: ......... Запоминаем теперь только адрес EntryPoint только что сгенеренного вируса и возвращаем управление старому вирусу (из которого получили управление). Теперь вирус производит поиск жертв и их инфицирование. Код, как сами понимаете, был сгенерирован ранее VCG и представляет из себя блоки команд, раскиданных в хаотичном порядке по всему телу и имеющие фиг знает какие размеры. В промежутках между "полезными" блоками, управление получают "мусорные" блоки, которые мешают трассировке и эмуляции зверька. При обнаружении еще не инфицированной жертвы, вирус дописывает в ее конец сгенерированную VCG свою копию из буфера и дописывает VCG. Затем корректирует адрес EntryPoint, находит блок, куда в жертве можно воткнуть переход на вирус, сносит этот блок в конец файла жертвы, а VCG генерирует блок перехода меньшей или равной длины от найденного блока. Ну для красоты, VCG при записи шифруется с неким ключем по одному из нескольких алгоритмов. Декриптор с нужным алгоритмом генерируется самим же VCG и записывается в точку входа VCG. Сигнатур в явном виде нет. Дальше, вирус ведет счетчик пораженных копий и при достижении им некоего предельного значения, происходит вот что: при инфицировании последующих жертв, в файлы записывается только тушка сгенерированного вируса и устанавливается переход на начало кода вируса. Сам же VCG не дописывается, собственно как и переход на VCG и декриптор VCG. То есть, как будто их и небыло никогда. То есть сам VCG сигнатурой являться уже не может, так как не все генерируемые им вирусы будут его носить с собой. Еще о прелестях жизни. Блоки вируса будут не постоянной структуры, то есть, VCG будет носить с собой несколько "формул" одного и того же вируса и выбирать блоки из разных "формул" по случайному закону. Конечно, зверек будет довольно не хилых размеров, но он же создается исключительно в научных целях и предназначен только для журнала, так что прокатит. Да, выше я имел ввиду только Search и только для COM-файлов. Можно сделать как и в Pkunk: несколько "формул" с разной стратегией поражения: в начало файлов, в конец файлов, заражение EXE и COM файлов, резидентность и нерезидентность, ... дальше по вкусу. Но мне это уже не интересно. Дык собственно отсюда и была моя просьба в описании общего подхода для детектирования кода, сгенерированного VCG. 1. Поиск в вирусе постоянной сигнатуры даже путем эмуляции ни к чему не приведет. Это потому, что кроме самого VCG там нет ничего боле менее постоянного, а VCG будет в какой то момент похерен. 2. Трассировка исключается, так как я уж постараюсь ее не допустить ;) 3. Эмуляция опять ни к чему не приведет, так как в "последнем поколении" вируса, это когда VCG не будет дописан в новую жертву, ничего зашифрованного в вирусе не будет. Следовательно, нужны более иные подходы для детектирования такого класса вирусов. Вот я уже слышал про какие то хитрые методы, типа слежения за динамикой процесса... Посему и просил показать методы детектирования ни того, что в конце-концов выводит на экран программа, а того, что они сгенерированы одним и тем же генератором. А Костин прием здесь не катит. Увы... Даже если откинуть метод, принятый Костей, то суть его заключается в поиске _статического_ текста, генерируемого файлом. Вирусы же ничего такого генерировать не должны. Так что вот так... RedArc ========================================================================== ***> Ну что ? Всем все ясно ? Конкурс обьявляю открытым ! Детекторы можно слать лично RedArc. Сам VCG находится в одноименном каталоге. |