╔════════╤════════════════════════════════════════════════════╤══════════╤═══╗
║Okt 1999│NF представляет электронный журнал MooN BuG issue 11│ RedArc │003║
╟────────┴────────────────────────────────────────────────────┴──────────┴───╢
║ Концепция недетектируемого вируса (FullMorph) ║
╚════════════════════════════════════════════════════════════════════════════╝
К данной статье меня подтолкнул разгоревшийся в PVT.VIRII флейм о том,
что FullMorph невозможен, потому что этого не может быть никогда. Народ не
смущает ни теоретическое обоснование сего чуда Imagineer'ом, Reminder'ом и
мной, скромным. Не смущает и наличие первых разработок по этой теме: PLY, VCG,
ACG. Посему постараюсь в этой статье сделать что-то вроде FAQ по
недетектируемым вирусам.
И так, что же смущает прогрессивное человечество, то бишь вирмейкеров, в
концепции недетектируемости? Попробую задать эти вопросы себе и сам же на них
попытаюсь ответить.
Утверждение первое
==================
Если вирус может детектировать себя в инфицированных программах,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
то и антивирус сможет его детектировать
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Необходимо рассмотреть отображение множества всех объектов, которые можно
заразить на множество уже зараженных объектов. Если для антивируса это
отображение ОБЯЗАНО быть изоморфным, (т.е. грубо говоря давать возможность
однозначно определять зараженность файла при наличии у него данного
признака), то для вируса это не нужно и даже ВРЕДНО! Если часть нашего
отображения будет покрывать незараженные файлы, то это несколько снизит
вирулентность, но значительно затруднит детектирование вируса данным способом.
Из классики (вирлист к DrWeb и AVPE) мы знаем, что существуют вирусы,
детектирующие свое наличие в файлах по следующим признакам:
- по первому байту программы (для COM-программ). Это может быть первый
байт команды перехода на вирус (0e9h или 0e8h) или некая любая другая команда
(nop; cli; sti; cld; xchg Reg,Reg; push Reg / pop Reg; cli / sti; pusha; int
3h; dec cx; ...);
- по некоторому байту / слову, находящемуся по фиксированному адресу в
начале программы (обычно после команды перехода) или по фиксированному адресу
в теле самого вируса;
- по последнему байту / слову инфицированной программы;
- по слову в поле CheckSum в заголовке EXE-программы;
- по установленному атрибуту ReadOnly;
- по специфическим данным в поле дата / время последней модификации
файла;
- по данным в полях EXE-заголовка для HLL-вирусов;
- по наличию файлов с одинаковым именем, но с различными расширениями
(справедливо для компаньон- и BAT-вирусов);
- ...
Для резидентных вирусов, которые инфицируют кроме файлов еще и память,
существуют следующие признаки:
- по специфическим функциям в "горячих" прерываниях для резидентных
вирусов (типа "ты здесь?" - "я здесь");
- по байту / слову по фиксированному адресу в памяти;
- ...
Уже из приведенного списка признаков мы видим, что нельзя однозначно
сказать о наличии вируса в файле, если файл начинается с команды PUSHA или
имеет атрибут ReadOnly. Некоторые (в основном устаревшие) вакцины специально
добавляли в файлы известные признаки вирусов (строка "MsDos" - как вакцина от
вирусов Jerusalem в конце файлов) что вносит еще больше сомнения в
целесообразности реагирования антивирусов на вирусные метки. Кто мешает
FullMorph-вирусу тоже ставить в конец инфицированных файлов строку-признак
"MsDos"? Некоторые вирусные метки совпадают для абсолютно разных вирусов
(значение 60 в поле секунд времени последней модификации файла) и сказать о
том, какой именно вирус (и есть ли вирус вообще) по таким признакам абсолютно
невозможно. Во время локальных эпидемий очень часто делаются самопальные
резидентные вакцины (вообще то такие вакцины делал даже Д.Н.Лозинский от того
же Phantom), которые откликаются на вирусные запросы "ты здесь?" или даже
содержат куски вирусного кода при необходимости (вирусы семейства Kela в
качестве ответа на вопрос "ты здесь?" возвращают адрес вируса в памяти, а
пытающийся проинсталлироваться вирус сравнивает начало своего кода с началом
кода резидентной копии). Так что лечение памяти по одним лишь вирусным меткам
занятие весьма сомнительное, которое чаще будет приводить к краху системы, чем
к положительным результатам. Более того, некоторые антивирусы хранят маски
вирусов (сигнатуры) в открытом виде и эти сигнатуры совпадают с сигнатурами в
других антивирусах. Так когда то антивирус Scan находил в антивирусе AIDSTEST
маску загрузочного вируса Disk Killer о чем радостно и сообщалось счастливым
обладателям обоих антивирусов.
Не сложно сделать вывод, что уважающий себя антивирус и тем более
коммерческий антивирус либо вообще никак не будет реагировать на метки,
которыми пользуются вирусы, либо сочтет их недостаточными и будет искать
дополнительные признаки присутствия вируса (кусок кода в виде сигнатуры, CRC
постоянной части кода вируса, ...). При отсутствии таких дополнительных
признаков антивирус может выдать одно из следующих сообщений:
- возможно инфицирован модификацией вируса (самые дерьмовые);
- возможно инфицирован вирусом типа COM.EXE.TSR.... (параноидальные);
- странная(ое) дата(время) создания файла (нормальные);
Таким образом, если антивирус будет пугать пользователя своими
сообщениями только потому, что в программе UUE.EXE по адресу 0:0419h найдена
команда CLI, пользователь просто откажется от использования этого антивируса.
Для коммерческих антивирусов (DrWeb, AVP, ...) такая бдительность может
оказаться пировой победой - фирма-разработчик обанкротится нафиг.
Кроме всего прочего существует ряд признаков, которые абсолютно не
пригодны для антивирусов и вполне приемлемы для вирусов. К таким признакам
следует отнести:
- проверка кратности длины файла некоторому значению, например 7;
- проверка бита ReadOnly в байте атрибутов;
- ...
Вирус может подсчитать контрольную сумму первого килобайта инфицируемой
программы и записать ее в виде двойного слова в конец файла. При тестировании
файла вирус снова подсчитывает контрольную сумму и сравнивает ее с числом из
конца найденного файла. Совпадает - вирус инфицировать файл не будет, не
совпадает - будет. При этом метка вируса тоже становится полиморфной, а
совпадение контрольной суммы n-байт файла с числом из последних байт - событие
совершенно случайное. Да и алгоритмов подсчета CRC существует великое
множество, что делает такую метку не опознаваемой без знания алгоритма
подсчета контрольной суммы. И даже если в антивирус будет вставлен именно этот
алгоритм подсчета CRC, то кто же даст гарантию, что абсолютно другой вирус или
программа с самоконтролем изменений не используют точно такой же алгоритм? Вот
вариации таких вирусных признаков:
- значение n для подсчета контрольной суммы зависит от длины файла и
каждый раз является случайным (например, если длина кратна 5, то n=5*5*5, а
если кратна 7, то n=7*6*5, ...);
- вместо контрольной суммы в конец файла записываются первые два байта
инфицируемой программы (кто сказал, что в неинфицированных файлах первые n
байт не могут совпадать с последними n байтами?);
- то же самое, что и в предыдущем пункте, но значение n зависит от длины
файла (чему оно кратно, столько байт и дописывается);
- то же самое, но смещение байт, копируемых в конец файла, зависит от
даты или времени создания файла;
- вирус генерирует n мусорных байт, сумма которых равна некоторой
константе или кратна некоторой константе и этот мусор дописывается в конец
файла;
- то же самое, но значение n зависит от значения секунды+минуты времени
создания файла, а константа, которой кратна сумма мусорных байт, это кратность
длины файла простому множителю (2,3,5,7,9);
- ...
Если немного пофантазировать, то вычислить метку вируса будет весьма
проблематично, так как при инфицировании одного и того же файла она будет
уникальна в каждом случае заражения. Еще большую полиморфность в признак
присутствия вируса будет вносить использование вирусом более одного метода
генерации своей метки (кратность длины файла некоторому значению; кратность n
байт в конце файла значению m, где n зависит от даты создания файла, а m от
времени создания файла; ...) и не инфицирование файлов при наличии у них хотя
бы одного признака. Выбор метода генерации метки при инфицировании так же
может быть случайным событием. Здесь главное выбрать такие признаки, которые
хоть иногда позволяли бы вирусу находить себе жертв ;)
Надеюсь, что после моих рассуждений даже самые закоренелые пессимисты
согласятся, что концепция FullMorph никак не страдает от того, что вирус может
и должен оставлять свои метки в инфицированных файлах чтобы избежать
повторного заражения.
Утверждение второе
==================
Данные вируса будут демаскировать вирус и будут прекрасной
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
сигнатурой, что сведет все усилия вирмейкера на нет
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ну давайте для начала разберемся, какие данные нужны вирусу и без чего
можно обойтись. Для обычного Search вируса без полиморфной ангины кроме маски
файла и сохраненных байт программы и хранить, собственно, ничего не нужно. Все
остальное можно с успехом взять из DTA. Сохраненные байты программы можно
вставить непосредственно в код, например:
обычно восстановление начальных байт делается вот так:
mov si,offset OldBytes
mov di,100h
mov cx,3
rep movsb
...
OldBytes:
db 090h, 090h, 090h
при переносе в код мы избавляемся от необходимости хранения данных
mov di,100h
mov ax,09090h
stosw
mov al,090h
stosb
а вот теперь посмотрите на такой фрагмент:
mov ax,0c9h
push ax
pop si
add si,037h
push bx
add bx,0a2c4h
xchg bx,ax
pop bx
sub ax,bx
sub ax,1234h
mov word ptr ds:[si],ax
xchg si,di
mov al,6dh
add ax,23h
stosb
Все три фрагмента делают одно и то же, однако в последнем случае
антивирус без эмулятора уже не сможет найти место, где восстанавливаются байты
жертвы да и сами байты программы уже растворились в коде. FullMorph вирус
должен генерировать такие фрагменты случайным образом для новой копии и
разбавлять эти фрагменты мусорными командами. Все, нет ни данных ни сигнатуры.
А эмулятор никоим образом на данном фрагменте не сможет однозначно
идентифицировать вирус, да и мусорные команды могут быть не просто пустышками,
а анти отладочным, анти эвристическим или анти эмуляционным кодом (у каждого
эмулятора есть свои ограничения). Позволю себе одну ремарочку: не стоит
увлекаться созданием мусора с оригинальными анти антивирусными приемами,
поскольку именно эти приемы и будут прекрасным идентификатором вируса для
вирусолога. Да, никто не заставляет восстанавливать исходные байты программы в
самом начале вируса. Это можно сделать абсолютно в любом месте вирусного кода.
Перемещение блока восстановления жертвы по коду внесет дополнительную
полиморфность и эти данные будут спрятаны от любознательных глаз как за
крышкой гроба. И совсем не обязательно перемещая этот блок хранить в начале
кода вируса JMP на него. Можно просто "врезать" этот блок в любой другой,
случайно выбираемый при генерации новой копии вируса.
Так, у нас осталась маска файлов для поиска. С ней можно обойтись
примерно таким же способом. Вот три фрагмента:
стандартный способ
mov ah,4eh
mov cx,0feh
mov dx,offset FileMask
int 21h
...
FileMask db '*.com',0h
переносим данные в код
mov ah,4eh
mov cx,0feh
xor bx,bx
mov si,sp
push bx
mov bx,'mo'
push bx
mov bx,'c.'
push bx
mov bh,'*'
push bx
mov dx,sp
inc dx
mov sp,si
int 21h
а вот теперь посмотрите на такой фрагмент:
mov bh,14h
mov di,sp
xchg bx,ax
xor bx,bx
add ah,3ah
push bx
inc bh
dec bx
xchg cx,bx
dec cx
mov bx,06d6fh xor 1234h
xor bx,1234h
push bx
mov bx,(0632eh + 1234h)
sub bx,1234h
push bx
mov bx,1100h
add bx,1900h
push bx
mov bx,sp
inc bx
xchg bx,dx
xchg bx,di
xchg bx,sp
int 21h
Всё. Данные растворились в коде, а код полиморфичен. Сигнатура исчезла и
нет необходимости хранить смещение данных. Правда за такие финты ушами
приходится жертвовать минимизацией размера вируса, но... красота требует
жертв.
Теперь посмотрим, что же нам готовит полиморфность. А готовит она нам
следующее: если вирус модифицирует свое тело, то придется хранить таблицы для
дизассемблирования и варианты для замены команд / блоков. Если вирус
генерирует новую копию, то придется хранить данные для генератора. Эти данные
так просто в код не засунешь. Конечно можно выделять блок памяти под таблицы и
пихать в него таблицы прямо из кода таким же макаром, как в предыдущем примере
в стек пихалась маска для поиска файлов. Но это приведет к офигенному
увеличению кода, хотя цель уже будет достигнута. Но есть еще два пути:
традиционный и нетрадиционный. Традиционный заключается в том, что в теле
вируса данные шифруются полиморфик-циклом, а полиморфный декриптор
модифицируется тем же способом, что и остальной код. И совсем не обязательно
расшифровывать данные вируса в самом начале. Можно сначала произвести поиск
подходящих файлов для инфицирования, создать список их имен в памяти или на
диске, а уж потом (или в процессе поиска подходящих файлов в случайном месте)
расшифровать данные. Нетрадиционный заключается в том, что вирус при создании
n-ой копии будет сам себя "кастрировать" (как это сделано в VCG). Кастрация
заключается в том, что создавая n-ую копию вирус не включает в нее ни данные
ни полиморфную ангину (или полиморфный генератор). С одной стороны это
приведет к тому, что вирус, начиная с n+1 копии, уже не будет меняться. С
другой стороны можно вообще забить на данные и оставить их как есть, все равно
в одно прекрасное мгновение они не будут записаны в очередную жертву и
привязываться к ним антивирус не сможет (иначе он не сможет ловить n+1 копии
вируса). При этом совершенно не известно как будет выглядеть n-ая копия вируса
и сколько она создаст n+1 копий, практически не похожих друг на друга.
Особенно интересно совместить кастрацию с внутренним полиморфик-циклом.
Тогда во время периода жизни вируса с 1 по n-ую копию данные будут
зашифрованы, а начиная с n+1 копии их вообще не будет. При кастрации будет
высвобождаться туева хуча места, которое можно использовать для увеличения
проходов FullMorph-ангины с целью усиленного изменения n+1 копии вируса.
Надеюсь, что я развеял ваши сомнения по поводу того, что данные и
FullMorph не совместимы. Я привел только два подхода к данным, а их, как мне
кажется, столько же, сколько волосиков на среднестатистической пи$де.
Утверждение третье
==================
Вирус, тем более такой, будет содержать команды переходов. Эти
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
команды станут непреодолимой трудностью для мутаций
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ну во первых вирус может вообще не содержать команд переходов в чем можно
убедиться, если повнимательнее почитать предыдущие номера MooNBuG'а. Во
вторых, большинство команд условных и безусловных переходов будут находиться в
ангине, а ее можно либо полиморфно зашифровать, либо однажды кастрировать,
либо и то и другое вместе (смотри предыдущие рассуждения). Если допустить, что
сама ангина мутировать не будет, то не придется ломать голову над пересчетом
адресов переходов. Да и генерация этих адресов не такая уж и сложная задача.
Вот как я решил ее в VCG:
;--- Калькуляция перехода
;Input: si - адрес метки для перехода
; di - адрес команды перехода
; bx - адрес начала буфера
;Output: none
CalcJump:
push ax cx dx
mov ax,di
mov dx,si
sub ax,bx
sub dx,bx
cmp ax,dx
jl JumpDown
JumpUp:
mov cx,0ffffh
sub ax,dx
sub cx,ax
sub cx,2
xchg dx,cx
jmp FormJump
JumpDown:
add ax,3
sub dx,ax
FormJump:
mov word ptr ds:[di+1],dx
pop dx cx ax
ret
Так же рекомендую заглянуть в исходники вирусов PolyLabel и BlackLabel
(названные вирусологами GU.xxxx), которые были опубликованы в предыдущих
номерах журнала. Так что вариантов выкрутиться из этой проблемы много.
Надеюсь, вас не испугают такие "трудности" тем более, что десяток решений
этой проблемы уже предложено в нашем журнале. А дальше - это ваша фантазия.
Утверждение четвертое
=====================
С каждой копией вирус будет увеличиваться в размерах, что его
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
будет демаскировать и в конце концов приведет к гибели жертву
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
А кто сказал, что большая длина вируса - это плохо ? Это было бы плохо
еще пару лет назад, но сейчас память дешевеет... Кроме того, чем больше длина,
тем сложнее ее анализировать. Также не надо забывать, что у антивирусного
эмулятора есть такое понятие, как "глубина эмулирования", т.е. грубо говоря
через сколько команд/секунд/условных единиц (нужное подчеркунть) прекратить
эмулирование выполнения команд данного файла и перейти к проверке
следующего. Я не призываю к написанию HLLP, HLLC, но большая длина
потенциально может быть полезной.
Все зависит от того, как подойти к FullMorph. Если подойти с позиций,
которые описывал Reminder в PVT.VIRII, то безусловно вы столкнетесь с этой
проблемой. Однако сам же Reminder и предложил несколько решений этой проблемы.
За более конкретными советами прошу обращаться непосредственно к нему. Если
посмотреть с позиций вирусов PLY, то вполне можно плавать в некоторых разумных
рамках с увеличением / уменьшением кода. Если глянуть выше, где я говорил о
данных, то становятся видны два решения:
- вирус может не модифицировать свой код, а постоянно его регенерировать,
что приведет к некоторым разумным рамкам по варьированию длины новой копии;
- вирус будет однажды кастрирован и больше мутировать не будет и при этом
к моменту кастрации у него все еще сохранится приемлемая длина кода.
А то, что длина демаскирует вирус - это и слону понятно. Только при этом
не следует забывать, что FullMorph-вирус может быть резидентным стелс-вирусом.
Да и при отсутствии ревизора / инспектора и сложной реализации зверька не
доступной для анализа вирусологам (чего, собственно, мы и добиваемся) это
приращение длины будет антивирусу как мертвому припарка. Главное - сделать
разумные ограничения в ангине, чтобы с первых же копий не нагенерировать код,
который забьет 6 гигабайтный диск командой перехода на тело зверька ;)
В общем я не вижу здесь никаких не решаемых проблем. Надеюсь, что и вы
тоже их не видите.
Утверждение пятое
=================
Вирус должен восстанавливать жертву перед возвратом управления
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
и именно в этот момент его можно будет отследить и вылечить
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Во первых антивирусу еще нужно найти место, которое вирус будет
восстанавливать. Ну посмотрите хотя бы уже старенький прием с плавающей точкой
передачи управления вирусу, который приведен в вирусах V++. Пусть антивирус
нашел таки это место и поставил туда хардверный бряк, ну и что? К этому
моменту вирус уже успеет перетрахать весь винчестер, отработает возможная
троянская компонента и вместо передачи управления вирус вызовет перезагрузку
компа (возможно последнюю в его жизни). Допустим, что ожидание процесса
передачи управления жертве будет происходить в некотором виртуальном мирке,
созданном эмулятором антивируса. А кто это вирусологу сказал, что после
восстановления байт в точке перехода вирус таки отпустил жертву? Есть такие
красивые вещи, как симбиоз и принципы "неизлечимости". Ну с симбиозом понятно.
Этому вопросу мы уже уделяли внимание в ранних выпусках MooNBuG'а. О
неизлечимости вам поведает S.S.R. Я хочу только привести простейший пример,
где этот финт ушами у антивируса не пройдет.
Вирус может просканировать (сканировать, трассировать, эмулировать) тело
жертвы в поисках "горячих" команд, как то вызов прерываний, команд безусловных
переходов и пересылки данных и организовать их выполнение из своего кода.
например, в теле жертвы найден такой фрагмент кода:
...
je @1
jmp @2
@1:
...
@2:
...
что вирусу мешает изменить этот кусок на следующий:
je @1
jmp @3
@1:
...
@2:
...
[тело вируса]
@3:
jmp @2
...
[тело вируса]
В данном случае вирусу нет никакой необходимости восстанавливать тело
жертвы в первоначальный вид, а лечение жертвы без восстановления всех таких
фрагментов будет губительно в первую очередь для самой жертвы. И таких вот
изюминок может быть случайное количество со всевозможными вариантами.
K FullMorph это, честно говоря, имеет весьма косвенное отношение, но
проблемой для вирмейкера точно не является. Передача управления жертве
является больным местом для любого файлового вируса, а полная полиморфность
служит совершенно для других целей: не нашел - не полечил. Не будет же DrWeb
или AVP запускать все подряд файлы на вашем компе! Да и на эмуляцию каждой
программы уйдет туева хуча времени, а при стремительном увеличении размеров
винта и геометрической прогрессии наполнения их всевозможным хламом такой
антивирусный подход не приведет ни к чему. Так что в свете рассматриваемого
утверждения FullMorph стоит того, чтобы вы его сделали.
Надеюсь, что и это опасение снято с ваших перепуганных в доску душ ;)
Утверждение шестое
==================
Механизм мутаций будет настолько сложным, что его нельзя будет
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
хорошо замаскировать и именно в нем антивирусы найдут сигнатуру
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Собственно отвечая на четвертое утверждение я ответил и на это
предубеждение. Однако повторюсь. Все зависит от того, с какой стороны вы
подойдете к вопросу создания полномутирующего вируса. Подходов на сегодняшний
момент уже известно около десятка. Каждый имеет свои преимущества и свои
недостатки. Я надеюсь, что вы найдете ту золотую середину между жертвой
размера и сложностью конечной копии, которая доставит не мало головной боли
вирусологам.
Постарайтесь минимизировать свою ангину и при этом сохранить максимум
функциональности. Однако это именно ваша проблема - выбрать и
усовершенствовать что-то готовое или создать что-то свое. Главное - начать.
Утверждение седьмое
===================
Этого не может быть, потому что не может быть никогда
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ну если вас не убедили мои рассуждения по шести приведенным выше
утверждениям, то вы либо счастливый человек - вам это не нужно, либо полный
кретин, которому говорить - что об стенку горох ;)
В предыдущем номере журнала я опубликовал кодогенератор VCG, который
является моей, пусть несколько глюкавой, версией FullMorph. Уже после того,
как журнал был обнародован и Belka и Strelka попали в силки вирусологов (там
столько было глюков и недоделок, что это и не удивительно), в очередном
апдейте к AVP появилось сообщение о более мощной ангине ACG для резидентных
FullMorph-вирусов. Почему AVP стал детектировать ACG? Не знаю - я так и не
нашел эту ангину. Возможно в ней тоже что-то не предусмотрели или внесли
какие-то баги. Надеюсь, что вашу ангину уж точно никто задетектить не сможет.
Так что это не просто может быть, это уже есть!
Самое интересно, что идею FullMorph можно реализовать не только в
ассемблере, но и в языках высокого уровня. Примером могут служить вирусы HLLW.
Fomin и HLLW.FMRA, опубликованные в предыдущих номерах журнала. Доведенная до
ума эта идея представлена в журналах DVL. Вот разве что еще никто не сделал
хотя бы первую реализацию FullMorph на пакетных файлах, скриптах и макросах.
Все еще впереди... А может быть это сделаете вы?
Да, если у вас есть еще какие то утверждения о том, что этого не может
быть или что невозможно создать не детектируемые вирусы - не стесняйтесь,
высылайте мне свои вопросы, сомнения и утверждения. Я постараюсь разобраться
сам и ответить на них всем. Как всегда, мой адрес: [email protected]
Особая благодарность за помощь при подготовке этой статьи выражается:
"Dmitry Kulshitsky"<[email protected]>