- •ЛЕКЦИЯ 15. ЗАЩИТА ОТ
- •Содержание лекции
- •Система защиты от
- •Надежность системы
- •Принципы создания системы
- •Принципы создания системы защиты от копирования
- •Условия распространения
- •Условия распространения
- •Особенности программных продуктов
- •Особенности пользователей
- •Особенности
- •Универсальные и
- •Требования к системе
- •Типовая структура системы
- •Реализация блока проверки ключевой информации
- •Реализация блока проверки
- •Реализация блока проверки
- •Защита инсталляционных
- •Основные приемы
- •Особенности файловой
- •Способы нанесение
- •Способы нанесение программной метки на CD
- •Способы нанесение программной метки на CD
- •Нанесение физической
- •Преодоление защиты,
- •Защита от копирования
- •Установка защищенного программного продукта
- •Характеристики компьютера
- •Характеристики компьютера и
- •Проверка ключевой информации
- •Защита программных
- •Методы «снятия» защиты
- •Противодействие
- •программы под управлением
- •Реакция на обнаружение
- •Противодействие
- •Методы запутывающего кодирования
- •Запутывание кода
- •Запутывание кода
- •Запутывание кода
- •Запутывание структур
- •Изменение потока выполнения программы
- •Виды обфускации
- •уровне исходного кода на
- •Достоинства программ-
- •Недостатки обфускаторов
- •Недостатки обфускаторов
Запутывание структур
данных
1.Использование системных ресурсов (памяти окна, атомов и т.п.) для хранения данных, используемых при проверке ключевой информации.
2.Создание нескольких различных переменных с разными значениями для представления одного и того же результата.
3.Использование косвенной адресации для доступа к переменным, участвующим в процессе проверки.
Изменение потока выполнения программы
1.Вынесение проверки ключевой информации в обработчик исключительной ситуации (например, ввод правильных данных приводит к извлечению корня квадратного из отрицательного числа, а сравнение с эталоном производится при обработке математической ошибки).
2.Вынесение проверки в обработку сообщений типа WM_PAINT (подмена кодов сообщений может выполняться непосредственно в цикле обработки сообщений).
Виды обфускации
•на уровне исходного кода;
•на уровне машинного кода;
•на уровне промежуточного кода (например, на уровне байт-кода программ на языке Java).
уровне исходного кода на
языке C++
int nCount = 100;
float fTaxRate = 0.2, orig_price[1000], tax[1000], price [1000];
for (int i=0; i< nCount; i++)
{
tax[i] = orig_price[i] * fTaxRate; price[i] = orig_price[i] + tax[i];
}
• Код после обфускации: float b[1000], c[1000], d[1000];
for(int a=0;a<100;a++){b[a]=c[a]*0.2;d[a]=c[a] +b[a];}
Достоинства программ-
обфускаторов
Помимо эффекта запутывания программы могут обеспечить и ее оптимизацию: в интерпретируемых языках программирования обфусцированный код занимает меньше места, чем исходный, и зачастую выполняется быстрее, чем исходный (обфускаторы заменяют константы числами, оптимизируют код инициализации массивов, и выполняют другую оптимизацию, которую на уровне исходного текста провести проблематично или невозможно).
Недостатки обфускаторов
•код программы после ее обфускации может стать более зависимым от программно- аппаратной платформы или компилятора;
•обфускатор не даёт постороннему выяснить, что делает код, но и не даёт разработчику отлаживать его, поэтому при отладке системы защиты приходится отключать обфускатор;
•ни один из существующих обфускаторов не гарантирует сложности декомпиляции и не обеспечивает безопасности, сопоставимой с уровнем современных криптографических алгоритмов;
Недостатки обфускаторов
•зачастую в обфускаторах, несмотря на их тщательное проектирование и тестирование, содержатся ошибки, поэтому существует ненулевая вероятность, что прошедший через обфускатор код потеряет работоспособность (чем сложнее разрабатываемая программа, тем больше эта вероятность);
•большинство языков с промежуточным кодом могут создавать или вызывать объекты по именам их классов, а обфускаторы позволяют защитить указанные классы от переименования, однако подобные ограничения сокращают гибкость программ.