Обсуждение полиморфизма

Обсуждение полиморфизма
Гэри М. Уотсон
31 мая 1992 г.

Полиморфный вирус - это разновидность вируса-шифровальщика. Давайте сначала поговорим о них. Многие антивирусные
программы полагаются на так называемый "сканер", который ищет необычную последовательность операций на машинном языке или другие уникальные данные, указывающие на присутствие данного вируса.
Чтобы победить это, авторы вирусов начали шифровать свои вирусы, применяя (например) случайное
число, эксклюзивно-орбитальное с телом вируса. Таким образом, уникальная строка байтов затушевывается.
Таким образом, программам, подобным сканированию McAfee, приходилось делать одно из двух: искать процедуру расшифровки.
(которая сама не может быть зашифрована, так как микропроцессор 808x не сможет ее выполнить); или
пытаться расшифровать тело вируса и искать уникальную строку байтов в теле вируса.
вируса.


Чтобы победить даже это, авторы вируса создали полиморфизм. По сути, это подразумевает
процедуру в теле вируса, которая на лету, во время каждого нового процесса заражения,
генерирует новый уникальный модуль расшифровки и алгоритм, который будет использоваться в новой инфекции.
инфекции. Идея двоякая: убедиться, что процедура расшифровки не имеет
предсказуемой последовательности байтов; и, во-вторых, убедиться, что тело вируса
зашифровано достаточно сложным и непредсказуемым алгоритмом, который не может быть расшифрован
антивирусным сканером.

Итак, McAfee, Frisk и другие сделали следующее: проанализировали методы, используемые каждым полиморфным
генератором, а затем создали алгоритм, который обнаруживает типы мутаций, создаваемых каждым
полиморфным вирусом. Согласно предварительным результатам, полученным Вессилином Бонтчевым,
Scan 89B от McAfee пропускает 0,04% мутаций "Fear", типичного вируса, который использует
Mutation Engine полиморфный объектный модуль; F-Prot пропускает 0,14%; и Dr. Solomon's
FindVirus пропускает 7,86% из них. Бончев считает, что обнаружение менее 100% является
почти полным провалом, так как любой из пропущенных образцов может повторно заразить систему в
позднее. Текущий выпуск Scan - 93 (на эту дату), и неизвестно, каков его
процент обнаружения неизвестен.

Итак, как работают полиморфные вирусы? Что ж, давайте составим псевдокод одного из способов.
как это можно сделать. Это будет похоже на то, как работает механизм мутации.

1. Мы просыпаемся как вирус, загруженный в память. Ни одна часть нас в это время не зашифрована. Мы
состоят из обработчиков прерываний для таких вещей, как запрос на обслуживание INT 21H ms-dos и т.д.; процедуры мутации; и полезной нагрузки любого типа.

2. Мы перехватываем запрос ms-dos INT 21h Open File. Мы решаем, что сейчас самое подходящее время
заразить этот файл.

3. Мы вызываем процедуру мутации, которая создает уникальную пару шифровальщика и дешифровальщика. На сайте
затем вызывает вновь созданный шифровальщик, который берет образ памяти
вируса (помните, что вирус НЕ зашифрован, пока находится в памяти), записывает расшифровщик
в переднюю часть буфера данных в памяти, за которым следует зашифрованная копия вируса. Помните
помните, что сам вирус содержит не только традиционный код вируса, но и процедуру
которая генерирует пары шифратор/дешифратор.

4. Мы заражаем файл жертвы, используя буфер памяти, который содержит расшифровщик/зашифрованную
комбинация вирусов

5. Мы выполняем вызов функции ms-dos, которую запросил пользователь.

Теперь при выполнении файла-жертвы ms-dos будет переходить к началу работы
расшифровщика, который затем расшифровывает образ памяти зашифрованного вируса и передает управление
управление теперь уже расшифрованному вирусу, который выполняется нормально.

Большинство людей не понимают, как процедура мутации генерирует необходимую
уникальную пару шифратор/дешифратор. Метод, используемый механизмом мутации, чрезвычайно
сложен, но для демонстрации можно придумать и более простой, и разница
будет только в сложности, а не в содержании.

Рассмотрим пример пары шифратор/дешифратор, показанный ниже, рядом для удобства сравнения. Для простоты понимания человеком, все представлено так, как будто процедура мутации
создает ассемблерный код. В действительности, она просто создает двоичный машинный код, который хранится
непосредственно в памяти.

Примечание: я считаю, что нижеприведенный полиморф был бы довольно слабым, если бы он был реализован.
то есть McAfee и др. не составило бы большого труда обнаружить его. Поэтому,
я считаю, что представление этого примера на публичном форуме не представляет значительной опасности и имеет
потенциально может прояснить большую часть недопонимания, окружающего этот вопрос

Обратите внимание, что в этом очень простом полиморфном примере мало предсказуемых байтовых строк, поскольку
неизвестно, какой регистр указателя будет использоваться, содержимое любого из случайных чисел
aa - jj, ни сколько байтов программа решит загадить за одну итерацию.
Заметим, что, изменяя эти факторы, можно получить чрезвычайно сложное шифрование, так как и алгоритм, и ключевые данные являются очень сложными.
алгоритм и ключевые данные значительно изменяются. Даже *количество* ключевых данных
меняется от одного зараженного файла к другому.

Сила полиморфного вируса заключается в том, насколько тщательно он мутирует, то есть в том, насколько
непредсказуемость последовательности инструкций в модуле дешифратора. В частности, не более
не более 4 байт может быть предсказуемым, иначе можно построить простую сканирующую строку, и тогда
весь полиморфный код будет пустой тратой усилий вирусописателя.

(Кстати, если я допустил какие-либо опечатки в приведенных выше примерах кода, *ГОСПОДИ*. Представьте, что я сделал это
специально, чтобы запутать любого начинающего вирусописателя, который попытается использовать код как есть. Конечно, я
не показывал код, необходимый для реализации полиморфа, я только показал, 
что он может сделать).