2009_d_2

advertisement
Дипломный проект
Компилятор языка
программирования Си
Работу выполнил:
Студент группы 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
Download