21
Выполнил студент гр. 6085/2 Ярошевич А.А. Руководитель, к.т.н., доц. Сальников В.Ю. Санкт-Петербургский Государственный Политехнический Университет Исследование методов защиты целостности программ, написанных на C/C++ Факультет Технической Кибернетики Кафедра Информационных Измерительных Технологий Диссертация на соискание ученой степени магистра Исследование методов защиты целостности программ, написанных на C/C++

Исследование методов защиты целостности программ, написанных на C/C++

  • Upload
    faith

  • View
    79

  • Download
    0

Embed Size (px)

DESCRIPTION

Санкт-Петербургский Государственный Политехнический Университет. Факультет Технической Кибернетики. Кафедра Информационных Измерительных Технологий. Исследование методов защиты целостности программ, написанных на C/C++. Диссертация на соискание ученой степени магистра. - PowerPoint PPT Presentation

Citation preview

Page 1: Исследование методов защиты целостности программ, написанных на C/C++

Выполнил студент гр. 6085/2 Ярошевич А.А.Руководитель, к.т.н., доц. Сальников В.Ю.

Санкт-Петербургский Государственный Политехнический Университет

Исследование методов защиты целостности программ, написанных на

C/C++

Факультет Технической Кибернетики

Кафедра Информационных Измерительных Технологий

Диссертация на соискание ученой степени магистраИсследование методов защиты целостности программ, написанных на

C/C++

Page 2: Исследование методов защиты целостности программ, написанных на C/C++

Несанкционированное использование либо распространение ПО (пиратство)

ПО

Актуальность защиты ПО

наиболее распространенные виды атак на ПО:

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

логики работы программы)

Незаконная модификация кода программы

Page 3: Исследование методов защиты целостности программ, написанных на C/C++

Классификация систем защиты ПО

Системы защиты (СЗ) ПО по методу установки можно подразделить на:

системы, устанавливаемые на скомпилированные модули ПО;

системы, встраиваемые в исходный код ПО до компиляции;

комбинированные.

По используемым механизмам защиты СЗ можно классифицировать на:

системы, использующие сложные логические механизмы;

системы, использующие шифрование защищаемого ПО; комбинированные системы.

Page 4: Исследование методов защиты целостности программ, написанных на C/C++

Методы защиты ПО

алгоритмы запутывания (обфускация); алгоритмы мутации; алгоритмы компрессии данных; алгоритмы шифрования данных; методы затруднения дизассемблирования; методы затруднения отладки; эмуляция процессоров и операционных систем.

Page 5: Исследование методов защиты целостности программ, написанных на C/C++

Готовые программные средства, обеспечивающие защиту

целостности ПО. Практическая задача.

Протекторы (или упаковщики) С точки зрения классификации СЗ являются системами,

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

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

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

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

создания системы защиты ПО. Задача: разработка модуля защиты целостности программ,

написанных на С/С++. шифование фрагментов программы с динамическим

дешифрованием в процессе выполнения; использование методов затруднения дизассемблирования и

методов затруднения отладки.

Page 6: Исследование методов защиты целостности программ, написанных на C/C++

Требования к алгоритму шифрования/дешифрования

Общие требования: быстрое дешифрование; возможность проверки контрольной суммы исполняемого

программного кода одновременно с дешифрованием; максимальное распространение ошибки в зашифрованном коде; возможность использовать в качестве ключа, информацию,

получаемую на основе какой-либо части исполняемого кода. Требования к симметричному блочному алгоритму:

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

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

алгоритм должен быть свободно распространяемым, не запатентованным.

Page 7: Исследование методов защиты целостности программ, написанных на C/C++

Симметричный блочный алгоритм Blowfish

Blowfish разработан Брюсом Шнайером

Размер блока: 64 бита Ключ переменной длины: от 32 до

448 битов (настраиваемая безопасность)

Не запатентован (свободное использование)

Высокая скорость шифрования на ПК. Алгоритм разрабатывался специально для реализации на 32-битных процессорах с большим КЭШем данных, таких как Pentium и PowerPC. Blowfish шифрует данные на 32-битовых процессорах со скоростью 19,8 тактов на байт (см. таблицу 1)

Простота. Blowfish использует только простые операции: сложение, XOR и выборка из таблицы по 32-битовому операнду

Алгоритм

Количество циклов процессора / байт

Blowfish 19,8

Khufu/Khafre 20

Square 20,3

RC5-32/16 24,8

CAST-128 29,5

DES 43

Serpent 45

SAFER (S)K-128

52

FEAL-32 65

IDEA 74

Triple-DES 116

Таблица 1. Производительность алгоритмов шифрования на процессорах Pentium

Page 8: Исследование методов защиты целостности программ, написанных на C/C++

Алгоритм Blowfish

Blowfish является сетью Фейстела, состоящей из 16 этапов. На вход подается 64-битовый элемент данных.

В Blowfish используется много подключей, которые объединены в P-массив и 4 S-блока. Все эти подключи должны быть рассчитаны до начала шифрования или дешифрирования данных.

P-массив состоит из восемнадцати 32-битовых подключей: P1, P2, …, P18

Каждый из четырех 32-битовых S-блоков содержит 256 элементов:

S1,0, S1,1, …, S1,255 S2,0, S2,1, …, S2,255 S3,0, S3,1, …, S3,255 S4,0, S4,1, …, S4,255

Рис. 1. Алгоритм шифрования Blowfish

Page 9: Исследование методов защиты целостности программ, написанных на C/C++

Алгоритм Blowfish

Функция F производит следующие действия (см. рис. 2):

Разделить xL на четыре 8-битовых части: a, b, c и d

F(xL) = ( ( S1,a + S2,b mod 232 ) XOR S3,c ) + S4,d mod 232

Рис. 2. Алгоритм функции F

Дешифрирование выполняется аналогично шифрованию, но P1, P2, …, P18 используются в обратном порядке.

Подключи рассчитываются с помощью специального алгоритма.

Page 10: Исследование методов защиты целостности программ, написанных на C/C++

Режимы работы блочных шифров

ECB, Electronic Code Book Mode (режим электронной кодовой книги, режим простой замены)

CBC, Cipher Block Chaining Mode (режим сцепления блоков) CFB, Cipher Feedback Mode (режим обратной связи по

шифру) OFB, Output Feedback Mode (режим выходной обратной

связи) BC, Block Chaining Mode (другой режим сцепления блоков) PCBC, Propagation Cipher Block Chaining Mode (режим

распространяющегося сцепления блоков шифра) CBCC, Cipher Block Chaining with Checksum (сцепление

блоков шифра с контрольной суммой)

Page 11: Исследование методов защиты целостности программ, написанных на C/C++

Режим PCBC PCBC, Propagation Cipher Block Chaining Mode (режим

распространяющегося сцепления блоков шифра) Над каждым блоком открытого текста перед шифрованием

выполняется операция XOR результата XOR предыдущего блока открытого текста и предыдущего блока шифротекста

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

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

Page 12: Исследование методов защиты целостности программ, написанных на C/C++

Общая концепция разрабатываемой системы

защиты В рамках задачи исследования методов защиты целостности

программ, было предложено решить практическую задачу создания системы защиты ПО.

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

Для реализации шифрования/дешифрования был выбран алгоритм шифрования Blowfish в режиме распространяющегося сцепления блоков шифра (PCBC).

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

Использование многопоточности. Использование в программе многопоточности сильно затрудняет исследование программы;

Непрямой запуск API функций. Метод основан на вызове API функций Windows нестандартным способом, без использования таблицы импорта PE .exe файла. Этот метод используется для того, чтобы затруднить исследователю анализ вызовов API функций, что, как следствие, затрудняет понимание логики работы программы;

Использование различных защитных антиотладочных приемов, основанных на определении наличия активного отладчика в системе.

Page 13: Исследование методов защиты целостности программ, написанных на C/C++

void f(){

…while(g == 0){{

… // Тело цикла целиком}} // является защищаемым… // фрагментом

}

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

void f(){

… // {{ – двойные открывающие фигурные скобки{{ // обозначают начало фрагмента для зашифровки

… // Здесь находится защищаемый фрагмент!}} // }} – двойные закрывающие фигурные скобки… // обозначают конец фрагмента для зашифровки

}

Способ использования системы защиты

void f(){{

… // Функция целиком является // защищаемым фрагментом

}}

Page 14: Исследование методов защиты целостности программ, написанных на C/C++

Способ использования системы защиты

Пример возможного расположения фрагментов:

void f(){

…{{

…if(…){{

…{{

…}}…

}}else{

…}…while(1){{

…}}…

}}…{{

…}}

}

Допускается бесконечная вложенность фрагментов друг в друга

void f(){{

…{{

… // Один защищаемый // фрагмент вложен в

// другой защищаемый // фрагмент}}…

}}

Page 15: Исследование методов защиты целостности программ, написанных на C/C++

Пользователь системы защиты может указать ключ для шифрования фрагмента кода при помощи макроса SECURITY_KEY_MACROS(key_variable, key_value), например:

{{ SECURITY_KEY_MACROS(key_variable, key_value)…

}}

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

Параметры макроса SECURITY_KEY_MACROS(key_variable, key_value): "key_variable" – имя глобальной переменной, которая в момент

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

"key_value" – значение ключа, которое будет использовано для шифрования данного фрагмента.

Значение ключа пользователь может вычислять каким-нибудь специальным способом, получать с внешнего носителя (например, e-token) или получать с сервера в Интернете. Способ получения ключа не важен, главное, чтобы его значение появилось в переменной "key_variable" в нужный момент (т.е. до выполнения зашифрованного фрагмента кода).

Способ использования системы защиты

Page 16: Исследование методов защиты целостности программ, написанных на C/C++

Структура системы защиты целостности ПО

Было принято решение разделить систему защиты целостности на 3 функциональных блока:

"Парсер" – производит предварительную подготовку *.c/*.cpp файлов до компиляции, добавляя вспомогательную информацию;

"Кодер" – анализирует файл выхода компилятора *.cod и файл выхода линкера *.map и, на основе полученных из этих файлов данных, шифрует фрагменты исполняемого *.exe файла, соответствующие выбранным

пользователем фрагментам исходных файлов *.c/*.cpp;

“Модуль динамической защиты” – модуль, который встраивается в проект и производит в нужный момент динамическое шифрование/ дешифрование фрагментов исполняемого кода, а также содержит в себе дополнительные защитные антиотладочные приемы

Page 17: Исследование методов защиты целостности программ, написанных на C/C++

Использование программного комплекса защиты целостности ПО1. Обычный проект

на С/С++ (пользователь обозначает специальными метками фрагменты

кода, которые нужно зашифровать, а также ключ, если хочет)

2. Файл *.c/*.cpp обрабатывается

«Парсером», который заменяет

Метки пользователя на вспомогательный код.

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

в частности, «Создавать *.cod – файл» и «Генерировать *.map –

файл»

6. Полученные файлы *.cod, *.map и *.exe подаются на вход

«Кодера», который зашифровывает в *.exe файле обозначенные фрагменты

7. Программа готова к использованию.

Обозначенные фрагменты кода дешифруются динамически в

процессе выполнения4. Пользователь включает

в проект «Модуль защиты целостности»

(содержит процедуру шифрования/дешифровани

я, а также защитные антиотладочные приемы )

5. Производится компиляция и сборка файлов

проекта

Page 18: Исследование методов защиты целостности программ, написанных на C/C++

Алгоритм работы «Парсера»

Page 19: Исследование методов защиты целостности программ, написанных на C/C++

Алгоритм работы «Кодера»

Page 20: Исследование методов защиты целостности программ, написанных на C/C++

Алгоритмы работы «Модуля динамической защиты»

Page 21: Исследование методов защиты целостности программ, написанных на C/C++

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

систем защиты. Рассмотрены существующие системы защиты ПО. Выполнены анализ и сравнение алгоритмов шифрования в контексте

шифрования/дешифрования исполняемого кода программы Программно реализован выбранный алгоритм шифрования Blowfish в режиме

PCBC. Произведено тестирование программной реализации алгоритма. Исследованы и реализованы методы затруднения отладки и дизассемблирования Сформулирована общая концепция разрабатываемой системы защиты целостности

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

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

Разработана программная реализация системы защиты целостности для программ, написанных на языке программирования C/C++.

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