Автор: Пользователь скрыл имя, 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
Рисунок 2.4 - Вид графа приведенного к плоскому виду В работе [84] предлагается метод запутывания, основанный на следующих запутывающих преобразованиях: каждый базовый блок запутываемой функции разбивается на более мелкие части и клонируется один или несколько раз, В каждом фрагменте базового блока переменные локализуются, и для связывания базовых блоков создаются специальные связующие базовые блоки. Далее в каждый фрагмент вводится мёртвый код. Источником мёртвого кода может быть, например, фрагмент другого базового блока той же самой функции или фрагмент базового блока другой функции. Далее из таких комбинированных фрагментов собирается новая функция, в которой для переключения между базовыми блоками используется диспетчер. Диспетчер принимает в качестве параметров номер предыдущего базового блока и набор булевых переменных, которые используются в базовых блоках для вычисления условий перехода, и вычисляет номер следующего блока. При этом следующий блок может выбираться из нескольких эквивалентных блоков, полученных в результате клонирования. Выражая функцию перехода в виде булевой формулы, можно добиться того, что задача статического анализа диспетчера станет не решаемой. Работа [84] описывает алгоритм запутывания, но реализация этого алгоритма в какой-либо системе автору не известна.
43
Локализация переменных в базовом блоке. Это преобразование локализует использование переменных одним базовым блоком. Для каждого запутываемого базового блока функции создаётся свой набор переменных. Все использования локальных и глобальных переменных в исходном базовом блоке заменяются на использование соответствующих новых переменных. Чтобы обеспечить правильную работу программы между базовыми блоками вставляются так называемые связующие (connective) базовые блоки, задача которых скопировать выходные переменные предыдущего базового блока во входные переменные следующего базового блока.
Применение такого запутывающего преобразование приводит к появлению в функции большого числа новых переменных, которые, используются только в одном, двух базовых блоках, что усложняет анализ программы. При реализации этого запутывающего преобразования возникает необходимость точного анализа указателей.
Расширение области действия переменных. Данное преобразование по смыслу обратно предыдущему. Это преобразование пытается увеличить время жизни переменных настолько, насколько возможно. Вынося блочную переменную на уровень функции или локальную переменную на статический уровень, расширяется область действия переменной и усложняется анализ программы. Здесь используется то, что глобальные методы анализа (то есть, методы, работающие над одной функцией в целом) хорошо обрабатывают локальные переменные, но для работы со статическими переменными требуются более сложные методы анализа.
Для дальнейшего запутывания можно объединить несколько таких статических переменных в одну переменную, если точно известно, что переменные не могут использоваться одновременно. Очевидно, что преобразование может применяться только к функциям, которые никогда не вызывают друг друга непосредственно или через цепочку других вызовов.
44
2.3 Классификация методов анализа программ
Рассматривая процессы запутывающих преобразований необходимо рассмотреть и обратные процессы распутывания программ, которые позволят получить исходный текст программы. К таким процессам можно отнести процесс оптимизации программного кода, т.к. в процессе запутывания в программный код производиться добавление лишних операций, не влияющих на результаты работы самой программы, и предназначены для усложнения процесса изучения кода программы.
Процесс оптимизации программного кода направлен на ликвидацию лишних операций, поэтому в частных случаях он может выступать в качестве главного процесса распутывания. Как правило, он осуществляется автоматически большинством компиляторов в процессе компиляции исходного кода программы, поэтому если запутывание осуществляется над исходным кодом программы, возникает вероятность того, что после компиляции снизится ее эффективность.
К процессу распутывания, также можно отнести и процесс декомпиля-ции, который позволяет, имея двоичный код программы получить наиболее схожее исходное представление этого кода на языке высокого уровня - это позволит упростить процесс реверсивной инженерии.
Рассмотрим методы, которые применяются при анализе программ в компиляторах. Цель таких методов - выявление зависимостей между компонентами программы, что даёт возможность применить определённые оптимизационные преобразования, или накладывает ограничения на проводимые оптимизационные преобразования.
Методы анализа программ могут быть разделены на 4 группы [71]:
- синтаксические - методы, основанные только на результатах лексического, синтаксического и семантического анализа программы;
- статические - методы анализа потоков управления и данных и методы, основанные на результатах анализа потоков управления и данных. Ста-
45 тические методы анализа работают с программой, не используя информацию о работе программы на конкретных начальных данных;
- динамические - основаны на использовании информации, полученной в результате «наблюдения» за работой программы на конкретных входных данных;
- статистические - методы использующие информацию, собранную в результате значительного количества запусков программы на большом количестве наборов входных данных.
2.3.1 Методы статического анализа
Статический анализ [71] - это семейство технологий анализа программ, где требуемую информацию о программе получают при помощи специальных программ. Статический анализ программ, представленных в двоичном виде, можно осуществить, используя декомпилятор, а представленных в исходном виде, используя текстовый редактор. Технологии статического анализа отличаются от большинства существующих, ее основное качество заключается в том, что она является более комплексной, и базируется на семантике (определяет смысловое значение предложений алгоритмического языка) самого кода программы.
Статический анализ позволяет исследовать программу, и выявить некоторые причины возможного поведения во время ее работы, то есть результаты статического анализа нельзя считать абсолютно точными. В то же время статический анализ обычно требует много вычислений и является длительным, особенно когда анализируются большие программы.
Рассмотрим возможные методы статического анализа [71, 89, 95, 99].
Статический анализ алиасов (alias analysis) необходим в языках, в которых несколько имён могут быть использованы для доступа к одной и той же области памяти. В результате анализа алиасов каждому оператору, выполняющему косвенную запись в память или косвенное чтение из памяти, ста-
46 вится в соответствие множество имён переменных, которые могут затрагиваться данной операцией.
Такой анализ является ключевым для точного анализа свойств программы.
Статическое устранение мёртвого кода (dead-code elimination) имеет целью выявить в программе код, который выполняется, но не оказывает влияние на результат работы программы.
Статическая минимизация количества переменных (variable minimization) имеет целью уменьшить количество используемых в функции локальных переменных за счёт объединения переменных, времена жизни значений в которых не пересекаются в одну переменную. Для минимизации количества переменных строится граф перекрытия переменных с помощью итерационного решения уравнения потока данных и последующей раскраске вершин этого графа в минимальное количество цветов.
Статическое продвижение констант и копий (constant and copy propagation) заключается в продвижении константных выражений как можно дальше по тексту функции. Если выражение использует только значения переменных, которые в данной точке программы заведомо содержат одно известное значение, такое выражение может быть вычислено. Если в выражении используется переменная, которая в данной точке программы заведомо является копией какой-то другой переменной, в выражение может быть подставлена исходная переменная.
Статический анализ доменов (domain analysis) является расширением алгоритма продвижения констант. Он позволяет определить множество значений, которые может принимать данная переменная в данной точке программы, если это множество не велико.
Статический слайсинг (slicing) - это построение "сокращённой" программы, из которой удалён весь код, не влияющий на вычисление заданной переменной в заданной точке, но при этом программа остаётся синтаксически и семантически корректной и может быть выполнена.
47
2.3.2 Методы статистического и динамического анализа
Статистические методы используют информацию, собранную в результате значительного количества запусков программы на большом количестве наборов входных данных. В рамках вопроса запутывающих преобразований следует выделить несколько видов статистического анализа.
Статистический анализ покрытия базовых блоков программы позволяет установить, выполнялся ли когда-либо заданный базовый блок при выполнении программы на заданном множестве наборов входных данных.
Статистическое сравнение трасс позволяет выявить, одинаковы ли трассы программы, полученные при разных запусках на одном и том же наборе входных данных.
Статистическое построение графа потока управления строит граф потока управления на основании информации о порядке следования базовых блоков на одном наборе или на множестве наборов входных данных.
Динамический анализ заключается в анализе программы во время ее выполнения. Динамический анализ обычно осуществляется быстрее, чем статический, так как время его выполнения чаще всего зависит от скорости выполнения анализируемой программы. Недостаток динамического анализа заключается в том, что полученные результаты могут не соответствовать результатам, получаемым при последующих запусках одной и той же программы. Рассмотрим возможные методы динамического анализа.
Динамическое продвижение копий вдоль трасс необходимо для точного межпроцедурного анализа зависимостей по данным на основе трассы выполнения программы.
Динамическое выделение мёртвого кода позволяет выявить инструкции программы, которые выполнялись при данном запуске программы, но не влияли на результат работы программы. Если анализируется совокуп-
48 ность запусков программы на множестве наборов входных данных, можно говорить о статистическом выделении мёртвого кода.
Динамический слайсинг оставляет в трассе программы только те инструкции, которые повлияли на вычисление данного значения в данной точке программы, или только те инструкции, на которые повлияло присваивание значения данной переменной в данной точке программы.
Точность динамических методов анализа определяется, только тогда, когда известно полное текстовое покрытие программы. Построение полного тестового покрытия - алгоритмически неразрешимая задача. В противном случае статистическое выявление свойств программы не позволяет нам утверждать, что данное свойство справедливо на всех допустимых наборах входных данных. Поэтому описанные выше динамические методы не могут применяться в автоматическом инструменте анализа программ.
2.4 Классификация способов запутывания к применяемым методам анализа и распутывания программ
Сопоставим методы запутывания, и методы анализа программ приведенные в разделах 2.2 и 2.3.
Запутывающие преобразования процессом форматирования не устойчивы к методам синтаксического анализа, т.к. программы обладают свойством открытости семантики. Для анализа таких программ достаточно изучение семантики программы, что дает возможность определить внесенные изменения в программу. Так же для программ реализованных на языках высокого уровня программирования, всегда можно использовать инструменты автоматического переформатирования, поэтому использовать такие преобразования необходимо для программ низкой стоимостью, не требующих высокого уровня защиты, либо комбинировать эти преобразования с другими методами.
49
Запутывание преобразованием структур данных можно проанализировать статистическим и динамическим анализом потока данных. Анализ потока данных, основывается на изучении того, как в процессе работы программы изменяются в ней данные (переменные, массивы). Также достаточно легко провести анализ содержимого регистров, временных переменных, в том числе определение возвращаемых функциями значений, распространение типов данных.
Преобразования потока управления не устойчивы к методам статического и статистического анализа, т.к. всегда есть возможность визуализации графа потока управления, провести сравнение трасс полученных на одном и том же наборе входных данных, алгебраическое упрощения для определения непрозрачных предикат, статическое и динамическое устранение мертвого кода.
Исходя из вышеизложенного, можно сделать вывод о том, что запутывающее преобразование называется устойчивым относительно некоторого класса методов анализа программ, если методы этого класса не позволяют надёжно раскрыть данное запутывающее преобразование.
Для некоторых видов запутывающих преобразований требуемые инструменты анализа (синтаксические, статические, статистические и динамические) зависят от того, каким способом было реализовано преобразование.
Информация о работе Метод защиты программных средств на основе запутывающих преобразований