Полиморфный код - Polymorphic code

В вычислениях полиморфный код - это код, который использует полиморфный механизм для мутации, сохраняя при этом исходный алгоритм нетронутым, то есть код изменяется при каждом запуске, но функция кода (его семантика ) не изменяется вообще. Например, 1 + 3 и 6-2 достигают одного и того же результата при использовании разных значений и операций. Этот метод иногда используется компьютерными вирусами , шелл-кодами и компьютерными червями, чтобы скрыть свое присутствие.

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

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

Вредоносный код

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

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

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

Первый известный полиморфный вирус был написан Марком Вашберном. Вирус, получивший название 1260 , был написан в 1990 году. Более известный полиморфный вирус был создан в 1992 году хакером Dark Avenger как средство предотвращения распознавания образов антивирусным программным обеспечением. Распространенным и очень вирулентным полиморфным вирусом является файловый инфекционист Virut .

Пример

Этот пример на самом деле не является полиморфным кодом, но послужит введением в мир шифрования с помощью оператора XOR . Например, в алгоритме, использующем переменные A и B, но не переменную C, может быть большой объем кода, который изменяет 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

Зашифрованный код - это полезная нагрузка. Чтобы сделать разные версии кода, в каждой копии строки мусора, которые управляют C, будут изменяться. Код внутри «Encrypted» («много зашифрованного кода») может искать код между Decryption_Code и CryptoKey и каждый алгоритм для нового кода, который делает то же самое. Обычно кодировщик использует нулевой ключ (например, A xor 0 = A) для первого поколения вируса, что упрощает работу кодировщика, поскольку с этим ключом код не шифруется. Затем кодер реализует алгоритм инкрементного ключа или случайный.

Полиморфное шифрование

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

// encrypted with https://www.stringencrypt.com (v1.1.0) [C/C++]
// szLabel = "Wikipedia"
wchar_t szLabel[10] = { 0xB1A8, 0xB12E, 0xB0B4, 0xB03C, 0x33B9, 0xB30C, 0x3295, 0xB260, 0xB5E5, 0x35A2 };
 
for (unsigned tUTuj = 0, KRspk = 0; tUTuj < 10; tUTuj++) {
    KRspk = szLabel[tUTuj];
    KRspk ^= 0x2622;
    KRspk = ~KRspk;
    KRspk --;
    KRspk += tUTuj;
    KRspk = (((KRspk & 0xFFFF) >> 3) | (KRspk << 13)) & 0xFFFF;
    KRspk += tUTuj;
    KRspk --;
    KRspk = ((KRspk << 8) | ( (KRspk & 0xFFFF) >> 8)) & 0xFFFF;
    KRspk ^= 0xE702;
    KRspk = ((KRspk << 4) | ( (KRspk & 0xFFFF) >> 12)) & 0xFFFF;
    KRspk ^= tUTuj;
    KRspk ++;
    KRspk = (((KRspk & 0xFFFF) >> 8) | (KRspk << 8)) & 0xFFFF;
    KRspk = ~KRspk;
    szLabel[tUTuj] = KRspk;
}
 
wprintf(szLabel);

Как вы можете видеть в этом примере C ++, строка была зашифрована, и каждый символ был сохранен в зашифрованном виде с использованием формата UNICODE widechar. Были использованы различные команды шифрования, такие как побитовое исключающее ИЛИ , НЕ , сложение, вычитание, ротация битов. Все рандомизировано, ключи шифрования, счетчики ротации битов и команды шифрования тоже порядок. Выходной код может быть сгенерирован на C / C ++ , C # , Java , JavaScript , Python , Ruby , Haskell , MASM , FASM и AutoIt . Благодаря рандомизации сгенерированный алгоритм каждый раз меняется. Невозможно написать универсальные инструменты дешифрования, и скомпилированный код с полиморфным кодом шифрования должен анализироваться каждый раз, когда он повторно шифруется.

Смотрите также

использованная литература

  1. Перейти ↑ Raghunathan, Srinivasan (2007). Защита антивирусного ПО от вирусных атак (M.Sc.). Государственный университет Аризоны. CiteSeerX  10.1.1.93.796 .
  2. ^ Вонг, Крыло; Штамп, М. (2006). «Охота за метаморфическими двигателями». Журнал компьютерной вирусологии . 2 : 211–229. CiteSeerX  10.1.1.108.3878 . DOI : 10.1007 / s11416-006-0028-7 .
  3. ^ Wójcik, Бартош (2015). Шифрование строк и файлов