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

кандидата технических наук
Щелкунов, Дмитрий Анатольевич
город
Москва
год
2009
специальность ВАК РФ
05.13.19
Диссертация по информатике, вычислительной технике и управлению на тему «Разработка методик защиты программ от анализа и модификации на основе запутывания кода и данных»

Автореферат диссертации по теме "Разработка методик защиты программ от анализа и модификации на основе запутывания кода и данных"

На правах рукописи

Щелкунов Дмитрий Анатольевич

РАЗРАБОТКА МЕТОДИК ЗАЩИТЫ ПРОГРАММ ОТ АНАЛИЗА И МОДИФИКАЦИИ НА ОСНОВЕ ЗАПУТЫВАНИЯ КОДА И ДАННЫХ

Специальность 05.13.19 - Методы и системы защиты информации, информационная безопасность

Автореферат диссертации на соискание ученой степени кандидата технических наук

Москва-2008

Q03459T<

003459775

Работа выполнена в Московском Государственном Техническом Университете им. Н.Э. Баумана.

Научный руководитель: Официальные оппоненты:

Ведущая организация:

кандидат технических наук, доцент Мазин Анатолий Викторович

доктор технических наук, старший научный сотрудник Тарасов Александр Алексеевич кандидат технических наук, доцент Половников Алексей Юрьевич Всероссийский

Научно-Исследовательский Институт Проблем Вычислительной Техники и Информатизации

Защита диссертации состоится 2009 г. на заседании Диссер-

тационного совета ДС 212.008.10 при Московском Государственном Техническом Университете им. Н.Э. Баумана по адресу 107005, г. Москва, 2-я Бауманская ул., д.5.

С диссертацией можно ознакомиться в библиотеке МГТУ им. Н.Э. Баумана.

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

Автореферат разослан « » 2009 г.

Ученый секретарь Диссертационного совета к.т.н., доцент

А.В. Астрахов

Общая характеристика работы

Актуальность проблемы

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

Основы методологии создания подобного рода механизмов заложены такими учёными, как Варновский Н.П., Захаров В.А., Гайсарян С.С, Чернов А.В, Коллберг К.

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

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

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

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

Цель и основные задачи работы

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

Объектом исследования является автоматическая защита программного обеспечения от анализа и несанкционированной модификации.

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

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

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

В рамках решения указанной задачи в диссертации:

1. Обоснована необходимость добавления в запутываемую программу дополнительных входных и выходных данных, называемых далее «фальшивым» глобальным контекстом.

2. Сформулирована и доказана теорема о Л^Р-полноте задачи деобфускации.

3. Обосновано применение разработанных правил построения запутывающих преобразований.

4. Разработана методика статического и полустатического анализа машинного кода программы с целью его последующего перевода в промежуточное представление.

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

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

Методы исследования

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

Положения, выносимые на защиту

1. Формулировка и доказательство теоремы о ЯР-полноте задачи деобфускации в случае добавления к запутываемой программе дополнительных входных и выходных данных.

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

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

Научная новизна

диссертации заключается в следующем:

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

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

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

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

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

Практическая значимость

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

Реализация результатов диссертационной работы

Основные результаты диссертационной работы внедрены в российских компаниях ЗАО «Актив», ЗАО «Калуга-Астрал» и ФГУП КНИИТМУ, а также в учебный процесс КФ МГТУ им. Н.Э. Баумана в курсах «Организация информационной безопасности» и «Защита информации в компьютерных сетях».

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

Достоверность и обоснованность

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

Апробация работы

Содержание отдельных разделов и диссертации в целом было доложено на:

1) научных семинарах и методических советах кафедры «Компьютерные системы и сети» МГТУ им. Н.Э. Баумана, 2005-2007;

2) III Российской НТК «Новые информационные технологии в системах связи и управления» ЦНТИ, Калуга, 2004;

3) Всероссийской НТК «Прогрессивные технологии, конструкции и системы в приборо- и машиностроении» Москва, МГТУ, 2005;

4) Всероссийской конференции студентов, аспирантов, молодых ученых. Центральный регион. Москва, 2-3 марта, 2006г. МГТУ им. Н.Э. Баумана;

5) VII Международном симпозиуме «Интеллектуальные системы (INTELS 2006)». Краснодар, 2006.;

6) научном семинаре в рамках ассоциации «РусКрипто», 21 ноября,

2006.;

7) Международной конференции «РусКрипто-2007», 1-4 февраля,

2007.;

8) Международной конференции «РусКрипто-2008», 3-6 апреля, 2008. Публикации

Содержание диссертационной работы полностью отражено в 9-и работах, из них по списку ВАК - 1.

Структура и объем работы

Диссертация состоит из введения, четырех глав, общих выводов, библиографического списка из 72 наименований. Работа содержит 124 страницы машинописного текста содержательной части, 37 рисунков, 1 таблицу, 6 страниц библиографии и 10 страниц приложений.

Содержание диссертационной работы

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

бой файлы определенного формата (в основном РЕ и СОРИ форматы). Код представляет собой машинный код целевой аппаратной платформы.

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

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

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

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

1. Свойство функциональности. Запутанный алгоритм должен выполнять ту же функцию, что и исходный.

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

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

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

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

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

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

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

УМ е Я 30е О*, О* с Я :УА(0(М))е П,А(0(М))<ХР (1),

где Я - множество всех программ, процесс работы которых имеет конечный результат;

М- программа из множества Я;

О - алгоритм обфускации;

О* - семейство алгоритмов обфускации;

Р - множество алгоритмов полиномиальной сложности;

А - алгоритм деобфускации, принимающий на вход запутанный алгоритм

О(М).

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

В связи с этим под функциональным свойством подпрограммы понимается описатель логики, которую выполняет данная подпрограмма. Для функциональных свойств справедливо следующее:

Чр„р2* П(/й - /й => (р, е л » р2 6 л)), (2)

где л - функциональное свойство подпрограммы;

П- множество всех подпрограмм;

рир2 - подпрограммы, принадлежащие множеству Я;

/ ,/Р2 - функции, вычисляемые соответственно подпрограммами р,, р2 ■

Введем левостороннюю операцию «*», означающую конкатенацию функциональных свойств. Запись лх * лг означает, что подпрограмма с

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

*ю=*1*Хг* (3)

После применения запутывающих преобразований получим следующее:

= Я0*у0*Я]*У,*Я2*У2*... *я„*у„ (4)

^оУ\У-1>—Уп - добавленные функциональные свойства.

я0=е ,

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

Заметим, что если у0,у,,у2,...,у„ из предыдущей формулы равняются е, то это равенство будет сводиться к системе равенств следующего вида:

'Хо II -е

я. = я, *е

= я2 * е

Предположим теперь, что

Л=Я0*У0*Л1*У]*Я2*У2*...*Я„*У„фяшх (6)

В этом случае несводимость неравенства (6) к системе (5) достаточно несложно обеспечить. Докажем следующее утверждение.

Задача определения существенности функционального свойства я, (I/-) в равенстве (6) ЛР-полна.

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

IМХгЪ) , (7)

I

где X - выходные данные, полученные до исключения функционального свойства, У - выходные данные, полученные после исключения функционального свойства. Если результат формулы (7) не будет нулевым, то исключенное функциональное свойство будет существенным. Очевидно, что задача определения существенности функционального свойства сводится к задаче выполнимости булевской формулы, а, следовательно, лежит в классе ИР.

Чтобы проверить выполнимость булевской формулы необходимо проверить её значение некоторое количество раз. Т.е., по сути дела, необходимо проверить значения существенных составляющих булевской формулы. Та-

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

Из вышесказанного следует, что задача определения существенности функциональных свойств в равенстве (6) /УР-полна.

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

1. Маскировка графа потока управления подпрограммы (в частности, адрес, на который передается управление из инструкции ветвления, рассчитывается динамически, исходя из хеш-суммы подпрограммы).

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

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

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

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

где У*Е41, - множества всех ячеек памяти, из которых производят чтение соответственно исходные и добавленные в результате применения запутывающих преобразований инструкции;

У%ЕА1УрАКЕ - множества всех ячеек памяти, в которые производят запись соответственно исходные и добавленные в результате применения запутывающих преобразований инструкции; 0 - пустое множество.

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

7. «Мертвый» код (код, на который не предусмотрена передача управления в процессе нормального функционирования программы) не должен сильно отличаться от реально выполняемого кода. Все правила, приведенные выше, должны относится, в том числе, и к нему.

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

1. Анализ входных данных.

2. Добавление «фальшивого» локального контекста.

3. Генерация «мусорного» кода (кода, добавленного в процессе обфускации).

4. Разбавление инструкций ветвления.

5. Маскировка графа потока управления (динамическое вычисление адресов ветвлений).

6. Разбиение полученных базовых блоков на набор функций.

7. Генерация машинных инструкций с использованием генератора полиморфного кода.

Рассмотрим более подробно каждый из пунктов.

1. Методика анализа входных данных подразумевает под собой разбиение на базовые блоки, анализ псевдонимов, перевод в промежуточное представление, распознавание неделимых блоков памяти (структур, массивов и т.д.), выделение операция память-память (частичная оптимизация). Алгоритмы разработаны для архитектур х86 и AMD64, но могут быть легко модифицированы для использования на других аппаратных платформах.

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

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

UNKNOWN- тип, о котором невозможно получить информацию;

LOCPTR - указатель на локальную память функции;

GLOB PTR - указатель на память, глобальную по отношению к функции;

ARG PTR - указатель на аргумент;

UNKNOWN PTR - указатель на неизвестную область памяти;

CONST - константное значение.

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

В процессе анализа каждая переменная представляется следующей тройкой значений. (Memld, Offset, Size), где Memld - идентификационный номер области памяти, Offset - смещение начала абстрактной ячейки относительно точки отсчета, a Size - размер ячейки. Смещение в данном случае удобно считать от адреса возврата, который имеет нулевое смещение. Для удобства анализа доступа к памяти введем понятие множества значений для каждой переменной (vs). Множества значений удобно записывать в виде сжатых интервальных конгруэнций (RIC) каждая из которых представляет собой кортеж из 4-х значении (а, Ь, с, d) и трактуется следующим образом: ах[Ь,с] + d, что описывает множество целых значений {aZ + d\Z<= [b,c]} ■ Ниже приведен ряд операций, которые можно применять по отношению к множествам значений:

—(v.s', с vi2): возвращает TRUE, если множество значений v.y, является подмножеством vs2.

—(vsi о vs2) '• возвращает пересечение множеств значений w, и vs2. -fvs, и vs2): возвращает объединение множеств значений us, и vs2. -(v.V|Vv.s2возвращает множество значений, полученное посредством расширения множества значений v.v, по отношению к vs2 . Т.е., если v.v, =(10,4[0,1]), a vij=(10,4[0,2]),To (vsxVvs2)= (10,4[0,<х>]).

-(vs®c): возвращает множество значений, полученное в результате «подстройки» значений v.? с константой с. Т.е., если v.s =(4,4[0,2]+4), а с=12, то fvj©c;=(16,4[0,2]+16). Аналогичным образом может быть задан целый ряд арифметических операций.

-*(vs,s): возвращает пару множеств (F, Р). F представляет собой множество «полностью доступных» абстрактных ячеек памяти (т.е. ячеек памяти размером s и их стартовый адрес находится в vs). Р представляет собой множество «частично доступных» ячеек памяти. Т.е. ячеек памяти у которых стартовый адрес лежи в vs, а размер не равен s, а также ячеек, которые лежат в us; но их стартовый адрес и размер не удовлетворяют требованиям к множеству F.

-RemoveLowerBounds{vs): возвращает множество значений, полученное посредством установки нижней границы каждого компонента RIC равного -со. Например, если vs=([0, 100],[0, 200]), то RemoveLo\verBounds(vs)= ([-со, 100],[ -оо, 200]).

-Кетох'еиррегВоип^(у^): аналогично Кетох'еЬоч'егВош^, но устанавливает верхнюю границу каждого компонента равной со.

Если происходит вызов внешней функции, которая в свою очередь тоже анализируется, то возможны две ситуации:

а) внешняя функция уже проанализирована с учетом того, что её параметры неизвестны;

б) внешняя функция еще не проанализирована.

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

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

Далее проводится дополнительный анализ входных данных, который включает в себя следующие пункты:

а) выделение множества «мертвых» локальных переменных Б. Т.е. множество переменных, которые после прохождения определенной точки подпрограммы больше не используются;

б) выделение множества переменных, имеющих простые типы (множество С);

в) выделение множества переменных, имеющих сложные типы (СО);

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

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

е) Выделение множества абстрактных ячеек памяти с заведомо известными значениями (множество V).

2. Добавление «фальшивого» локального контекста. На данном этапе добавляется «фальшивый» локальный контекст, который будет впоследствии

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

В подпрограмму может быть передан один или несколько указателей на «фальшивые» буферы памяти. Для алгоритма запутывания «фальшивые» буферы памяти состоят из абстрактных ячеек памяти, с которыми впоследствии ведется работа. Эти «фальшивые» буферы памяти называются «фальшивым» глобальным контекстом.

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

4 Разбавление инструкций перехода. Под разбавлением инструкций перехода подразумеваются различные схемы, позволяющие заменить одну инструкцию перехода несколькими.

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

а>С = аорк>Сорк (9)

Операция ор означает любую операцию, удовлетворяющую тождеству

(9).

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

6. Разбиение базовых блоков на функции производится как на этапе промежуточного представления инструкций, так и на этапе платформозави-симой обфускации (обфускации на уровне машинного кода целевой платформы). Каждой инструкции в базовом блоке ставится в соответствие уровень вложенности. По мере приближения к «центру» базового блока уровень вложенности увеличивается. Таким образом, получается, что первая и по-

следняя инструкции базового блока имеют уровень вложенности равным 0. Максимальный уровень вложенности является задаваемым параметром.

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

Шг ->р :р, Шг е Р<к>, Р<к> сП„ (10)

Формула (10) дает формальное определение действий, выполняемых генератором полиморфного кода, /да/г - машинная инструкция, р - подпрограмма, обладающая тем же функциональным свойством, что и инструкция /шгг. Выбор подпрограммы осуществляется из конечного множества Р мощностью к. Множество Р является подмножеством всех подпрограмм с функциональным свойством к. Основной задачей генератора полиморфного кода следует считать задачу сокрытия сигнатур. Если найдется алгоритм, который сможет установить взаимнооднозначное соответствие между инструкцией Шг и подпрограммой р, то впоследствии можно осуществить деобфускацию при помощи алгоритмов сигнатурного поиска. Для того чтобы воспрепятствовать сигнатурному поиску, необходимо дополнить условие (10) следующим образом:

1тЩ р1 .р^тщ е Р-Л>, Р*к> с Л,(

Шгы рм :рм<Шгм € Рм<к>, Рм<к> с 77^

............................................................................(И)

{1тЩ,Шгм.....Шгпт :кр с Л",- * 71 м *... * л-,+га

р^(р1,рм,...,р1+т)

Исходные инструкции следуют друг за другом. На этапе генерации полиморфного кода они отображаются соответственно в подпрограммы рп рм, р!+т. Далее эти подпрограммы объединяются в одну подпрограмму, но так, чтобы полученная подпрограмма р не представляла собой конкатенацию элементов рп рм, р!+т - \У(р^рм.....Р,+,„)■ Эта технология была названа технологией пересечения полиморфных инструкций. Она заключается в том, что часть инструкций подпрограммы р1 переносится в тело подпрограммы рм и наоборот.

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

В генераторе полиморфного кода используются системы полных функций И-НЕ и ИЛИ-НЕ. Также используются следующие тождества:

xtv x2=xl+x2-xl лх2 (12)

xl v x2 = x, + x2 - 2 • (x^ л x2)

Генератор полиморфного кода сконструирован таким образом, что инструкции, которые он создает, могут либо менять флаги произвольным образом - либо строго соответствовать спецификации.

Разработанные алгоритмы и методы позволяют не только производить запутывание, но и эффективно внедрять код в тело приложения.

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

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

Подробно рассмотрены UML-диаграммы, описывающие статическую структуру разработанного программного обеспечения.

Рассчитаны максимальные коэффициенты замедления скорости работы запутанного кода по сравнению с исходным и увеличения объема кода по сравнению с исходным.

Kspeeä = maxi(Cspeed ■4-m-FPT■ IterNum,) (13)

Kvalue=Cvalue-4-m-k-FPT (14)

Коэффициенты Cspeed и Cvalue - коэффициенты, зависящие от платформы, на которой будет выполняться полученный код и от генератора машинного кода из промежуточного. IterNum в формуле (13) - это число вхождений в i-й базовый блок или число итераций в цикле. FPT - число «мусорных» инструкций на одну истинную, т - число констант, сгенерированных для сравнения. В результате проведения 200 замеров на различных подпрограммах было отмечено, что скорость работы запутанного кода уменьшается по сравнению с исходной не более чем на 2 порядка. В свою очередь размер запутанного кода увеличивается по сравнению с исходным не более чем на 2 порядка.

В результате оценки качества запутывающих преобразований, осуществляемых разработанными методиками, по методу, описанному в работе Гайсаряна, Чернова, Белеванцева и др., был сделан вывод, что качество запу-

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

Существующие методики оценки качества запутывающих преобразований не предполагают оценки потенциала исходных данных к запутыванию. Выделим ряд характеристик запутываемого кода - доля времени нахождения в запутываемом участке кода по отношению к времени работы всей программы (ус), доля инструкций перехода во внешнюю среду по отношению к общему количеству инструкций (1с) и процент редких инструкций по отношению к общему количеству инструкций (гс). Если ус некоторой функции превышает 20%, то данную функцию защищать не рекомендуется. Если /с превышает 30%, то данную функцию тоже не рекомендуется защищать так же, как если гс превышает 50%. Если функция удовлетворяет вышеописанным требованием, то качество запутывающих преобразований соответствует высокому уровню по Коллбергу.

В заключении изложены основные теоретические и практические результаты диссертационной работы.

Основные результаты работы

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

2. На основе теории компиляторов выведены правила построения запутывающих преобразований. Эти правила позволяют воспрепятствовать созданию алгоритмов автоматической деобфускации защищенной программы.

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

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

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

6. Разработанные в диссертационной работе методики позволили повысить качество обфускации по сравнению с качеством, обеспечиваемым технологией виртуализации кода, на 30%. Оценка качества производилась по методике, описанной в работе Гайсаряна, Чернова, Белеванцева и др. Скорость работы запутанного в соответствии с разработанными методиками кода

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

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

Публикации по теме работы

1. Щелкунов Д.А. Методика защиты от несанкционированного доступа и контроля действий оператора в системах оповещения на базе ОС Windows NT\2000\XP/ //III Российская НТК «Новые информационные технологии в системах связи и управления». - Калуга: ЦНТИ, 2004. - С. 171 - 173.

2. Мазин A.A., Щелкунов Д.А. Анализ и применение запутывающих преобразований при защите исполняемых файлов от несанкционированного использования //Всероссийская НТК «Прогрессивные технологии, конструкции и системы в приборо- и машиностроении» Материалы. - М: МГТУ, 2005. -Т. 1,-С. 330-333.

3. Щелкунов Д.А. Методы автоматической защиты Windows-приложений от исследования и несанкционированной модификации // Технологии Microsoft в теории и практике программирования. Труды Всероссийской конференции студентов, аспирантов и молодых ученых. - М.: МГТУ им. Н.Э. Баумана, 2006 - С. 96-97.

4. Щелкунов Д.А. Автоматическая защита программ от исследования и отладки // Интеллектуальные системы (INTELS 2006): Сб. Трудов VII Международ. симпоз. - Краснодар, 2006. - С. 401 - 405.

5. Семинар в рамках Ассоциации РусКрипто на тему «Защита информации: аспекты теории и вопросы практических приложений» http://www.ruscrypto.ru/netcat_files/File/seminar.015.zip

6. Щелкунов Д.А. Обфускация. Теоретические и практические аспекты., //Труды международной конференции РусКрипто, 1-4 февраля 2007 г. -http://www.rusciypto.ru/sources/conference/rc2007/

7. Щелкунов Д.А. Запутывание программ и внедрение в приложение стороннего кода // Технологии Microsoft в теории и практике программирования. Труды IV Всероссийской конференции студентов, аспирантов и молодых ученых. Центральный регион. - М.: Вузовская книга, 2007. - С.191 - 192.

8. Щелкунов Д.А. Применение запутывающих преобразований и полиморфных технологий для автоматической защиты исполняемых файлов от исследования и модификации. //Труды международной конференции РусКрипто, 3-6 апреля 2008 г.

http://www.ruscrypto.ru/sources/conference/rc2008/

9. Щелкунов Д.А. Технология запутывания кода в сочетании с автоматической защитой приложений от исследования и модификации //Безопасность информационных технологий. - М.: МИФИ, 2008. - №3. - С. 73 -77.

Подписано к печати 14.01.09. Заказ № 18 Объем 1,0 печ.л. Тираж 100 экз. Типография МГТУ им. Н.Э. Баумана 105005, Москва, 2-я Бауманская ул., д.5 263-62-01

Оглавление автор диссертации — кандидата технических наук Щелкунов, Дмитрий Анатольевич

ВВЕДЕНИЕ.

ГЛАВА 1. ПРОБЛЕМА ЗАЩИТЫ ПРОГРАММ ОТ КОМПЬЮТЕРНОГО ПИРАТСТВА И ПОСТАНОВКА ЗАДАЧИ ИССЛЕДОВАНИЯ.

1.1. Защита программ от анализа и модификации как фактор противодействия компьютерному пиратству.

1.2. Современные методы защиты программ.

1.2.1. Методы, основанные на особенностях среды функционирования программы.

1.2.2. Автоматическая упаковка исполняемого модуля.

1.2.3. Методы защиты программ, основанные на запутывании кода и данных

1.3. Анализ существующих подходов к обфускации.

1.3.1. Обфускация на основе виртуализации кода.

1.3.2. Задачи обфускации в криптографии.

1.3.3. Обфускация по Бараку.

1.3.4. Обфускация на уровне промежуточного представления программы.

1.3.5. Обфускация методом Вонга.

1.4. Постановка задачи исследования и общая схема ее решения.

1.4.1. Особенности защиты программного обеспечения на основе существующих методов обфускации.

1.4.2. Постановка задачи разработки методик защиты программ от анализа и модификации на основе запутывания кода и данных.

1.4.3. Общая схема решения задачи исследования.

1.5. Выводы по главе 1.

ГЛАВА 2. ПРАВИЛА ПОСТРОЕНИЯ ЗАПУТЫВАЮЩИХ

ПРЕОБРАЗОВАНИЙ.

2.1. Функциональные свойства подпрограмм и отношения между ними.

ТУР-полнота задачи деобфускации.

2.3. Правила построения запутывающих преобразований.

2.4. Выводы по главе 2.

ГЛАВА 3. РАЗРАБОТАННЫЕ МЕТОДИКИ ОБФУСКАЦИИ.

3.1. Общая структура процесса обфускации.

3.2. Обфускация на уровне промежуточного представления.

3.2. Обфускация на уровне машинного кода.

3.3. Контроль целостности запутанного кода.

3.4. Метод запутывания графа потока управления при помощи сетей Петри.

3.5. Внедрение кода защиты в приложение.

3.6. Методика перевода машинного кода в промежуточное представление.

3.10 Выводы по главе 3.

ГЛАВА 4. ПРАКТИЧЕСКАЯ РЕАЛИЗАЦИЯ МЕТОДИК ОБФУСКАЦИИ И ИХ ОЦЕНКА.

4.1. Концепция построения обфускатора. Платформозависимый компонент.

4.2. Платформонезависимый компонент.

4.3. Оценки увеличения объема кода и замедления.

4.4. Оценка качества запутывающих преобразований.

4.5. Выводы по главе 4.

Введение 2009 год, диссертация по информатике, вычислительной технике и управлению, Щелкунов, Дмитрий Анатольевич

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

Основы методологии создания подобного рода механизмов заложены такими учёными, как Варновский Н.П, Захаров В.А., Гайсарян С.С, Чернов А.В, Коллберг К.

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

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

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

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

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

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

В рамках решения указанной задачи в диссертации:

1. Обоснована необходимость добавления в запутываемую программу дополнительных входных и выходных данных, называемых далее «фальшивым» глобальным контекстом.

2. Сформулирована и доказана теорема о тУР-полноте задачи деобфускации.

3. Обосновано применение разработанных правил построения запутывающих преобразований.

4. Разработана методика статического и полу статического анализа машинного кода программы с целью его последующего перевода в промежуточное представление.

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

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

Научная новизна диссертации заключается в следующем:

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

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

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

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

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

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

На защиту выносятся следующие научные положения:

1. Формулировка и доказательство теоремы о ЫР-полноте задачи деобфускации в случае добавления к запутываемой программе дополнительных входных и выходных данных.

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

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

В первой главе анализируется текущее состояние проблемы автоматической защиты программного обеспечения от компьютерного пиратства и ставится задача исследования.

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

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

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

В заключении изложены основные теоретические и практические результаты диссертационной работы.

Заключение диссертация на тему "Разработка методик защиты программ от анализа и модификации на основе запутывания кода и данных"

Основные результаты работы можно представить в следующих пунктах.

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

2. На основе теории компиляторов выведены правила построения запутывающих преобразований. Эти правила позволяют воспрепятствовать созданию алгоритмов автоматической деобфускации защищенной программы.

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

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

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

6. Разработанные в диссертационной работе методики позволили повысить качество обфускации по сравнению с качеством, обеспечиваемым технологией виртуализации кода, на 30%. Оценка качества производилась по методике, описанной в работе Гайсаряна, Чернова, Белеванцева и др. Скорость работы запутанного в соответствии с разработанными методиками кода на порядок превышает скорость работы кода, запутанного при помощи технологии виртуализации.

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

ЗАКЛЮЧЕНИЕ

Библиография Щелкунов, Дмитрий Анатольевич, диссертация по теме Методы и системы защиты информации, информационная безопасность

1. Скляров Д.В. Искусство защиты и взлома информации. СПб.: БХВ-Петербург, 2004. - 288 е.: ил.

2. Брюс Шнайер Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си. М.: Триумф, 2002. - 816 е.: ил.

3. Щелкунов Д.А. Автоматическая защита программ от исследования и отладки // Интеллектуальные системы (INTELS 2006): Сб. Трудов VII Международ, сим-поз. Краснодар, 2006. - 221 с.

4. Рихтер Дж. Windows для профессионалов: создание эффективных Win32 приложений с учетом специфики 64-разрядной версии Windows/Пер, англ 4-е изд. -СПб; Питер; М.: Издательско-торговый дом «Русская Редакция», 2001. - 752 е.;ил.

5. Microsoft portable executable and Coramon Object File Format Spécification. http://download.microsoft.eom/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/pecoffv8.doc

6. Руссинович M., Соломон Д. Внутреннее устройство Microsoft Windows: Windows Server 2003, Windows XP и Windows 2000. Мастер-класс. / Пер. с англ. (4-е изд.). СПб.: Питер, 2005. - 992 стр.: ил.

7. Шрайбер С. Недокументированные возможности Windows 2000. Библиотека программиста. СПб.: Питер, 2002. - 544 е.: ил.

8. Чернов А. В. Об одном методе маскировки программ http://www.citforum.ru/security/articles/mask/

9. Щелкунов Д.А. Обфускация. Теоретические и практические аспекты, //Труды международной конференции РусКрипто, 1-4 февраля 2007http://www.ruscrypto.ru/sources/conference/rc2007/

10. Airapetyan R., Schneider Т. Protecting Applications with Petri Nets. //The Code-Breakers-Journal. Vol. 1. No. 1http://www.codebreakersjournal.com/cbj/2004/CBJll2004SchneiderProtectionwithPetriNets.zip

11. K. S. Ivanov, V.A. Zakharov Program obfuscation as obstruction of program static analysis //Труды Института системного программирования: Том 6. /Под ред. В.П.Иванникова/ -М.: ИСП РАН, 2004. 198 с.

12. Казарин О.В. Теория и практика защиты программ. М.: МГУЛ, 2004. - 450 с.

13. Cullen Linn, Saumya Debray. Obfuscation of Executable Code to Improve Resistance to Static Disassembly.http://www.cs.arizona.edu/solar/papers/CCS2003.pdf

14. Gregory Wroblewski. General method of program code obfuscation. PHD thesis. http://citeseer.ist.psu.edu/wroblewski02general.html

15. N.P. Varnovsky. A note on the concept of obfuscation. //Труды Института системного программирования: Том 6. /Под ред. В.П.Иванникова/ -М.: ИСП РАН,2004. 198 с.

16. Эриксон Д. Хакинг: Искусство эксплоита/ Пер. с англ. СПб: Символ-Плюс,2005.-240с., ил.

17. Ховард М., Лебланк Д. Защищенный код/ Пер. с англ. (2-е изд., испр.). М.: Издательско-торговый дом «Русская редакция», 2004. - 704 стр.: ил.

18. Хогланд Г., Мак-Гроу Г. Взлом программного обеспечения: анализ и использование кода/ Пер. с англ. — М.: Издательский дом "Вильяме", 2005. — 400 е.: ил.

19. Wang С. Hill, J. Knights, J. Davidson, Software Tamper Resistance: Obstructing Static Analysis of Programs http://citeseer.ist.psu.edu/wangOOsoftware.html

20. Breaking Abstractions and Unstructuring Data Structures (1998). Christian Coll-berg, Clark Thomborson, Douglas Low International Conference on Computer Languages.http://citeseer.ist.psu.edu/collberg98breaking.html

21. Bill Home, Lesley Matheson, Casey Sheehan, Robert E. Dynamic Self-Checking Techniques for Improved Tamper Resistance http://citeseer.ist.psu.edu/horne01dynamic.html

22. Douglas Low. Java Control Flow Obfuscation (1998) http://citeseer.ist.psu.edu/low98java.html

23. A. Main, P.C. van Oorschot. Software Protection and Application Security: Understanding the Battleground.http://citeseer.ist.psu.edu/736121 .html

24. Ryan Wishart, Karen Henricksen, Jadwiga Indulska. Context Obfuscation for Privacy via Ontological Descriptions (2005) http://citeseer.ist.psu.edu/wishart05context.html

25. Фомичев B.M. Дискретная математика и криптология. Курс лекций / Под общ. ред. д-ра физ.-мат. н. Н.Д. Подуфалова. М.: ДИАЛОГ-МИФИ, 2003 - 400 с.

26. Логачев О.А., Сальников А.А., Ященко В.В. Булевы функции в теории кодирования и криптологии М.: МЦНМО, 2004. - 470 с.

27. Н.П. Варновский, А.В. Шакуров Гомоморфное шифрование Труды Института Системного программирования: Том 12, /под ред. В.П. Иванникова. — М.: ИСПРАН, 2006.-122 с.

28. Barak В. Non-Black-Box Techniques in Cryptography., Thesis for the Ph.D. Degree, Department of Computer Science and Applied Mathematics. The Weizmann Institute of Science. January 6, 2004http://www.cs.princeton.edu/~boaz/Papers/introductionsa.ps

29. Гайсарян С.С., Чернов A.B., Белеванцев A.A., Маликов О.Р., Мельник Д.М., Меньшикова A.B. О некоторых задачах анализа и трансформации программ. http://www.citforum.ru/programming/digest/gaisarian/

30. Collberg С., Thomborson С., Low D. A Taxonomy of obfuscating transformation. http://www.cs.arizona.edu/~collberg/Research/Publications/CollbergThomborsonLow 97a/index.html

31. Exception Handling forx64 64-Bit http://msdn2.microsoft.com/en-us/library/ms794259.aspx

32. Matt Pierek, A Crash Course on the Depths of Win32 Structured Exception Handlinghttp://www.microsoft.eom/msj/0197/Exception/Exception.aspx

33. Matt Pietrek, Everything You Need To Know To Start Programming 64-Bit Windows Systemshttp://msdn2.microsoft.com/en-us/magazine/cc300794.aspx

34. Unwind Data for Exception Handling, Debugger Support http ://msdn2 .microsoft. com/ en-us/library/0kd71 у 96 (VS. 80) .aspx

35. Dennis Hofheinz, John Malone-Lee, Martijn Stam Obfuscation for Cryptographic Purposes.http://www.springerlink.com/index/d46ul37715n0q4xv.pdf

36. S. Chow, P. Eisen, H. Johnson, P.C. van Oorschot. White-Box Cryptography and an AES Implementation (2002) http://citeseer.ist.psu.edu/736207.html

37. Hoeteck Wee. On Obfuscating Point Functions (2005). http://citeseer.ist.psu.edu/wee05obfiiscating.html

38. Amit Sethi. Digital Rights Managment and Code Obfuscation (2003).http://citeseer.ist.psu.edu/sethi03digital.html

39. Andrew W. Appel. Deobfuscation is in NP. http://citeseer.ist.psu.edu/553532.html

40. Boaz Barak, Oded Goldreich, Russell Impagliazzo, Steven Rudich. On the (Im)possibility of Obfuscating Programs (Extended Abstract) (01). http://citeseer.ist.psu.edu/barak01impossibility.html

41. B.H. Крупский. Введение в сложность вычислений. М: Вакториал Пресс, 2006. -128 с.

42. Ахо А., Сети Р., Ульман Д. Компиляторы: принципы, технологии, инструменты. /Пер. с англ. М. : Издательский дом «Вильяме», 2003. - 768 е.: ил.

43. Sanjiv К. Gupta Naveen Sharma Alias Analysis for Intermediate Code HCL Technologies, Noida, India. http://mirror-fpt-telecom.fpt.net/gccsummit/2003/Alias%20analysis%20for%20intermediate%20code.pdf

44. Abel N.E., Bell J.R. Global optimization in compilers //First USA-Japan Computer Conf. — Montvale.: AFIPS Press, 1972. 331 p.

45. Chow F.A. Portable Machine-Independent Global Optimizer, Ph. D. Thesis http://portal.acm.org/citation.cfm?id=911259

46. Michael Hind, Anthony Pioli. Which Pointer Analysis Should I Use? http://www.cs.uiuc.edu/class/cs426/Papers/hind.issta00.pdf

47. Андрей Боровский. Алгоритмы поиска в тексте. //RSDN Magazine 2002г http://www.rsdn.ru/article/alg/textsearch.xml

48. Котов В.Е. Сети Петри М.: Наука. Главная редакция физико-математической литературы, 1984. — 160с.;

49. Gogul Balakrishnan, Thomas Reps. Analyzing Memory Accesses in x86 Binary Executables.http://citeseer.ist.psu.edu/762285.html

50. Prolog Code forx64 64-Bit.http://msdn2.microsoft.com/en-us/library/ms794659.aspx

51. Epilog Code forx64 64-Bit.http://msdn2.microsofl.com/en-us/library/ms794540.aspx

52. AMD64 Architecture Programmer's Manual Volume 1: Application programming, http ://www. amd.com/ usen/assets/contenttype/whitepapersandtechdocs/24592.pdf

53. AMD64 Architecture Programmer's Manual Volume 2: System programming. http://www.amd.com/usen/assets/contenttype/whitepapersandtechdocs/24593.pdf

54. AMD64 Architecture Programmer's Manual Volume 3: General-purpose and system instructions.http://www.amd.com/usen/assets/contenttype/whitepapersandtechdocs/24594.pdf

55. AMD64 Architecture Programmer's Manual Volume 4: 128-bit media instructions http://www.amd.com/usen/assets/contenttype/whitepapersandtechdocs/26568.pdf

56. AMD64 Architecture Programmer's Manual Volume 5: 64-bit media and x87 floating point instructions.http://www.amd.com/usen/assets/contenttype/whitepapersandtechdocs/26569.pdf

57. IA-32 Intel® Architecture Software Developer's Manual Volume 1: Basic Architecture.http://download.intel.com/design/processor/manuals/253665.pdf

58. IA-32 Intel® Architecture Software Developer's Manual Volume 2A: Instruction Set Reference, A-M.http://download.intel.com/design/processor/manuals/253666.pdf

59. IA-32 Intel® Architecture Software Developer's Manual Volume 2B: Instruction Set Reference, N-Z.http://download.intel.com/design/processor/manuals/253667.pdf

60. IA-32 Intel® Architecture Software Developer's Manual Volume 3: System Programming Guide.http://download.intel.com/design/processor/manuals/253668.pdf

61. Intel® Extended Memory 64 Technology Software Developer's Guide.http://download.intel.com/design/processor/manuals/253668.pdf

62. Пирогов В.Ю. Асемблер для Windows. (2-е изд., перераб. и доп). СПб.: БХВ-Петербург, 2003. - 656 е.: ил.

63. Юров В.И. Assembler. Учебник для вузов. 2-е изд. СПб.: Питер, 2004. - 637 е.: ил.

64. Christian Collberg, Clark Thomborson Software Watermarking: Models and Dynamic Embeddings (1999)http://citeseer.ist.psu.edu/collberg99software.html

65. Руководство разработчика Guardant www.guardant.ru134nPHJIO)KEHHiIdeclspec( naked) void TestFunc()