Статья опубликована в рамках: LXVI Международной научно-практической конференции «Научное сообщество студентов XXI столетия. ТЕХНИЧЕСКИЕ НАУКИ» (Россия, г. Новосибирск, 14 июня 2018 г.)
Наука: Информационные технологии
Скачать книгу(-и): Сборник статей конференции
дипломов
АЛГОРИТМ ЗАЩИТЫ ПРОГРАММНОГО КОДА ПРИ ПОМОЩИ ЗАПУТЫВАЮЩИХ ПРЕОБРАЗОВАНИЙ
В настоящее время достаточно актуальной проблемой является защита программного обеспечения от неавторизованного использования, модификации и копирования. Одним из уязвимых мест в защите программного обеспечения является защита программного кода от анализа и обратного проектирования. Если поставщик ПО не включил в программу специальных средств защиты от анализа, то злоумышленник имеет возможность дизассемблировать двоичный код исполняемой программы и по ассемблерному коду восстановить алгоритм. После анализа алгоритмов работы защиты злоумышленник генерирует серийные ключи и эмулирует аппаратные.
Одним из эффективных методов защиты программного обеспечения от анализа, отладки и исследования является метод запутывающих преобразований.
Выделяется несколько видов запутывающих преобразований исходя из способа их действия [1].
Лексические преобразования являются самыми простыми и обеспечивающими наименьшую защиту. Лексические преобразования фактически сводятся к переименованию идентификаторов (переменных, классов, методов), затрудняя анализ логики программы на основании имен этих идентификаторов. Этот способ предотвращает некоторое количество попыток воровства интеллектуальной собственности, но не создает серьезного препятствия для опытного хакера.
Преобразования хода выполнения – это второй тип запутывающих преобразований. Этот способ оперирует с процессом выполнения программы, т.е. субъектом преобразований являются последовательности вызовов функций (операторов).
Третьим типом запутывающих преобразований является преобразование данных. Наиболее распространенным является разделение переменной – представление атомарного значения (например, целого или булевого) в виде некоторой сложной структуры данных [2].
Для всех типов запутывающих преобразований существуют стандартные методы преодоления, что приводит к выводу о низкой эффективности существующих методов и необходимости разработки новых.
Алгоритм защиты программного кода при помощи сетей Петри представлен на рисунке 1.
На первом этапе исходный код необходимо преобразовать. Для этого машинный код извлекается из объектных файлов. Затем извлеченный код обрабатывается с помощью дизассемблера. Дизассемблированные инструкции переводятся на язык Low Level Virtual Machine ассемблера (LLVM IR). Ссылки на переменные не меняются, а для ячеек регистров процессора и регистра флагов, используются статические переменные. При помощи стандартных оптимизаций LLVM упрощается полученный код.
Все функции, представленные в виде LLVM IR, состоят из набора базовых блоков. Запутывающее преобразование при помощи сетей Петри удобно применять к каждому конкретному базовому блоку в отдельности. Благодаря тому, что структура базового блока обеспечивает последовательное выполнение эволюций сети Петри (раундов), то есть перемещения меток из одной позиции в другую только в том случае, когда это разрешено текущим состоянием сети и соответствующим переходом.
Рисунок 1. Алгоритм защиты программного кода при помощи сетей Петри
Все функции, представленные в виде LLVM IR, состоят из набора базовых блоков. Запутывающее преобразование при помощи сетей Петри удобно применять к каждому конкретному базовому блоку в отдельности. Благодаря тому, что структура базового блока обеспечивает последовательное выполнение эволюций сети Петри (раундов), то есть перемещения меток из одной позиции в другую только в том случае, когда это разрешено текущим состоянием сети и соответствующим переходом. Для наилучшей интеграции исходного кода и кода сети Петри необходимо использовать один или несколько базовых блоков максимального размера. Если в защищаемой функции имеются только базовые блоки небольших размеров, то несколько базовых блоков объединяются в один, используя технологию гиперблокинга [4]. Оптимальным является размер базового блока, который состоит из нескольких сотен инструкций LLVM IR.
Второй этап включает в себя выбор набора защищаемых значений. Защищаемыми значениями могут быть константы, адреса констант и значения ячеек памяти, которые являются начальными для базового блока. Так же необходимо выбрать число раундов сети Петри, при этом оно не должно сильно превышать число защищаемых значений. Для увеличения стойкости запутывающих преобразований часть пометок можно выбрать случайным образом.
На третьем этапе необходимо выбрать одну из заранее придуманных сетей Петри. Для поддержки базовых блоков с большим количеством защищаемых значений, при помощи операции масштабирования, сеть Петри приводится к адекватному размеру.
На четвертом этапе определяются начальные пометки сети Петри при помощи решения системы диофантовых уравнений в кольце вычетов по длине машинного слова инструментального процессора.
После выполнения четвертого этапа получается базовый блок со вставленными инструкциями расчёта раундов сети Петри между инструкциями защищаемого алгоритма, заданный в виде LLVM IR. Для генерации кода создается фиктивный модуль компиляции, который содержит только защищаемый код, полученный после третьего этапа. Процесс получения выходного файла зависит от того, находилась ли используемая функция в отдельной секции объектного файла или нет. Если функция находилась в отдельной секции, то из исходного объектного файла удаляется секция с этой функцией, а в конец файла дописывается секция с защищенной функцией. Если используемая функция не находилась в отдельной секции объектного файла, то тело оригинальной функции заменяется на псевдослучайную последовательность байтов, ссылки в ее прежней секции на удаленную часть преобразуются в символы со сгенерированными именами, а с использованной функцией дописывается в новую секцию, в конец.
Приведенный алгоритм защиты программного кода с использованием запутывающих преобразований устойчив к взлому, так как существует необходимость отладки многопоточного кода и анализ большого числа одновременно изменяющихся значений.
Список литературы:
- Collberg C., Thomborson C., Low D. Breaking Abstractions and Unstructuring Data Structures // Proc. of the 1998 Intern. Conf. on Computer Languages, 1998. - P. 28.
- Анисимов А. В., Иванов И. Ю. Подходы к защите программного обеспечения от атак злонамеренного хоста // Проблеми програмування. – 2006. – № 1 – С. 41-61
- S. Mahlke, D. Lin,W. Chen, R. Hank, R.Bringmann, Effective Compiler Support for Predicated Execution Using the Hyperblock // Proceeding MICRO 25 Proceedings of the 25th annual international symposium on Microarchitecture, IEEE Computer Society Press Los Alamitos, 1992. – С. 45–54.
дипломов
Оставить комментарий