- Полиморфный вирус
-
Полиморфизм компьютерного вируса (греч. πολυ- — много + греч. μορφή — форма, внешний вид) — техника, позволяющая затруднить обнаружение компьютерного вируса с помощью скан-строк и, возможно, эвристики. Вирус, использующий такую технику, называется полиморфным.
Полиморфизм заключается в формировании кода вируса «на лету» — уже во время исполнения, при этом сама процедура, формирующая код также не должна быть постоянной и видоизменяется при каждом новом заражении. Большинство антивирусных программ пытаются обнаружить вредоносный код, соответствующий компьютерному вирусу, или часть кода такого вируса, посредством проверки файлов и данных, находящихся на компьютере или пересылаемых через компьютерную сеть или Интернет. Если изменить код вируса, отвечающий за поиск и заражение новых файлов или какую-либо другую важную его часть, то антивирус не сможет обнаружить такой «измененный» вирус. Часто код вируса «меняют», добавляя операторы эвристика и эмуляторы кода.
Содержание
История
Первый известный полиморфный вирус был написан Марком Вашбёрном (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
- перестановка, обмен местами инструкций, порядок следования которых неважен
- добавление «мусорных команд»
См. также
- Ассемблер
- Компьютерный вирус
- Хронология компьютерных вирусов и червей
- Метаморфный код
- Самомодифицирующийся код
- Алфавитно-цифровой код
- Шеллкод
- Взлом ПО
- Взлом защиты
Ссылки
Wikimedia Foundation. 2010.