Допустим, у нас есть программа, обнаружение которой мы хотим
сделать невозможным. Сделав код полиморфным (т.е. самоизменяющимся), мы сможем
защититься от обнаружения по сигнатуре (куску кода, присущему этой программе,
и не присущему другим).

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

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

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

1. Сигнатура. Ни в одном варианте полиморфного кода не должны встречаться
нетипичные для «нормальной» программы последовательности инструкций, иначе
появится критерий «нормальности» программы, что уменьшит время анализа кода.

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

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

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

Вот несколько типов таких преобразовний:

1. Вставка неактуального кода. Происходит работа с регистрами и памятью, которые никак
не затрагивают состояние процессора, используемое данным этапом алгоритма. Эмулятор
не может знать, какие действия актуальны, а какие-нет, вынужден эмулировать их все.

2. Вставка любого кода с сохранением актуальных данных. Аналогично, но данные можно изменять,
так как они будут восстановлены из стека или памяти в конце вставки. Также здесь могут
быть вставлены вызовы процедур и системных функций.

3. Эквивалентные с точки зрения актуальности преобразования кода.

Пример: вместо
mov eax, ebx можно использовать

push ebx
pop ecx
mov eax, ecx.

В качестве метода реализации воспользуемся схемой, заимствованной из дискретной математики.
Пусть алгоритм задан строкой символов (16-битных). Есть набор правил, которые делают из одних
символов один или несколько других, и набор соответствий символов и исполняемых кодов.

Шаг полиморфизирующего алгоритма — одно преобразование текущей строки по случайному правилу.
Правила составлены в соответствии с преобразованиями типов 1-3, что позволяет на любом шаге
составить из строки исполняемый код, выполняющий действия заданного алгоритма.

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

Оставить мнение

Check Also

Что можно сделать с iPhone, зная пасскод. Как сливают данные, уводят iCloud и блокируют остальные устройства

Последние несколько месяцев мы много писали о нововведениях в iOS 11. «Теперь-то заживем!»…