Компилятор языка программирования Си

17
Компилятор языка программирования Си Работу выполнил: Студент группы 6085/4 Засов М.С. Руководитель: (доцент, к.т.н.) Сальников В.Ю. 1 Дипломный проект

Upload: rooney-watts

Post on 03-Jan-2016

68 views

Category:

Documents


1 download

DESCRIPTION

Дипломный проект. Компилятор языка программирования Си. Работу выполнил: Студент группы 6085/4 Засов М.С. Руководитель: (доцент, к.т.н.) Сальников В.Ю. Необходимость применения обфускации. Защита программного обеспечения от модификации - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Компилятор языка программирования Си

Компилятор языка программирования СиРаботу выполнил:Студент группы 6085/4Засов М.С.

Руководитель:(доцент, к.т.н.)Сальников В.Ю.

1

Дипломный проект

Page 2: Компилятор языка программирования Си

Необходимость применения обфускации

• Защита программного обеспечения от модификации

• Затруднение исследований алгоритмов защиты программного обеспечения

2

Page 3: Компилятор языка программирования Си

Классификация запутывающих преобразований

• Преобразование форматирования– Текстовые преобразования (удаление

комментариев, изменение отступов, переименование переменных и типов)

• Преобразование структур данных– Изменение иерархии наследования

• Преобразование потока управления программы– Внесение изменений в структуру графа потока

выполнения

3

Page 4: Компилятор языка программирования Си

Поиск инструментов

• Макропроцессор Gem• Препроцессор Mcpp

Недостатки: элементарность преобразований

Необходимость создания мощного инструмента со множеством возможностей

4

Page 5: Компилятор языка программирования Си

Архитектура разработанного приложения

5

Исходный код программы

Лексический анализ

Синтаксический анализ

Обфускация

Контекст компиляции

Модифицированный код

программы

Таблица типов

Таблица переменных

х

Page 6: Компилятор языка программирования Си

Лексический анализатор

• Реализован с помощью генератора лексических анализаторов

Плюсы:

– Автоматическое построение лексических таблиц

– Удобство добавления регулярных выражений– Удобство добавления действий

6

Page 7: Компилятор языка программирования Си

Синтаксический анализатор

• Реализован с помощью генератора синтаксических анализаторов

Плюсы:

– Формальное описание языка Си на метаязыке генератора

– Легкое связывание распознавателя с алгоритмами семантического анализа

– Легкое связывание распознавателя с лексером

7

Page 8: Компилятор языка программирования Си

Текущий контекст компиляции

Преобразование исходного кода выполняется в определенном контексте компиляции

Область видимостиЛюбое выражение соответствует «своей» области

видимости

Таблица типовЛюбой тип соответствует «своей» области видимости

Таблица переменныхЛюбая переменная находится в определенной области

видимости

8

Page 9: Компилятор языка программирования Си

Разработана объектная модель Си

• Спроектировано иерархическое представление сущностей Си в виде иерархии классов

Плюсы реализации• Унифицированный подход при обходе дерева• Легкая расширяемость• Легкая модификация

9

Page 10: Компилятор языка программирования Си

Разработана иерархия базовых узлов

10

AbstractNode

+ функция Dump(TextWriter& writer)+ функция Walk()

BinaryPolyNode

PolyNodeUnaryNode

BinaryNode

TernaryNode

Page 11: Компилятор языка программирования Си

Наследники UnaryNode

11

UnaryNode

StructOrUnionSpecifier

UnaryExpression ExternalDeclaration BlockItem

TypeSpecifierTypeQualifier

TypeQualifier TypeQualifier

Page 12: Компилятор языка программирования Си

Разработанные алгоритмы обфускации исходного кода

– Алгоритм скрытия констант

– Алгоритм замены переменных на указатели

– Алгоритм замены вызовов функций на вызовы через указатель

– Алгоритм скрытия прямых обращений к массивам по индексу

12

Page 13: Компилятор языка программирования Си

Алгоритм скрытия констант

Исходный код:

int queryID = j + 101;

Результат преобразований:

int a44 = 63;int a83 = 303;a83 = a83 + a44;a83 = a83 - 265;int queryID = j + a83;

13

Page 14: Компилятор языка программирования Си

Алгоритм замены переменных на указатели

Исходный код:

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

Page 15: Компилятор языка программирования Си

Алгоритм замены вызова функции на вызов через указатель

15

Поиск функции в таблице функций

Создание указателя на функцию соответствующего

типа

Инициализация указателя

Замена вызовов функции на вызов через указатель

Конец алгоритма

Начало алгоритма

нет (не найдено)

да (найдено)

Page 16: Компилятор языка программирования Си

Алгоритм скрытия прямых обращений к массиву по индексу

16

Поиск обращений к массиву по индексу

Создание новой переменной

Инициализация переменной адресом начала массива +

константа

Замена обращения к массиву на созданную переменную -

константа

Начало алгоритма

Конец алгоритма

нет (не найдено)

да (найдено)

Page 17: Компилятор языка программирования Си

Выводы

В результате проделанной работы были решены следующие вопросы

Определена актуальность решения проблемы обфускации кода Си с целью защиты ПО от реверс-инжиниринга

Проанализированы существующие решения. Найдены их недостатки

Выбрана модель древовидного построения сущностей СиРазработана программа-компилятор, реализующая

рассмотренные алгоритмы обфускацииПротестирована работа компилятора на типовых примерахВозможные направления развития: разложение циклов,

переплетение независимого кода

17