Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Тема 15 Методы защиты программ от изучения.




Для противодействия динамическому исследованию алгоритма работы системы защиты программного обеспечения от копирования с помощью отладчиков и программ мониторинга состояния вычислительной системы типа File Mon и RegMon прежде всего необходимо обнаружить присутствие в системе данных программ. Для этого могут применяться различные способы:

• использование функции из набора Windows API для перебора всех окон активных процессов

BOOL EnumWindows(WNDENUMPROC IpEnumFunc, LPARAM lParam); /* вызов функции IpEnumFunc с передачей ей параметра 1 Pa ram для всех окон верхнего уровня активных процессов */

• использование функции из набора Windows API для обнаружения факта запуска текущего процесса под отладчиком

BOOL IsDebuggerPresent(VOID);

• измерение времени выполнения критических для системы защиты участков кода (при работе под отладчиком это время будет существенно большим);

• проверка установки точек прерывания на функции из набора Windows API или функции системы защиты (первый байт кода функции в этом случае будет содержать значение ОхСС);

• изучение системного окружения с помощью функции из набора Windows API для получения значений возможно установленных отладчиком переменных среды

DWORD GetEnvironmentVariable(LPCTSTR lpName, LPTSTR lpBuffer, DWORD nSize); /* получение в буфере lpBuffer длины nSize значения переменной среды с именем lpName; при успешном завершении возвращается длина полученного значения */

При обнаружении факта работы защищаемой программы под управлением отладчика возможны следующие реакции системы защиты:

• искажение информации в стеке или вызов системной функции DestroyWindow для главного окна обнаруженного отладчика;

• некорректное взаимодействие с отладчиком по протоколам DDE (Dynamic Data Exchange, динамический обмен данными между процессами) или COM (Component Object Model, модель взаимодействия многокомпонентных объектов) для вывода отладчика из строя (передача «мусора» или преждевременный вызов метода Release);

• отключение средств защиты для скрытия их присутствия в защищаемой программе и «усыпления» бдительности нарушителя (работа средств защиты будет производиться только при использовании защищаемой программы без отладчика).

Для защиты от статического изучения алгоритма получения и проверки ключевой информации о среде запуска защищаемой программы с помощью дисассемблеров и декомпиляторов обычно применяется самомодифицирующийся код, что требует использования при разработке системы защиты языка ассемблера. Если это невозможно, то применяются методы «запутывающего» программирования (так называемой обфускации), направленные на максимальное усложнение понимания алгоритма работы системы защиты путем максимального «запутывания» ее кода.

Для усложнения понимания алгоритма преобразования полученной ключевой информации при ее проверке могут применяться следующие способы:

• использование асимметричного шифрования:

1) пользователь сообщает правообладателю персональные данные;

2) правообладатель шифрует их с помощью своего секретного ключа и возвращает пользователю вместе с программой и своим открытым ключом;

3) при запуске программы система защиты расшифровывает с помощью полученного открытого ключа данные пользователя и сравнивает их с введенными им данными;

• использование при проверке ключевой информации функции хеширования;

• использование нейронной сети обратного распространения, обученной на аппроксимацию функции преобразования ключевых данных;

• использование при преобразовании ключевых данных функции Р, являющейся суперпозицией функций Я, и #2, и аппроксимация в системе защиты функций Хх = Нх(Х) и Z2 = Я2_1(У), где X — введенные пользователем данные и У — значение ключа аутентификации (совпадение значений Хх и Z2 означает легальность среды запуска защищаемой программы).

Перечисленные способы основаны на особенностях квалификации потенциального нарушителя, который, как правило, хорошо знает системное программирование, но гораздо хуже — математику и криптографию. При использовании последнего из перечисленных способов защиты затрудняется и простой перебор ключей аутентификации при «снятии» системы защиты нарушителем.

Для защиты от изучения алгоритма работы фрагмента кода демонстрационных версий защищаемой программы, в котором происходит сравнение текущей даты с датой окончания использования демонстрационной версии, можно дополнительно сохранять дату установки программы или ее последнего запуска в реестре операционной системы в открытом или зашифрованном виде. Для невозможности модификации нарушителем кода системы защиты с целью обхода блока проверки ключевой информации применяется подсчет и проверка хеш-значений критически важных фрагментов кода.

Рассмотрим приемы «запутывающего» программирования, направленные на максимальное усложнение понимания алгоритма работы системы защиты. Эти приемы можно разделить на три группы — запутывание кода (лексические трансформации), запутывание структур данных и изменение потока выполнения программы.

Примеры приемов запутывания кода:

• добавление лишнего кода;

• использование управляемого событиями алгоритма проверки (разбиение ее на несколько частей);

• имитация проверки ключевых данных в различных местах программы;

• включение в состав системы защиты нескольких различных функций с одинаковым действием;

• при возможности проверка базы легальных пользователей защищаемого программного продукта по сети Интернет на узле правообладателя.

Примеры приемов запутывания структур данных:

• использование системных ресурсов (памяти окна приложения, атомов и т. п. ) для хранения проверяемых данных;

• создание в коде системы защиты нескольких различных переменных, получающих различные значения для обозначения одного и того же промежуточного результата проверки;

• использование косвенной адресации при доступе к переменным с проверочной информацией.

Примеры приемов изменения потока выполнения программы:

• нестандартная проверка (например, при получении правильных данных получается отрицательное контрольное значение, из которого извлекается квадратный корень, а сама проверка выносится в функцию обработки ошибок выполнения математических операций);

• вынесение процедур проверки в обработку стандартных сообщений Windows типа, например, WM_PAINT (подмена идентификатора сообщения может производиться непосредственно в цикле обработки сообщений).

Пример использования обфускации на уровне исходного кода (в данном случае на языке программирования 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 pricefi] * 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]; }

Помимо обфускации на уровне исходного кода может применяться запутывание на уровне машинного и промежуточного кода (например, на уровне байт-кода программ на языке Java). Использование программ-обфускаторов, помимо эффекта запутывания программы, может обеспечить и ее оптимизацию: в интерпретируемых языках программирования обфусцированный код занимает меньше места, чем исходный, и зачастую выполняется быстрее, чем исходный (обфускаторы заменяют константы числами, оптимизируют код инициализации массивов, и выполняют другую оптимизацию, которую на уровне исходного текста провести проблематично или невозможно).

К недостаткам применения обфускации следует отнести следующее:

• код программы после ее обфускации может стать более зависимым от программно-аппаратной платформы или компилятора;

• обфускатор не дает постороннему выяснить, что делает код, но и не дает разработчику отлаживать его, поэтому при отладке системы защиты приходится отключать обфускатор;

• ни один из существующих обфускаторов не гарантирует сложности декомпиляции и не обеспечивает безопасности, сопоставимой с уровнем современных криптографических алгоритмов;

• зачастую в обфускаторах, несмотря на их тщательное проектирование и тестирование, содержатся ошибки, поэтому существует ненулевая вероятность, что прошедший через обфускатор код потеряет работоспособность (чем сложнее разрабатываемая программа, тем больше эта вероятность);

• большинство языков с промежуточным кодом могут создавать или вызывать объекты по именам их классов, а обфус- каторы позволяют защитить указанные классы от переименования, однако подобные ограничения сокращают гибкость программ.

К наиболее надежным методам защиты от несанкционированного копирования программных продуктов относится использование специальных электронных ключей, присоединяемых к компьютеру пользователя с помощью ШВ-порта. Подобная программно-аппаратная система защиты работает следующим образом:

• приложение настраивается правообладателем на характеристики электронного ключа с помощью специального программного обеспечения;

• при работе защищаемой программы она обменивается с электронным ключом аутентифицирующей информацией, подтверждающей подлинность ключа;

• при отсутствии ключа или наличии у него иных характеристик защищаемое приложение не может быть использовано.

Для усложнения преодоления защиты разработчик системы защиты от копирования может использовать функции из набора функций прикладного программирования, экспортируемых электронным ключом (например, реализации криптографических алгоритмов, встроенные часы реального времени, лицензирование защищаемого продукта и оперативное обновление его системы защиты в удаленном режиме и т. д. ).

К недостаткам данного метода защиты от копирования относится удорожание стоимости для пользователя защищенной программы, что может оказаться неприемлемым для отдельных классов программных средств (например, игровых программ, учебных программ и т. п. ).

Повторим, что применение даже всей совокупности рассмотренных в настоящей главе методов и средств не позволит создать совершенную систему защиты от несанкционированного использования и копирования программ. Любая подобная система будет «снята», если нарушитель обладает неограниченными временными и материальными ресурсами.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...