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 находится в одноименном каталоге.
|