Полиморфизм компьютерных вирусов
Полиморфизм компьютерного вируса (греч. πολυ- — много + греч. μορφή — форма, внешний вид) — специальная техника, используемая авторами вредоносного программного обеспечения для снижения уровня обнаружения вредоносной программы классическими антивирусными продуктами.
Описание метода
Полиморфизм заключается в формировании программного кода вредоносной программы «на лету» — уже во время исполнения, при этом сама процедура, формирующая код, также не должна быть постоянной и видоизменяется при каждом новом заражении. Зачастую, изменение кода достигается путём добавления операторов, не изменяющих алгоритм работы программного кода (например, оператор 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.