Полиморфизм компьютерных вирусов

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

Описание метода 
Полиморфизм заключается в формировании программного кода вредоносной программы «на лету» — уже во время исполнения, при этом сама процедура, формирующая код, также не должна быть постоянной и видоизменяется при каждом новом заражении. Зачастую, изменение кода достигается путём добавления операторов, не изменяющих алгоритм работы программного кода (например, оператор NOP).

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

История 
Первый известный полиморфный вирус был написан Марком Вашбёрном (Mark Washburn). Вирус, который назывался 1260, был создан в 1990 году. Более известный полиморфный вирус был внедрён в 1992 году болгарским взломщиком Dark Avenger (псевдоним), создавшим MtE (Mutation Engine).

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

Пример алгоритма 

Алгоритм, который использует переменные A и B, но не использует переменную C, может оставаться работоспособным даже если добавить множество различных команд, которые будут изменять содержимое переменной C.

Исходный алгоритм:
Start:
GOTO Decryption_Code
Encrypted:
    ...
    lots of encrypted code
    ...
Decryption_Code:
    A = Encrypted
Loop:
    B = *A
    B = B XOR CryptoKey
    *A = B
    A = A + 1
    GOTO Loop IF NOT A = Decryption_Code
    GOTO Encrypted
 CryptoKey:
    some_random_number

Тот же самый алгоритм, но с добавлением операций, изменяющих переменную C:
Start:
GOTO Decryption_Code
Encrypted:
    ...
    lots of encrypted code
    ...
Decryption_Code:
    C = C + 1
    A = Encrypted
Loop:
    B = *A
    C = 3214 * A
    B = B XOR CryptoKey
    *A = B
    C = 1
    C = A + B
    A = A + 1
    GOTO Loop IF NOT A = Decryption_Code
    C = C^2
    GOTO Encrypted
 CryptoKey:
    some_random_number

Код внутри секции «Encrypted» может затем обрабатывать код между секциями «Decryption_Code» и «CryptoKey» и удалять «ненужные» операции, меняющие переменную C. Перед тем, как криптографическое устройство будет вновь использовано, он может добавить новые «ненужные» операции, меняющие переменную C, или даже полностью изменить алгоритм, но так, что он будет выполнять те же функции.

Пример кода на ассемблере 

Один из самых простых способов реализации шифрования основного тела вируса — её побайтное шифрование операцией XOR
    mov cx, code_length
    mov si, offset begin_code
    mov al, xor_key

_loop:
    xor [si+cx], al ;расшифровываем байт
    loop _loop      ;берем следующий байт
    jmp si

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

Новая процедура расшифровки может формироваться с помощью следующих простых действий:
 какая-либо инструкция заменяется на другую(-ие), но делающую то же самое.
Скажем,  add eax, 5  может быть заменена на  sub eax, −5 
а код  mov ax, bx  может быть заменен на  push bx
 pop ax
 перестановка, обмен местами инструкций, порядок следования которых неважен
 добавление «мусорных команд»

Способы защиты 
Для эффективной защиты от полиморфных вредоносных программ необходимо применение проактивных методов антивирусной защиты, таких как эвристический анализ и эмуляция. Однако эвристический анализ и эмуляция не могут гарантировать 100%-го обнаружения полиморфных вредоносных программ, в связи с чем рекомендуется использование HIPS.

См. также 
 Полиморфные генераторы
 Самомодифицирующийся код
 Полиморфизм (информатика)

Ссылки 
 Mutation Engine

Компьютерные вирусы