Методы защиты программ от исследования
Для защиты программ от исследования необходимо применять методы защиты от исследования файла с исполняемым кодом программы, хранящемся на внешнем носителе, а также методы защиты исполняемого кода, загружаемого в оперативную память для выполнения этой программы.
В первом случае защита может быть основана на шифровании конфиденциальной части программы, а во втором - на блокировании доступа к исполняемому коду программы в оперативной памяти со стороны отладчиков [ЗШ]. Кроме того, перед завершением работы защищаемой программы должен обнуляться весь ее код в оперативной памяти. Это предотвратит возможность несанкционированного копирования из оперативной памяти дешифрованного исполняемого кода после выполнения защищаемой программы.
Таким образом, защищаемая от исследования программа должна включать следующие компоненты:
· инициализатор;
· зашифрованную конфиденциальную часть;
· деструктор (деициниализатор).
Инициализатор должен обеспечивать выполнение следующих функций:
· сохранение параметров операционной среды функционирования (векторов прерываний, содержимого регистров процессора и т.д.);
· запрет всех внутренних и внешних прерываний, обработка которых не может быть запротоколирована в защищаемой программе;
· загрузка в оперативную память и дешифрование кода конфиденциальной части программы;
· передача управления конфиденциальной части программы.
Конфиденциальная часть программы
предназначена для выполнения основных целевых функций программы и защищается шифрованием для предупреждения внесения в нее программной закладки.
Деструктор после выполнения конфиденциальной части программы должен выполнить следующие действия:
· обнуление конфиденциального кода программы в оперативной памяти;
· восстановление параметров операционной системы (векторов прерываний, содержимого регистров процессора и т.д.), которые были установлены до запрета неконтролируемых прерываний;
· выполнение операций, которые невозможно было выполнить при запрете неконтролируемых прерываний;
· освобождение всех незадействованных ресурсов компьютера и завершение работы программы.
Для большей надежности инициализатор может быть частично зашифрован и по мере выполнения может дешифровать сам себя. Дешифроваться по мере выполнения может и конфиденциальная часть программы. Такое дешифрование называется динамическим дешифрованием исполняемого кода. В этом случае очередные участки программ перед непосредственным исполнением расшифровываются, а после исполнения сразу уничтожаются.
Для повышения эффективности защиты программ от исследования необходимо внесение в программу дополнительных функций безопасности, направленных на защиту от трассировки. К таким функциям можно отнести:
· периодический подсчет контрольной суммы области оперативной памяти, занимаемой защищаемым исходным кодом; сравнение текущей контрольной суммы с предварительно сформированной эталонной и принятие необходимых мер в случае несовпадения;
· проверку количества занимаемой защищаемой программой оперативной памяти;
· сравнение с объемом, к которому программа адаптирована, и принятие необходимых мер в случае несоответствия;
· контроль времени выполнения отдельных частей программы;
· блокировку клавиатуры на время отработки особо критичных алгоритмов.
Для защиты программ от исследования с помощью дизассемблеров можно использовать и такой способ, как усложнение структуры самой программы с целью запутывания злоумышленника, который дизассемблирует эту программу. Например, можно использовать разные сегменты адреса для обращения к одной и той же области памяти. В этом случае злоумышленнику будет трудно догадаться, что на самом деле программа работает с одной и той же областью памяти.