Метод защиты программных средств на основе запутывающих преобразований

Автор: Пользователь скрыл имя, 23 Марта 2012 в 03:04, дипломная работа

Краткое описание

Актуальность работы. Многие направления науки и техники, имеющие отношение к получению, обработке, хранению и передаче ин­формации, в значительной степени ориентируются на развитие современ­ных компьютерных систем (КС) [30]. Такие системы представляют разно­образную и весьма сложную совокупность вычислительных устройств, систем обработки информации, телекоммуникационных технологий, про­граммного обеспечения и высокоэффективных средств его проектирова­ния и в общем случае представляющие гетерогенную программно-аппаратную среду.

Оглавление

Введение 4
Глава 1. Анализ методов защиты программных средств 11
1.1 Методы защиты информации с помощью аппаратных средств 12
1.2 Программные средства защиты информации 16
1.3 Анализ программных средств как объекта защиты 21
1.4 Анализ структуры программных систем защиты информации 24
1.5 Выводы 26
Глава 2. Построение методов защиты программных средств с помощью,
запутывающих преобразований 28
2.1 Понятие запутывающих преобразований для реализации защиты
программных средств вне доверенной вычислительной среды 29
2.2 Классификация запутывающих преобразований 32
2.2.1 Преобразования форматирования 32
2.2.2 Преобразования структур данных 33
2.2.3 Преобразования потока управления .34
2.3 Классификация методов анализа программ .44
2.3.1 Методы статического анализа .45
2.3.2 Методы статистического и динамического анализа 47

2.4 Классификация способов запутывания к применяемым методам анализа и распутывания программ 48
2.5 Оценка эффективности применения запутывающих преобразований 50
2.6 Выводы .51
ГлаваЗ. Построение метода защиты программных средств с помощью
запутывающих преобразований ;.53
3.1 Построение графа потока управления 56

з
3.2 Преобразование графа потока управления 60
3.5 Теоретическое обоснование устойчивости метода 68
3.6 Практическое обоснование устойчивости мето да 71
3.7 Выводы 72
Глава 4. Решение практических задач защиты программных средств 74
4.1 Анализ характеристик методов защиты программных средств 74
4.2 Выбор объектов тестирования 74
4.3 Методика оценки эффективности защиты 75
4.3.1 Оценка эффективности программных средств 80
4.4 Оценка устойчивости метода к ручному анализу и дизассемблированию85
4.4.1 Подготовка эксперимента 85
4.4.2 Описание результатов эксперимента 86
4.4.3 Результаты дизассемблирования 90

4.5 Определение размера требуемых ресурсов вычислительной системы 91
4.6 Показатели применимости разработанного метода защиты программных средств 99
4.7 Выводы 101
Заключение 103
Список использованной литературы 106

Файлы: 1 файл

диссер.doc

— 2.60 Мб (Скачать)

На рис. 2.5 приведено сопоставление методов запутывания и методов возможного анализа.



50



Метод

синтаксического

анализа


Запутывающие преобразования форматирования



 



Метод

статического

анализа


Запутывающие

преобразования структур

данных



 



Метод

динамического

анализа


Запутывающие

преобразования графа

потока управления



 



Метод

статистического

анализа


Превентивные запутывающие преобразования



Рисунок 2.5 - Методы запутывания программ и методы для их анализа

2.5 Оценка эффективности применения запутывающих преоб­разований

Существенным недостатком методов оценки эффективности процесса запутывания, является то, что они относятся только к конкретному про­граммному коду.

Эти методы можно разделить на две группы:

-         аналитические;

-         эмпирические.

Аналитические методы характеризуются следующими показателями:

-              устойчивость - указывает на степень сложности осуществления
реверсивной инженерии над кодом прошедшим процесс запутыва­
ния;



51

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

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

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

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

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

2.6 Выводы

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



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

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

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

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

-         запутывание не должно быть регулярным. Регулярная структура запу­танной программы или её фрагмента позволяет отделить запутанные части и даже идентифицировать алгоритм запутывания;

-         применение стандартных синтаксических и статических методов ана­лиза программ не должно давать существенных результатов;

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



53

Глава 3. Построение метода защиты программных средств с помощью запутывающих преобразований

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

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

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



54 запутывающих преобразований решается в рамках языка программирования Си, т.к. задачи запутывания и анализа для языка программирования этого уровня оказываются вложенными в соответствующие задачи для языков бо­лее высокого уровня таких как Java и т.п.

Возможна постановка задачи запутывания на низком уровне, когда запу­тывается программа на языке ассемблера или даже объектная программа в машинном коде [93]. Методы низкоуровневого запутывания, применимые к одной архитектуре, могут оказаться неприменимы к другой архитектуре. Проблема низкоуровневого запутывания в настоящее время слабо исследова­на.

Если программа для анализа представлена в исполняемом или объект­ном коде, и известно, что к программе не применялись низкоуровневые ме­тоды запутывания, задача анализа таких программ может быть разбита на две относительно независимых подзадачи. На первом этапе программа декомпи­лируется [84] в программу на языке Си, затем программа на языке Си распу­тывается, то есть применяются алгоритмы анализа программ, которые при­водят к её возможной перестройке, выделению в ней циклов, условных опе­раторов и других конструкций высокого уровня.

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

Также задача построения метода защиты с помощью запутывающих преобразований рассматривается с точки зрения системного программирова­ния [35, 36], где объектами запутывания являются исходные тексты про­грамм. Защищенные программы таким методом должны укладываться в ог­раничения вычислительной системы, что не может не отразиться на исполь­зуемых методах запутывания. Кроме того, размер исходных программ (более



55 10 000 строк) означает, что применение ручного анализа программы при ее распутывании затруднено из-за временных и стоимостных ограничений. Для распутывания таких программ применяются инструментальные средства анализа программ и обратной инженерии, поддерживающие полный спектр существующих статических и динамических методов анализа.

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

1.     Построение графа потока управления и выделение базовых блоков про­граммы. На этом этапе выполняется построение исходного графа с ис­пользованием теории графов и проводится оптимизационный анализ.

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

3.     Введение массива для хранения переменных одного типа.

4.     Переприсваивание и перевычисление переменных. Присвоение различ­ным переменным одних и тех же значений, и использование этих пере­менных в различных участках программы.

5.     Создание блока «мертвого кода». Такое преобразование должно осу­ществляется таким образом, что бы в процессе работы программы к этому блоку были постоянные обращения. Данный блок может рабо­тать в качестве «маршрутизатора».

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



56

Схема реализации приведенного метода представлена на рис. 3.1,

Код исходной программы



Построение графа потока

управления исходной

программы


Выделение базовых блоков



Развертка циклов

Изменение структуры циклов



Преобразование графа потока управления


•—►


Разложение циклов



Добавление новых переходов



Введение массива переменных


Использование меток



 



Переприсваевание и перевычисление переменных

I

Создание блока «мертвого» кода


Переименование

и перемешивание

меток



Введение связности между блоками

I

Код запутанной программы

Рисунок 3.1 - Схема реализации метода

3.1 Построение графа потока управления

Первоначально при запутывании программы строится граф потока управления [76], выделяются основные блоки программы, и проводится оп­тимизационный анализ. На этом этапе основной задачей является выявление иерархического потока управления.



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

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

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

управления содержит две вершины: entry и exit, которые формально не со­держат ни каких инструкций, entry - вершина, в которую не входит ни одна дуга, exit - вершина, из которой не выходит ни одна дуга (рис. 3.2(a)).

Пусть G = (N,E) - граф потока управления. N - множество базовых

блоков ( включая entry и exit), Е - множество дуг: ЕczNxN. Дугу? идущую из вершины В; в вершину Вj, будем обозначать: В{ -> Bj.



58



B2


В,


entry В,

~т~

Вз

Вд


Вй


exit



а)              б)

Рисунок 3.2 - Пример построения графа: графа потока управления (а), дерева

доминирования (б) Если в графе потока управления G = {N,E) присутствует две или более

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

Вершина Д. доминирует вершину В., если любой путь из entry в В.

включает В. -отношение доминирования (B^ornBj).

Отношение доминирования обладает свойствами рефлексивности ( BidomBl), транзитивности, антисимметричности. Зная, какие вершины нахо­дятся непосредственного доминирования, можно построить дерево домини­рования для графа потока управления (рис. 3.2(6)).

Обратная дуга графа - дуга, голова которой доминирует свой хвост.

Косая дуга - дуга, ни один конец которой не доминирует другой.



59

Информация о работе Метод защиты программных средств на основе запутывающих преобразований