Гавриленко А.В., ассистент Козаченко А.А.
Государственное высшее учебное заведение «Национальный
горный университет», Украина
Методика защиты от отладки исполнимого JAVA-кода
Большое количество разработчиков программного обеспечения,
которое пользуется спросом на рынке, защищают его всего лишь стандартной процедурой
аутентификации пользователя. Но уже через некоторое время в глобальной сети
появляются множества программ, написанных с целью снятия защиты данного
программного продукта. Чтобы обезопасить себя от такой ситуации нужно
предусмотреть защиту от отладки и дизассемблирования ваших программных
продуктов. В данной статье будет рассмотрена именно методика защиты от отладки
исполнимого JAVA-кода.
В начале
хотелось бы рассмотреть места программы где чаще всего происходит ее взлом.
После запуска программы пользователь отправляет в нее своё имя и
регистрационный ключ. С этими данными происходят преобразования для
формирования корректного регистрационного ключа для данного пользователя, в
конце этой функции происходит сравнение соответствия регистрационного ключа
пользователя только что сгенерированному ключу, если да функция вернет 1, нет –
0.
Именно такие
уязвимые места обнаруживаются при помощи отладчика. Далее взломщики используют hex-редакторы
для «исправления» кода с целью запуска программного продукта без
регистрационного ключа.
Первым и
самым простым способом защиты от отладчика – это использование функции IsDebuggerPresent,
представленной разработчиками Windows. Данная функция не имеет параметров. В качестве
результата она возвращает 1, если отладчик обнаружен и 0 в противном случае.
Пример
использования такой функции:
if (!IsDebuggerPresent()) goto no_debugger
//........................................
no_debugger:
Данной функцией можно воспользоваться, чтобы при отладке не
происходило успешной регистрации. Любой опытный взломщик может определить, что
это за функция по ее имени и обойти эту защиту. Для решения этой проблемы нужно
покопаться в содержимом этой функции. Она состоит всего из 4, идущих ниже,
ассемблерных инструкций:
mov eax,fs:[018h]
mov eax,[eax+30h]
movzx eax,byte ptr [eax+02]
ret
Для нас имеют интерес только первые три инструкции. С их
помощью можно построить свою функцию, аналогичную IsDebuggerPresent.
Данную
функцию нужно скомпоновать в виде динамической библиотеки, чтобы использовать
для защиты от отладки исполнимого JAVA-кода. Для вызова функции будет
использоваться JNI (Java Native
Interface). JNI - стандартный механизм для запуска кода,
под управлением виртуальной машины Java (JVM), который написан на языках С/С++
или Ассемблера.
Теперь при правильном использовании нашей функции даже при
вводе правильного имени пользователя и регистрационного ключа в контексте
отладчика, программа будет сообщать что он не верен.
Еще один способ обнаружения отладчика - замер времени
выполнения частей программы. При работе под отладчиком время выполнения
значительно больше. Это связанно с тем, что при работе программы под управлением
отладчика производятся дополнительные действия, такие как нажатие клавиш на
клавиатуре для активизации некоторых действий отладчика. Замер времени лучше
производить обращаясь непосредственно через порты к таймеру или используя часы
реального времени. [1]
Так же
относительной защитой вашей программы могут быть добавления множества ложных
переходов и вложенных функций. Такая техника позволяет усложнить задачу
злоумышленника.
Все данные
возможности защиты от отладчиков, по-прежнему, бессильны перед хорошим
дизассемблером. Для защиты от дизассемблера чаще всего применяется два приёма.
Первый - это так называемый перекрывающийся код, а второй - полное шифрование
кода. Поэтому, для построения эффективной методики защиты нужно использовать
комплекс мероприятий, таких как:
1) проверка на наличие
отладчика в системе;
2) использование
перекрывающего кода;
3) полное шифрование кода.
Литература:
1. Защита от отладчиков.
Режим доступа: http://www.xakep.ru/post/17493/
default.asp.