Гавриленко А.В., ассистент Козаченко А.А.

Государственное высшее учебное заведение «Национальный горный университет», Украина

Методика защиты от отладки исполнимого 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.