170 likes | 315 Views
Дипломный проект. Компилятор языка программирования Си. Работу выполнил: Студент группы 6085/4 Засов М.С. Руководитель: (доцент, к.т.н.) Сальников В.Ю. Необходимость применения обфускации. Защита программного обеспечения от модификации
E N D
Дипломный проект Компилятор языка программирования Си Работу выполнил: Студент группы 6085/4 Засов М.С. Руководитель: (доцент, к.т.н.) Сальников В.Ю.
Необходимость применения обфускации • Защита программного обеспечения от модификации • Затруднение исследований алгоритмов защиты программного обеспечения
Классификация запутывающих преобразований • Преобразование форматирования • Текстовые преобразования (удаление комментариев, изменение отступов, переименование переменных и типов) • Преобразование структур данных • Изменение иерархии наследования • Преобразование потока управления программы • Внесение изменений в структуру графа потока выполнения
Поиск инструментов • Макропроцессор Gem • Препроцессор Mcpp Недостатки: элементарность преобразований Необходимость создания мощного инструмента со множеством возможностей
Архитектура разработанного приложения Исходный код программы Лексический анализ Контекст компиляции Синтаксический анализ Обфускация Таблица типов Таблица переменныхх Модифицированный код программы
Лексический анализатор • Реализован с помощью генератора лексических анализаторов Плюсы: • Автоматическое построение лексических таблиц • Удобство добавления регулярных выражений • Удобство добавления действий
Синтаксический анализатор • Реализован с помощью генератора синтаксических анализаторов Плюсы: • Формальное описание языка Си на метаязыке генератора • Легкое связывание распознавателя с алгоритмами семантического анализа • Легкое связывание распознавателя с лексером
Текущий контекст компиляции Преобразование исходного кода выполняется в определенном контексте компиляции • Область видимости Любое выражение соответствует «своей» области видимости • Таблица типов Любой тип соответствует «своей» области видимости • Таблица переменных Любая переменная находится в определенной области видимости
Разработана объектная модель Си • Спроектировано иерархическое представление сущностей Си в виде иерархии классов Плюсы реализации • Унифицированный подход при обходе дерева • Легкая расширяемость • Легкая модификация
Разработана иерархия базовых узлов AbstractNode + функция Dump(TextWriter&writer) + функция Walk() UnaryNode PolyNode BinaryNode BinaryPolyNode TernaryNode
Наследники UnaryNode UnaryExpression ExternalDeclaration BlockItem TypeQualifier TypeSpecifier UnaryNode TypeQualifier TypeQualifier StructOrUnionSpecifier
Разработанные алгоритмы обфускации исходного кода • Алгоритм скрытия констант • Алгоритм замены переменных на указатели • Алгоритм замены вызовов функций на вызовы через указатель • Алгоритм скрытия прямых обращений к массивам по индексу
Алгоритм скрытия констант • Исходный код: • intqueryID = j + 101; • Результат преобразований: • int a44 = 63; • int a83 = 303; • a83 = a83 + a44; • a83 = a83 - 265; • intqueryID= j + a83;
Алгоритмзамены переменных на указатели • Исходный код: • int a, b, c; • c = (a + b) / c; • Результат преобразований: • int a, b, c; • int* a0 = (&a-4); • int* b0 = (&b-312); • int* c0 = (&c-143); • *(c0+143) = (*(a0+4) + *(b0+312)) / *(c0+143);
Алгоритм замены вызова функции на вызов через указатель Начало алгоритма нет (не найдено) Поиск функции в таблице функций да (найдено) Создание указателя на функцию соответствующего типа Инициализация указателя Замена вызовов функции на вызов через указатель Конец алгоритма
Алгоритм скрытия прямых обращений к массиву по индексу Начало алгоритма нет (не найдено) Поиск обращений к массиву по индексу да (найдено) Создание новой переменной Инициализация переменной адресом начала массива + константа Замена обращения к массиву на созданную переменную - константа Конец алгоритма
Выводы В результате проделанной работы были решены следующие вопросы • Определена актуальность решения проблемы обфускации кода Си с целью защиты ПО от реверс-инжиниринга • Проанализированы существующие решения. Найдены их недостатки • Выбрана модель древовидного построения сущностей Си • Разработана программа-компилятор, реализующая рассмотренные алгоритмы обфускации • Протестирована работа компилятора на типовых примерах • Возможные направления развития: разложение циклов, переплетение независимого кода