Similar presentations:
Защита программного обеспечения
1.
Защита программного обеспеченияПодготовили студенты 211 – 723 группы
Исаичкин Иван Сергеевич
Гордеев Дмитрий Алексеевич
2.
ВведениеСегодня мы обсудим актуальные методы защиты программного
обеспечения, написанного на компилируемом языке программирования.
Многие программы, требующие наличие лицензии подвергаются
попыткам взлома, большинство из них имеют пиратские аналоги. Мы
рассмотрим какие методы следует использовать для усложнения процесса
реверс инженеринга злоумышленника.
2
3.
Одна из проблем современных разработчиковПиратство программного обеспечения является одной из основных проблем для
разработчиков. Для защиты ПО от незаконного распространения недостаточно
лицензии, необходимо защитить программу от обратного инжиниринга. Существуют
сотни способов защиты программы, однако все они также имеют свой обход.
Предположим, что мы хотим написать проприетарную программу на компилируемом
языке С++ под операционную систему Windows, мы её лицензируем и будем продавать
копии. Рассмотрим, как же нам необходимо поступить, чтобы единственным способом
получения нашего ПО – была покупка его лицензии у разработчика.
3
4.
Проверка лицензииРазработанное на С++ ПО будет собрано в
исполняемый файл, который и будет
продаваться конечному пользователю. Во
избежание его дальнейшего незаконного
распространения в первую очередь
необходимо встроить протектор.
Оптимально, чтобы та часть кода
занимающаяся проверкой лицензии
запускалась через интернет. В таком случае
если пользователь передаст купленную
программу другому человеку, лицензия не
будет обнаружена, не званному гостю будет
предложено приобрести ПО.
Протектор - это часть кода, отвечающая за проверку лицензии.
4
5.
Протектора недостаточно?Однако следует понимать, что программа находится вместе с протектором на
компьютере у пользователя. Это значит, что у человека владеющим
отладчиком и умеющим редактировать ассемблерный код не возникнет
никаких проблем с взломом проверки лицензирования. Декомпиляция
исходника/ассемблерного с++ кода не представляется возможным, однако
информацию о текстовом представлении машинного кода возможно
заполучить путем дизассемблирования.
5
6.
Защита от дизассемблированияПеречислим современные методы защиты от взлома:
- Создание зависимостей между протектором и кодом
- Мутация нативного кода
- Виртуализация нативного кода
Нативный код - код, компилируемый в машинные инструкции и выполняемый напрямую
процессором устройства.
6
7.
Создание зависимостей между протектором и кодомПосле написания проверки на
лицензию злоумышленнику
достаточно просто удалить ее из
нашего кода и получить версию ПО
работающего без протектора. Одним
из решений является создание
зависимостей между протектором и
функциональной частью, необходимо,
например, инциализировать важные
значения в коде, который отвечает за
проверку лицензии. При этом
значения будут зависеть от
лицензионного ключа или будут
получены через интернет при
проверке лицензии. Теперь удаление
протектора приведет к неправильной
работе программы.
7
8.
Мутация нативного кодаОбфускация (мутация) кода защищает ассемблерный код от анализа. Во время
обфускации происходит изменение кода с сохранением исходного алгоритма.
Для этого процесса используют специальные программы - обфускаторы. Для
сохранения принципов работы программы рекомендуется мутировать только
протектор. Данное действие не сильно повлияет на производительность
программы, однако ощутимо усилит безопасность. Для большей безопасности
можно обфусцировать уже мутированный код протектора повторно.
8
9.
Виртуализация нативного кодаБолее надежной альтернативой мутации является виртуализация.
При виртуализации мы исполняем наш код не напрямую на
процессоре, а имеем уникальную виртуальную машину,
исполняющую защищенный участок кода. Для этого необходимо
привести навороченныю защиту для софта, приведу в пример
Тимиду, данная система обладает внушительным функционалом,
в ней содержится: антиотладчик, антидампер, обфускация точки
входа и много других полезных фич. Принцип работы
виртуализации следующий: наш нативный код протектора
транслируется в байткод и для него создается уникальная
виртуальная машина. Пользователь получает виртуальную
машину с байткодом внутри. При запуске программы
пользователем, протектор запускается через виртуальную
машину. Данный метод значительно снижает
производительность, но поскольку протектор - это малая часть
кода, то общее снижение не ощутимо.
9
10.
Подведем итоги10