Компилятор языка программирования Си
DESCRIPTION
Дипломный проект. Компилятор языка программирования Си. Работу выполнил: Студент группы 6085/4 Засов М.С. Руководитель: (доцент, к.т.н.) Сальников В.Ю. Необходимость применения обфускации. Защита программного обеспечения от модификации - PowerPoint PPT PresentationTRANSCRIPT
Компилятор языка программирования СиРаботу выполнил:Студент группы 6085/4Засов М.С.
Руководитель:(доцент, к.т.н.)Сальников В.Ю.
1
Дипломный проект
Необходимость применения обфускации
• Защита программного обеспечения от модификации
• Затруднение исследований алгоритмов защиты программного обеспечения
2
Классификация запутывающих преобразований
• Преобразование форматирования– Текстовые преобразования (удаление
комментариев, изменение отступов, переименование переменных и типов)
• Преобразование структур данных– Изменение иерархии наследования
• Преобразование потока управления программы– Внесение изменений в структуру графа потока
выполнения
3
Поиск инструментов
• Макропроцессор Gem• Препроцессор Mcpp
Недостатки: элементарность преобразований
Необходимость создания мощного инструмента со множеством возможностей
4
Архитектура разработанного приложения
5
Исходный код программы
Лексический анализ
Синтаксический анализ
Обфускация
Контекст компиляции
Модифицированный код
программы
Таблица типов
Таблица переменных
х
Лексический анализатор
• Реализован с помощью генератора лексических анализаторов
Плюсы:
– Автоматическое построение лексических таблиц
– Удобство добавления регулярных выражений– Удобство добавления действий
6
Синтаксический анализатор
• Реализован с помощью генератора синтаксических анализаторов
Плюсы:
– Формальное описание языка Си на метаязыке генератора
– Легкое связывание распознавателя с алгоритмами семантического анализа
– Легкое связывание распознавателя с лексером
7
Текущий контекст компиляции
Преобразование исходного кода выполняется в определенном контексте компиляции
Область видимостиЛюбое выражение соответствует «своей» области
видимости
Таблица типовЛюбой тип соответствует «своей» области видимости
Таблица переменныхЛюбая переменная находится в определенной области
видимости
8
Разработана объектная модель Си
• Спроектировано иерархическое представление сущностей Си в виде иерархии классов
Плюсы реализации• Унифицированный подход при обходе дерева• Легкая расширяемость• Легкая модификация
9
Разработана иерархия базовых узлов
10
AbstractNode
+ функция Dump(TextWriter& writer)+ функция Walk()
BinaryPolyNode
PolyNodeUnaryNode
BinaryNode
TernaryNode
Наследники UnaryNode
11
UnaryNode
StructOrUnionSpecifier
UnaryExpression ExternalDeclaration BlockItem
TypeSpecifierTypeQualifier
TypeQualifier TypeQualifier
Разработанные алгоритмы обфускации исходного кода
– Алгоритм скрытия констант
– Алгоритм замены переменных на указатели
– Алгоритм замены вызовов функций на вызовы через указатель
– Алгоритм скрытия прямых обращений к массивам по индексу
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