Блог → Защищаем программы с помощью антиотладочных средств

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

Взгляните на пример кода, предназначенного для блокировки клавиатуры пользователя:

.MODEL TINY
.CODE
org Oh
start:
push cs ; DS = CS
pop ds
mov al,00000010b ; блокирование клавиатуры
out 21h,al ; и вывод сообщения
mov ah,009h
mov dx,offset mes
int 21h
mov al, 0 ; разблокирование клавиатуры
out 21h,al
mov ax,4C00h ; завершение программы
int 21h
mes db "Пример блокировки-разблокировки клавиатуры $"
end start

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

Надо отметить, что при отладке этой программы при помощи Turbo Debugger, никаких изменений в его работе не произойдет, поскольку при каждом шаге отладки содержимое порта восстанавливается, а применение, например, AFDpro вызовет "мертвую" остановку на команде "out 21h, al" так, что даже горячая перезагрузка (с помощью клавишам Ctrl-Alt-Del) не будет выполнена.

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

Создание псевдопараллельного процесса основано на переопределении таймерного прерывания 08h или ICh на свою функцию, которая, вызываясь регулярно, может прерывать процесс работы и выполнять:
- затирание уже выполненых команд;
- преобразование кода программы "вперед";
- сканирование оперативной памяти с целью поиска и уничтожения (повреждения) отладочных программ.

Все рекомендованные меры желательно применять в комплексе, не ограничиваясь какой-либо одной из них. Только тогда результат будет хорошим и обойти антиотладочные средства будет трудно. На этом всё, сегодняшняя заметка, пожалуй, получилась немного короткой, но так уж вышло - мы на пороге новой темы, и не хотелось бы начинать её впопыхах. Если вам не совсем понятно что-то из прочитанного материала, не спешите - перечитайте снова, с самого начала, и уверен - всё обязательно станет на свои места. До новых встреч на страницах блога ITpool!