Модель метаморфного преобразования исполняемого кода

УДК 004.4

МОДЕЛЬ МЕТАМОРФНОГО ПРЕОБРАЗОВАНИЯ ИСПОЛНЯЕМОГО КОДА

П.В. Збицкий

EXECUTABLE CODE METAMORTHIC TRANSFORMATION MODEL

P.V. Zbitskiy

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

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

In the paper built model of metamorphic transformation of executable code by using finite automatons and formal grammars. This is a new model which considers code-growing and code-shrinking techniques. The statement about static undetectable of viruses built by described method is proved

Keywords: computer virus, polymorphism, metamorphism, mathematical model, formal grammar, finite automaton.

Введение

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

1. Полиморфные вирусы

Следуя [6], определим полиморфный вирус как вирус, состоящий из зашифрованной полезной нагрузки, полиморфного генератора и декриптора -изменяемой процедуры расшифрования.

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

Впервые модель полиморфного генератора на основе формальных грамматик предложена в 1999

году [1].

Пусть С = (#, Т, Р, Б) - формальная грамматика, Т = {а, Ь, с, (1, х, г} - терминальный алфавит, состоящий из инструкций процессора х86; а, Ь, с, с1-мусорные инструкции; х, г - инструкции декриптора; N = {А, В, Б} - нетерминальный алфавит, 5 -начальный символ.

5 аБ | 65 | с5 | аК | хА Р = • А -> аА | ЬА | сА\ М \ гВ ~ правила вывода.

В -> аВ | ЪВ | с В | с1В | е Полученный, согласно данным правилам, дек-риптор может быть, например, таким: аЬЬсхаагс1.

Также в [1] рассмотрен вопрос обнаружения данного полиморфного генератора путем построения соответствующего конечного автомата (рис. 1).

Рис. 1. Автомат, распознающий простой вирусный декриптор

Збицкий Павел Владимирович - аспирант ЮУрГУ; Zbitskiy Pavel Vladimirovich - postgraduate student of

pavel.zbitskiy@gmail.com_______________________________SUSU; pavel.zbitskiy@gmail.com____________________

Действительно, для регулярных грамматик (которой является рассмотренная), построение автомата, распознающего грамматику, возможно [8, 9, 10]. Однако, данное утверждение [1] некорректно распространено и на другие типы грамматик (в частности, типа 0 по Хомскому). Публичное опровержение данного факта дано лишь в 2007 году [2]. Анализ показывает [7], что успешность сигнатурного подхода детектирования полиморфных вирусов обеспечена использованием полиморфных движков, которые могут быть представлены соответствующей регулярной грамматикой. Данный факт еще раз подтверждает недостаток теоретических работ в области компьютерной вирусологии.

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

В 1999-2000-х годах появились первые мета-морфные вирусы. Самые известные представители: metaPHOR (Simile), Evol, Zmorph, Zmist...

Согласно [6], метаморфный вирус - это вирус, полностью изменяющий свой код при распространении (в отличие от полиморфных вирусов, которые изменяют только декриптор, а остальную часть просто шифруют).

2. Модель метаморфного генератора

Рассмотрим подход к формализации мета-морфных вирусов на основе грамматик, подсказанный анализом метаморфного вируса Zmist [7]. Данный вирус при распространении использует сохраненный «скелет», который и изменяется при производстве новых копий. Вирус дизассемблирует инструкции скелета и последовательно мутирует в новую версию, в которой также присутствует сохраненный скелет.

Данный тип метаморфных вирусов можно смоделировать с помощью формальных грамматик: полезная нагрузка объединяется с метаморф-ным генератором в виде правил некоторой формальной грамматики. То есть, каждая новая копия вируса должна иметь зашифрованный алгоритм, при выполнении которого будут получаться новые различные копии метаморфного вируса. Назовем вирусы такого типа полуметаморфными вирусами, так как они попадают под определение метаморфного вируса (изменение основного тела программы), но вынуждены иметь некую постоянную составляющую, подобно полиморфным вирусам. Для наглядности рассмотрим простой пример.

Допустим, нам нужно создать простую полу-метаморфную программу, завершающую работу ОС Windows: push 0 push 4

call ExitWindowsEx

push 0

call ExitProcess

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

Пусть G = (N,T,P,S) - формальная грамматика; Т - терминальный алфавит, состоящий из инструкций процессора х86, и а, Ь, с, d - мусорные инструкции; N - нетерминальный алфавит; S -начальный символ.

Обозначим ху конкатенацию инструкций х и у, EW - адрес функции ExitWindowsEx, ЕР -ExitProcess, и определим правила вывода грамматики:

1. S^-aS\bS\cS\dS\(pushO)A\

(xor ebx, еЪх  push ebx)A | (sub esp, 4 Ф mov [esp], 0)А

(mov еах, N  xor еах, < N хог 4 >  push еах)В

3. В ^ aB\bB\cB\dB\(call EW)C\

(push $ +10  jmp EW)C | (mov esi, EW © call esi)C

4. C^>aC\bC\cC\dC\(pushQ)D\

(xor ebx, ebx © push ebx)D | (sub esp, 4 © mov [esp], 0)D

5. D->aD\bD\cD\dD\(call EP)E\

(push $+11 push EP © ret)E | (mov esi,EP@ call esf)E

6. E^aE\bE\cE\dE\s

После разбора примера сразу видны недостатки генераторов такого вида: во-первых, огромный размер генератора, ведь для каждой инструкции полезной нагрузки соответствует целый набор правил, а во-вторых, «простота» грамматики.

Перепишем правила вывода в виде (остальные правила остались без изменения):

1. S^XA

4. С -> XD

7. X ^>aX\bX\cX\dX\(pushQ>)\

(xor ebx, ebx  push ebx) | (sub esp, 4 © mov [esp], 0) Полученная грамматика не является регулярной, это неукорачивающаяся грамматика, для которой проблема выводимости (weL(G) или w <£ L(G)) также алгоритмически разрешима [8-10]. Немного усложним модель.

Положим G = (N,T,P,S) - грамматика, в правилах которой описан алгоритм программы, правила вывода имеют вид S АХА

А -> ВлВ Р = - 1

Х^ХхХ

В этом случае программа составлена в виде последовательности АХВХ ...Х\, где АиВи...,Х] можно рассматривать как внутренний язык, на котором написана программа. Таким образом, правила дан-

ной грамматики задают скелет программы. Назовем данные правила метаправилами, а грамматику -метаграмматикой. Метаправила - это «заготовки» для конкретных правил. Далее, рассмотрим грамматику Gj = (N1,Tx,P1,Sl), правила которой будут задавать правила трансляции «внутреннего языка» в конкретные команды или блоки кода.

Например,

Д —» push 01

X] —>

Грамматика Gx описывает мутацию 1-го поколения, G2 - второго и т.д. Тут возникает самый главный вопрос: как из Gx получить G2 таким образом, чтобы правила трансляции при каждой мутации изменялись? Можно сделать Gx максимально объемной, и на каждом шаге выбрасывать из нее некоторые правила. Минус такого подхода очевиден - через конечное число шагов, вирус перестанет мутировать. Как вариант решения -всегда иметь копию максимальной грамматики G], и при достижении критического уменьшения количества правил в Gt, грамматику GM генерировать снова из Gj.

С другой стороны, программа (1) написана на собственном языке.

1. Завершить работу Windows

2. Выйти из программы

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

Назовем вирусы, которые строят новую версию потомка на основании дизассемблирования и мутации собственного кода, метаморфными вирусами общего типа.

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

Классический недетерминированный автомат, моделирующий подобного типа вирусы, выглядит весьма громоздко, так как для каждого состояния предусмотрены все возможные входные символы (рис. 2):

Опишем автомат формально: автомат ^ = (Q, 2, S, <70) > множество состояний

Q ~ {Яо) u{инструкции х86} , входной алфавит

£ = {инструкции х86}, функция перехода

S ’.Qx.lL —> Q.

Входная программа - некоторое слово (цепочка) из 2*. Мутацией в таком случае будет путь автомата <7^2 то есть набор состояний, которые он посетил при обработке входного слова. Это модель универсального метаморфного генератора.

Рис. 2. Автомат, моделирующий метаморфный генератор

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

Опишем данную грамматику формально: в = (ТУ, Т, Р, #0 ) - грамматика,

N = {<70,Л,В,С,...} - ее нетерминальный алфавит,

Т = {ах,а2,а3,...,гп} = {инструкциих&6} - терминальный алфавит,

д0 - начальный символ.

Правила вывода имеют вид >0 -> АА1ВВ\...\22 А->ВВ\СС\...\г1

Р =

А а\ I

Z

I «2 I — I "и

*11-К

Данный набор правил реализует следующие соображения:

1. Каждый нетерминал представляет собой все варианты трансляции некоторой команды.

2. Двойное вхождение нетерминала в правую часть правил обеспечивает «связность» - выводимость произвольных последовательностей.

Работа описанного генератора выглядит следующим образом: получаем цепочку нетерминалов, которую затем транслируем в терминальные символы - инструкции процессора. Например:

90 -> ЯЯ -> Ш -> ВйКК ВЮКЫ ->...

—> ВОКЬМИ —» ^5к214т%пи .

Таким образом, получена неукорачивающаяся

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

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

Заманчивой выглядит идея переписать правила сжатия следующим образом. Пусть X,Y,Z -команды х86, причем XY = Z . Тогда правило вывода XY —»Z будет соответствовать тому, что последовательность инструкций XY сжимается в инструкцию Z.

Рассмотрим пример. Пусть X = хог еах, еах, Y = push еах и z — push 0 . Имеется следующий набор правил вывода:

М -> XX X^YY Y -> NN XY —> z

В этом случае, вывод (работа метаморфного генератора) имеет вид

[zY-* zNN-+...

’ [JSTAW ...

Отметим, что обе ветки семантически эквивалентны - поместить на вершину стека нуль.

Возникает вопрос, как в этом случае изменить автомат? Пусть автомат находится в состоянии М, и ему на вход подается символ хог еах, еах. Автомат при этом попадает в состояние X, соответствующее одной из трансляций команды хог еах, еах.

Далее автомату приходит символ push еах. Наряду с переходами в состояние Y, имеется переход в состояние z, соответствующее команде push 0. Состояние push 0 особое. При попадании в него, автомат должен выкинуть предыдущее состояние X из своего пути, как будто бы существовала дуга (M,z) и z = push 0. Рис. 3 демонстрирует описанный принцип сжатия кода.

М -» XX XYY -

Рис. 3. Часть автомата, поясняющая сжатие кода

Отметим, что ни о какой формальной эквивалентности первоначальных и полученных грамма-

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

Итак, в грамматике появились правила вывода типа ХУ —> г, следовательно, грамматика перестала быть неукорачивающейся. Более того, это грамматика общего вида. Для грамматик этого типа проблема принадлежности слова языку, порожденного грамматикой, неразрешима [8-10]. Данный факт еще раз доказывает возможность создания не детектируемых метаморфных вирусов.

3. Обсуждение

Предложена общая модель метаморфного вируса [2].

Пусть Ог=(Р,Т,Р,!5), С2=(№ ,Т ,Р ,Б) -грамматики, Т - множество формальных грамматик, Б - стартовая грамматика, Я - правила

вывода относительно (¿У иГ)Г. Тогда метаморф-ный вирус описывается Ог и каждая из его мутаций есть слово в Ь(ЦС2)), то есть слово в Ь(х) для некоторого х е Ь(02), где я: - грамматика.

Данное определение описывает факт, что при мутации от одной формы до другой, ядро вируса изменяется, а также изменяются сами правила мутации. На основе данной модели [2] построен теоретический прототип необнаруживаемого метаморфного вируса РВ МОТ. Стоит отметить, что на практике данная модель крайне трудно реализуема.

Этого недостатка лишены рассмотренные выше модели полуметаморфного вируса и метаморфного вируса на основе грамматико-автомат-ного подхода.

Основным методом детектирования метаморфных вирусов является поведенческий анализ, основная проблема которого - необходимость исполнения вирусного кода. В противовес данному подходу развиваются идеи статического исследования метаморфных программ [3-5]. Эти подходы построены на следующем факте: чтобы вирус смог создать новую мутацию, он должен уметь дизассемблировать себя. А если вирус может себя дизассемблировать, то сможет это сделать и антивирусное ПО. В [2, 7] показывается несостоятельность данного подхода при использовании методов обфускации. Но можно пойти еще дальше и лишить создателей систем статического анализа их главного тезиса о возможности дизассемблирования: рассмотренным выше полуметаморфным вирусам не требуется проводить дизассемблирование, чтобы создать новую полноценную мета-морфную копию.

Выводы и развитие результатов

Основное назначение рассмотренных техник мутаций кода - создание абсолютно недетекти-

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

Литература

1. Qozah. Polymorphism and grammars / Qozah // 29A E-zine. - 1999. -Ms 4.

2. Filiol, E. Metamorphism, Formal Grammars and Undecidable Code Mutation / E. Filiol // Proc. of PWASET. - 2007. - V. 20.

3. Bruschi, D. Using Code Normalization for Fighting Self-Mutating Malware / D. Bruschi, L. Mar-

tignoni, M. Monga // Security & Privacy, IEEE. -2007. -V. 5. -P. 46-54.

4. Lakhotia, A. Are metamorphic viruses really invincible? / A. Lakhotia, A. Kapoor // Virus Bulletin. -Dec. 2004. -P. 5-7.

5. Zhang, Q. MetaAware: Identifying Metamorphic Malware / Q. Zhang, D. Reeves // Proc. of the 23rd Annual Computer Security Applications Conference. — Dec, 2007.

6. Szor, P. Hunting for Metamorphic / P. Szor, P. Ferrie // Virus Bulletin. - Sept, 2001. — P. 123-144.

7. Filiol, E. Computer viruses: from theory to applications / E. Filiol. - France: Springer-Verlag, 2005. - 405 p.

8. Szor, P. The Art of Computer: Virus Research and Defense / P. Szor. - USA: Symantec Press, 2005. — 744p.

9. Гросс, М. Теория формальных грамматик / М. Гросс, А. Лантен. - М.: Мир, 1971. - 296 с.

10. Гладкий, А.В. Формальные грамматики и языки / А.В. Гладкий. — М.: Наука, 1973. - 368 с.

11. Пентус, А.Е. Теория формальных языков: учебное пособие /А.Е Пентус, М.Р. Пентус. - М.: изд-во ЦПИ при МГУ, 2004. — 80 с.

Поступила в редакцию 10 апреля 2009 г.