Считыватель отпечатков пальцев на основе ARM

advertisement
Санкт-Петербургский Государственный Политехнический Университет
Факультет Технической Кибернетики
Кафедра Информационных Измерительных Технологий
Диссертация на соискание ученой степени магистра
Исследование методов защиты целостности
программ, написанных на C/C++
Выполнил студент гр. 6085/2 Ярошевич А.А.
Руководитель, к.т.н., доц. Сальников В.Ю.
Актуальность защиты ПО

наиболее распространенные виды атак на ПО:
Несанкционированное использование
либо распространение ПО (пиратство)
Кража интеллектуальной собственности или
конфиденциальных данных, содержащихся
в программе (в том числе восстановление
логики работы программы)
Незаконная модификация кода программы
ПО
Классификация систем защиты ПО
Системы защиты (СЗ) ПО по методу установки можно
подразделить на:



системы, устанавливаемые на скомпилированные модули
ПО;
системы, встраиваемые в исходный код ПО до компиляции;
комбинированные.
По используемым механизмам защиты СЗ можно
классифицировать на:



системы, использующие сложные логические механизмы;
системы, использующие шифрование защищаемого ПО;
комбинированные системы.
Методы защиты ПО







алгоритмы запутывания (обфускация);
алгоритмы мутации;
алгоритмы компрессии данных;
алгоритмы шифрования данных;
методы затруднения дизассемблирования;
методы затруднения отладки;
эмуляция процессоров и операционных систем.
Готовые программные средства,
обеспечивающие защиту целостности ПО.
Практическая задача.




Протекторы (или упаковщики)
С точки зрения классификации СЗ являются системами, устанавливаемыми
на скомпилированные модули ПО (с точки зрения установки), а также
комбинированными с точки зрения используемых механизмов защиты.
Следовательно, протекторы в любом случае проигрывают по степени
защищенности СЗ, комбинированным с точки зрения установки. Достаточно
один раз написать программу взлома и она будет действовать для любого
ПО, защищенного данным протектором.
Поэтому имеет смысл разработать СЗ, комбинированную и с точки зрения
установки и с точки зрения используемых механизмов защиты. Подобная СЗ
позволит избежать подобной простоты взлома – для каждого защищенного
ПО нужно будет написать свою программу взлома.
В рамках задачи исследования методов защиты целостности
программ, было предложено решить практическую задачу
создания системы защиты ПО.
Задача: разработка модуля защиты целостности программ, написанных на
С/С++.

шифование фрагментов программы с динамическим дешифрованием в
процессе выполнения;

использование методов затруднения дизассемблирования и методов
затруднения отладки.
Требования к алгоритму
шифрования/дешифрования
Общие требования:





быстрое дешифрование;
возможность проверки контрольной суммы исполняемого
программного кода одновременно с дешифрованием;
максимальное распространение ошибки в зашифрованном коде;
возможность использовать в качестве ключа, информацию,
получаемую на основе какой-либо части исполняемого кода.
Требования к симметричному блочному алгоритму:




минимальный размер блока (чем больше размер блока, тем
меньше надежность шифрования небольших фрагментов
исполняемого кода);
простота программной реализации (некоторые алгоритмы
созданы с расчетом на аппаратную реализацию, и их
программная реализация обычно относительно сложна);
алгоритм должен быть свободно распространяемым, не
запатентованным.
Симметричный блочный
алгоритм Blowfish
Алгоритм






Количество
циклов
процессора
/ байт
Blowfish разработан Брюсом Шнайером
Размер блока: 64 бита
Blowfish
19,8
Ключ переменной длины: от 32 до 448
Khufu/Khafre
20
битов (настраиваемая безопасность)
Square
20,3
Не запатентован (свободное
RC5-32/16
24,8
использование)
CAST-128
29,5
Высокая скорость шифрования на ПК.
Алгоритм разрабатывался специально
DES
43
для реализации на 32-битных
Serpent
45
процессорах с большим КЭШем данных,
SAFER (S)Kтаких как Pentium и PowerPC. Blowfish
52
128
шифрует данные на 32-битовых
процессорах со скоростью 19,8 тактов на
FEAL-32
65
байт (см. таблицу 1)
IDEA
74
Простота. Blowfish использует только
Triple-DES
116
простые операции: сложение, XOR и
выборка из таблицы по 32-битовому Таблица 1. Производительность алгоритмов
шифрования на процессорах Pentium
операнду
Алгоритм 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
Алгоритм Blowfish



Функция F производит следующие действия (см. рис. 2):
Разделить xL на четыре 8-битовых части: a, b, c и d
F(xL) = ( ( S1,a + S2,b mod 232 ) XOR S3,c ) + S4,d mod 232
Дешифрирование выполняется
аналогично шифрованию, но
P1, P2, …, P18 используются в
обратном порядке.
Подключи рассчитываются с
помощью специального
алгоритма.
Рис. 2. Алгоритм функции F
Режимы работы блочных
шифров







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 (сцепление
блоков шифра с контрольной суммой)
Режим PCBC




PCBC, Propagation Cipher Block Chaining Mode (режим
распространяющегося сцепления блоков шифра)
Над каждым блоком открытого текста перед шифрованием
выполняется операция XOR результата XOR предыдущего
блока открытого текста и предыдущего блока шифротекста
В качестве первого блока шифруются какие-то случайные
данные. Этот блок случайных данных называется блоком
инициализации (initialization vector, IV). Блок
инициализации используется для того, чтобы сделать
каждый зашифрованный текст уникальным, даже если он
начинается одинаково
PCBC используется в Kerberos версии 4 для выполнения за
один проход и шифрования, и проверки целостности. В
режиме PCBC ошибка шифротекста приводит к
неправильному дешифрованию всех последующих блоков.
Это означает, что проверка стандартного блока в конце
сообщения обеспечивает целостность сообщения.
Общая концепция
разрабатываемой системы защиты




В рамках задачи исследования методов защиты целостности программ, было
предложено решить практическую задачу создания системы защиты ПО.
Шифрование исполняемого кода программы с динамическим
дешифрованием в процессе выполнения является лучшим методом
затруднения отладки и дизассемблирования
Для реализации шифрования/дешифрования был выбран алгоритм
шифрования Blowfish в режиме распространяющегося сцепления блоков
шифра (PCBC).
Однако также в разрабатываемой системе защиты целостности предлагается
использовать дополнительные методы затруднения дизассемблирования и
методы затруднения отладки, а именно:

Использование многопоточности. Использование в программе
многопоточности сильно затрудняет исследование программы;

Непрямой запуск API функций. Метод основан на вызове API функций
Windows нестандартным способом, без использования таблицы импорта
PE .exe файла. Этот метод используется для того, чтобы затруднить
исследователю анализ вызовов API функций, что, как следствие,
затрудняет понимание логики работы программы;

Использование различных защитных антиотладочных приемов,
основанных на определении наличия активного отладчика в системе.
Способ использования
системы защиты
Пользователь сам выбирает, какие фрагменты исходного файла будут
зашифрованы в исполняемом файле
void f()
{
…
//
{{ – двойные открывающие фигурные скобки
{{
// обозначают начало фрагмента для зашифровки
…
// Здесь находится защищаемый фрагмент!
}}
//
}} – двойные закрывающие фигурные скобки
…
// обозначают конец фрагмента для зашифровки
}

void f()
{
…
while(g == 0)
{{
…
// Тело цикла целиком
}}
// является защищаемым
…
// фрагментом
}
void f()
{{
…
}}
// Функция целиком является
// защищаемым фрагментом
Способ использования
системы защиты


Допускается бесконечная
вложенность фрагментов друг в
друга
void f()
{{
…
{{
}}
}}
…
…
//
//
//
//
Пример возможного
расположения фрагментов:
void f()
{
…
{{
…
if(…)
{{
}}
else
{
Один защищаемый
фрагмент вложен в
другой защищаемый
фрагмент
}
…
while(1)
{{
}}
…
{{
}
}}
}}
…
…
…
{{
}}
…
…
…
…
Способ использования
системы защиты




Пользователь системы защиты может указать ключ для шифрования
фрагмента кода при помощи макроса 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" в нужный момент (т.е. до
выполнения зашифрованного фрагмента кода).
Структура системы защиты
целостности ПО
Было принято решение разделить систему защиты целостности на 3
функциональных блока:

"Парсер" – производит предварительную подготовку *.c/*.cpp файлов до
компиляции, добавляя вспомогательную информацию;

"Кодер" – анализирует файл выхода компилятора *.cod и файл выхода
линкера *.map и, на основе полученных из этих файлов данных, шифрует
фрагменты исполняемого *.exe файла, соответствующие выбранным

пользователем фрагментам исходных
файлов *.c/*.cpp;
“Модуль динамической защиты” –
модуль, который встраивается в проект
и производит в нужный момент
динамическое шифрование/
дешифрование фрагментов
исполняемого кода, а также содержит в
себе дополнительные защитные
антиотладочные приемы
Использование программного комплекса
защиты целостности ПО
1. Обычный проект
на С/С++ (пользователь обозначает
специальными метками фрагменты кода,
которые нужно зашифровать, а также
ключ, если хочет)
2. Файл *.c/*.cpp
обрабатывается
«Парсером», который
заменяет
Метки пользователя на
вспомогательный код.
3. Пользователь устанавливает
необходимые настройки
компилятора и линкера,
в частности, «Создавать *.cod –
файл» и «Генерировать *.map –
файл»
6. Полученные файлы *.cod,
*.map и *.exe подаются на вход
«Кодера»,
который зашифровывает в *.exe
файле обозначенные фрагменты
5. Производится
компиляция и
сборка файлов
проекта
4. Пользователь включает в
проект «Модуль защиты
целостности»
(содержит процедуру
шифрования/дешифровани
я, а также защитные
антиотладочные приемы )
7. Программа готова
к использованию.
Обозначенные
фрагменты кода
дешифруются
динамически в
процессе
выполнения
Алгоритм работы «Парсера»
Алгоритм работы
«Кодера»
Алгоритмы работы
«Модуля динамической защиты»
Заключение








Произведен обзор методов защиты ПО, Рассмотрена классификация существующих
систем защиты. Рассмотрены существующие системы защиты ПО.
Выполнены анализ и сравнение алгоритмов шифрования в контексте
шифрования/дешифрования исполняемого кода программы
Программно реализован выбранный алгоритм шифрования Blowfish в режиме
PCBC. Произведено тестирование программной реализации алгоритма.
Исследованы и реализованы методы затруднения отладки и дизассемблирования
Сформулирована общая концепция разрабатываемой системы защиты целостности
ПО на основе результатов обзора и исследования методов защиты ПО и анализа и
сравнения алгоритмов шифрования. Также при разработке системы использовались
результаты исследования и практической реализации выбранного алгоритма
шифрования Blowfish в режиме PCBС
Разработаны алгоритмы для каждого из функциональных блоков системы защиты
целостности
Разработана программная реализация системы защиты целостности для программ,
написанных на языке программирования C/C++.
Произведено тестирование разработанной системы, которое подтвердило
способность разработанной системы качественно выполнять поставленные задачи:
защита программ от: несанкционированного доступа, модификации кода
программы, внедрения закладок, изучения структуры оригинальных алгоритмов
программы, кражи интеллектуальной собственности или конфиденциальных
данных, содержащихся в программе (в том числе восстановление логики работы
программы) и т.д.
Download