Дипломный проект Компилятор языка программирования Си Работу выполнил: Студент группы 6085/4 Засов М.С. Руководитель: (доцент, к.т.н.) Сальников В.Ю. 1 Необходимость применения обфускации • Защита программного обеспечения от модификации • Затруднение исследований алгоритмов защиты программного обеспечения 2 Классификация запутывающих преобразований • Преобразование форматирования – Текстовые преобразования (удаление комментариев, изменение отступов, переименование переменных и типов) • Преобразование структур данных – Изменение иерархии наследования • Преобразование потока управления программы – Внесение изменений в структуру графа потока выполнения 3 Поиск инструментов • Макропроцессор Gem • Препроцессор Mcpp Недостатки: элементарность преобразований Необходимость создания мощного инструмента со множеством возможностей 4 Архитектура разработанного приложения Исходный код программы Лексический анализ Синтаксический анализ Обфускация Модифицирова нный код программы Контекст компиляции Таблица типов Таблица переменных х 5 Лексический анализатор • Реализован с помощью генератора лексических анализаторов Плюсы: – Автоматическое построение лексических таблиц – Удобство добавления регулярных выражений – Удобство добавления действий 6 Синтаксический анализатор • Реализован с помощью генератора синтаксических анализаторов Плюсы: – Формальное описание языка Си на метаязыке генератора – Легкое связывание распознавателя с алгоритмами семантического анализа – Легкое связывание распознавателя с лексером 7 Текущий контекст компиляции Преобразование исходного кода выполняется в определенном контексте компиляции Область видимости Любое выражение соответствует «своей» области видимости Таблица типов Любой тип соответствует «своей» области видимости Таблица переменных Любая переменная находится в определенной области видимости 8 Разработана объектная модель Си • Спроектировано иерархическое представление сущностей Си в виде иерархии классов Плюсы реализации • Унифицированный подход при обходе дерева • Легкая расширяемость • Легкая модификация 9 Разработана иерархия базовых узлов AbstractNode + функция Dump(TextWriter& writer) + функция Walk() UnaryNode PolyNode BinaryNode BinaryPolyNode TernaryNode 10 Наследники UnaryNode UnaryExpression ExternalDeclaration BlockItem TypeQualifier UnaryNode TypeSpecifier TypeQualifier TypeQualifier StructOrUnionSpecifier 11 Разработанные алгоритмы обфускации исходного кода – Алгоритм скрытия констант – Алгоритм замены переменных на указатели – Алгоритм замены вызовов функций на вызовы через указатель – Алгоритм скрытия прямых обращений к массивам по индексу 12 Алгоритм скрытия констант Исходный код: int queryID = j + 101; Результат преобразований: int a44 = 63; int a83 = 303; a83 = a83 + a44; a83 = a83 - 265; int queryID = j + a83; 13 Алгоритм замены переменных на указатели Исходный код: 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); 14 Алгоритм замены вызова функции на вызов через указатель Начало алгоритма Поиск функции в таблице функций нет (не найдено) да (найдено) Создание указателя на функцию соответствующего типа Инициализация указателя Замена вызовов функции на вызов через указатель Конец алгоритма 15 Алгоритм скрытия прямых обращений к массиву по индексу Начало алгоритма Поиск обращений к массиву по индексу нет (не найдено) да (найдено) Создание новой переменной Инициализация переменной адресом начала массива + константа Замена обращения к массиву на созданную переменную константа Конец алгоритма 16 Выводы В результате проделанной работы были решены следующие вопросы Определена актуальность решения проблемы обфускации кода Си с целью защиты ПО от реверс-инжиниринга Проанализированы существующие решения. Найдены их недостатки Выбрана модель древовидного построения сущностей Си Разработана программа-компилятор, реализующая рассмотренные алгоритмы обфускации Протестирована работа компилятора на типовых примерах Возможные направления развития: разложение циклов, переплетение независимого кода 17