Способы защиты программ от исследования
Способы защиты от исследования можно разделить на четыре класса [ПАС].
1. Способ, сущность которого заключается в оказании влияния на процесс функционирования отладочного средства через общие программные или аппаратные ресурсы. В данном случае наиболее известны:
· использование аппаратных особенностей микропроцессора (особенности очередности выборки команд, особенности выполнения команд и т.д.);
· использование общего программного ресурса (например, общего стека) и разрушение данных или кода отладчика, принадлежащих общему ресурсу, либо проверка использования общего ресурса только защищаемой программой (например, определение стека в области, критичной для выполнения защищаемой программы);
· переадресация обработчиков отладочных событий (прерываний) от отладочного средства к защищаемой программе.
Выделение трех групп защитных действий в данном классе не случайно, поскольку объективно существуют общие аппаратные ресурсы отладчика, и защищаемая программа в случае однопроцессорного вычислителя выполняются на одном и том же процессоре), общие программные ресурсы (поскольку и отладчик, и защищаемая программа выполняются в одной и той же операционной среде), наконец, отладчик создает специфичные ресурсы, существенные для его собственной работы (например адресует себе отладочные прерывания).
2. Влияние на работу отладочного средства путем использован~ особенностей его аппаратной или программной среды. Например:
· перемещения фрагментов кода или данных с помощью контроллер прямого доступа к памяти;
· влияния на процесс регенерации оперативной памяти (на некотором участке кода регенерация памяти отключается, а затем опять включается, - при нормальной работе никаких изменений нет, при медленном выполнении программы отладчиком она «зависает»);
· перехода микропроцессора в защищенный режим.
3. Влияние на работу отладчика через органы управления или/и устройства отображения информации.
Выдаваемая отладочными средствами информация анализируется человеком. Следовательно, дополнительный способ защиты от отладки это нарушение процесса общения оператора и отладчика, а именно искажение или блокирование вводимой с клавиатуры и выводимой на терминал информации.
4. Использование принципиальных особенностей работы управляемого человеком отладчика. В данном случае защита от исследования состоит в навязывании для анализа избыточно большого объема кода (как правило, за счет циклического исполнения некоторого его участка).
Рассмотрим данный метод подробнее. Пусть имеется некоторое полноцикловое преобразование из N состояний t: Т=t1,t2,...,tN (Например, обычный двоичный счетчик либо, рекуррента). Значение N
выбирается не слишком большим. Например, для k-битового счетчика N=2k. Участок кода, защищаемый от изучения, динамически преобразуется (шифруется) с использованием криптографически стойкого алгоритма на ключе t, который выбирается случайно и равновероятно из множества состояний Т.
Работа механизма защиты от исследования выглядит следующим образом. Программа полноциклового преобразования начинает работу с детерминированного или случайного значения. На установленном значении производится дешифрование зашифрованного участка кода. Правильность дешифрования проверяется подсчетом значения хэш-кода расшифрованного участка программного кода с использованием элементов, связанных с отладкой (стек, отладочные прерывания и др.). Хэш-функция должна с вероятностью 1 определять правильность дешифрования (для этого значение хэш-кода должно быть не менее k).
Предположим, что полноцикловое преобразование стартует с первого значения. Тогда при нормальном выполнении программы (скорость работы высокая) будет совершено i циклов алгоритма, после чего защищенный участок будет корректно исполнен. При работе отладчика, управляемого человеком, скорость выполнения программы на несколько порядков ниже, поэтому для достижения необходимого значения 1 будет затрачено значительное время.
Для численной оценки данного метода введем следующие значения. Предположим, что i в среднем равно N/2. Пусть w0 - время выполнения цикла алгоритма (установка текущего значения, дешифрование, проверка правильности дешифрования) в штатном режиме функционирования (без отладки); w1
- время выполнения того же цикла в режиме отладки; z —предельное время задержки при штатной работе защищенной программы. Тогда N=z/w0. Затраты времени злоумышленника исчисляются средней величиной Тзл=Nw1/2. Для приблизительных расчетов w1/w0»10000.
В ряде способов защиты от отладки идентификация отладчика и направление его по ложному пути происходят одновременно, в одном и том же фрагменте кода (так, при определении стека в области кода защищаемой программы при работе отладчика, использующего тот же стек, код программы будет разрушен). В других случаях ложный путь в работе программы формируется искусственно. Часто для этого используют динамическое преобразование программы (шифрование) во время ее исполнения.
Способ динамического преобразования заключается в следующем: первоначально в оперативную память загружается фрагмент кода, содержание части команд которого не соответствует тем командам, которые данный фрагмент в действительности выполняет; затем этот фрагмент по некоторому закону преобразуется, превращаясь в исполняемые команды, которые затем и выполняются.
Преобразование кода программы во время ее выполнения может преследовать три основные цели:
· противодействие файловому дизассемблированию программы;
· противодействие работе отладчику;
· противодействие считыванию кода программы в файл из оперативной памяти.
Перечислим основные способы организации преобразования кода программы [ПАС]:
1. Замещение фрагмента кода функцией от находящейся на данном месте команды и некоторых данных.
2. Определение стека в области кода и перемещение фрагментов кода с использованием стековых команд.
3. Преобразование кода в зависимости от содержания предыдущего фрагмента кода или некоторых условий, полученных при работе предыдущего фрагмента.
4. Преобразование кода в зависимости от (внешней к программе) информации.
5. Преобразование кода, совмещенное с действиями, характерными для работы отладочных средств.
Первый способ заключается в том, что по некоторому адресу в коде программы располагается, например, побитовая разность между реальными командами программы и некоторой хаотической информацией, которая располагается в области данных. Непосредственно перед выполнением данного участка программы происходит суммирование хаотической информации с содержанием области кода и в ней образуются реальные команды.
Второй способ состоит в перемещении фрагментов кода программы в определенное место или наложении их на уже выполненные команды при помощи стековых операций.
Третий способ служит для защиты от модификаций кода программы и определения точек останова в программе. Он состоит в том, что преобразование следующего фрагмента кода происходит на основе функции, существенно зависящей от каждого байта или слова предыдущего фрагмента или нескольких фрагментов кода программы. Такую функцию называют обычно контрольной суммой участка кода программы. Особенности данного способа является то, что процесс преобразования должен соответственно зависеть от посчитанной контрольной суммы (подсчитанного значения хэш-кода) и должен содержать в явном виде операций сравнения.
Четвертый способ заключается в преобразовании кода программы на основе некоторой внешней информации, например считанной с ключевой дискеты некопируемой метки, машинно-зависимой информации или ключа пользователя. Это позволит исключить анализ программы, не имеющего ключевого носителя или размещенной на другом компьютере, где машино-зависимая информация иная.
Пятый способ состоит в том, что вместо адресов отладочных прерываний помещается ссылка на процедуру преобразования кода программы.
При этом либо блокируется работа отладчика, либо неверно преобразуется в исполняемые команды код программы.
Важной задачей защиты программ от исследований является защита от трассировки программы по заданному событию (своего рода выборочное исследование). В качестве защиты от трассировки по заданному событию (прерыванию) можно выделить три основных способов.
1. Пассивная защита - запрещение работы при переопределении обработчиков событий относительно заранее известного адреса.
2. Активная защита первого типа - замыкание цепочек обработки событий минуя программы трассировки.
3. Активная защита второго типа - программирование функций, исполняемых обработчиками событий, другими способами, не связанными вызовом штатных обработчиков или обработчиков событий, которые текущий момент не трассируются.
Например, для защиты от трассировки по дисковым прерываниям для ОС MS DOS при чтении некопируемой метки с дискеты или винчестера можно использовать следующие приемы:
· работа с ключевой меткой путем прямого программирования контроллера гибкого диска (активная защита второго типа);
· определение одного из неиспользуемых прерываний для работы с диском (активная защита первого типа);
· прямой вызов соответствующих функций в ПЗУ (BIOS) после восстановления различными способами их физического адреса (активная защита первого типа);
· определение факта переопределения адреса прерывания на другую программу и невыполнение в этом случае дисковых операций (пассивная защита).
При операциях с жестким диском, как правило, используется прерывание int 13h. Для предотвращения трассировки программы по заданному прерыванию (в данном случае прерыванию int 13h) можно также использовать указанные выше способы, а именно:
· переопределение исходного прерывания в BIOS на неиспользуемый вектор прерывания;
· прямой вызов функций BIOS.
При опасности трассировки по событиям операционной среды могут быть выделены следующие действия программ:
· определение факта замены обработчиков событий на собственные функции (в частности, для защиты от отладчиков);
· файловые операции, связанные со считываниями различных счетчиков или паролей, вычисление контрольных сумм и значений хэш-кодов;
· файловые операции, связанные со считыванием заголовков и другой существенно важной информации в исполняемых файлах или загружаемых библиотеках.