Назад в библиотеку

Применение комбинированных защит исполняемого кода

Автор:Зыков В.В.
Источник: Электронный журнал «ИССЛЕДОВАНО В РОССИИ» http://zhurnal.ape.relarn.ru/articles/2004/246.pdf

Источник: Применение комбинированных защит исполняемого кода

Липецкий государственный технический университет

Введение

В настоящее время можно выделить несколько областей применения защит исполняемого кода. Это защита от копирования, где блоки безопасности исполняемого кода входят в состав более сложной структуры, а так же защита отдельных фрагментов программного кода от изучения. Исследование причин уязвимости данных систем показывает недостаточную защищённость программных блоков контроля легальности запускаемых копий и блоков противодействия основным инструментам отладки и анализа, то есть соответствующие фрагменты исполняемого кода легко доступны для модификации.

Ещё одна сфера применения — это защита программ, распространяемых по сети Internet, в которых существуют два пути возможной работы: бесплатная ограниченная версия и платная полнофункциональная. Существующие системы контроля легальности пути исполнения кода следует признать малоэффективными [1,2,3].

В предлагаемой статье рассматривается схема комбинированной защиты исполняемого кода, построенная на основе принципов динамического шифрования. Так же рассматривается возможность расширения данной схемы для решения задач ограничения программной функциональности.

Модель функционирования

Определим наиболее важные характеристики модели функционирования защиты. Итак, защита исполняемого кода должна:

— быть комбинированной, то есть иметь черты прекомпилируемых (устанавливаемых до компиляции) и посткомпилируемых (после компиляции) защит;

— соответствовать принципам систем динамического шифрования;

— не вызывать затруднений при установке (имеется в виду, ситуация, когда разработчик программы вынужден переделывать структуру программы из–за её конфликта с защитным комплексом).

Представим приближённую схему подобной защиты в виде структурной схемы с рис. 1.

Комбинированная защита

Рис. 1. Комбинированная защита

Воспользуемся понятием метки, под которым будем понимать фрагмент кода, неотличимый от исполняемых кодов программы, но ими не являющийся, и позволяющий однозначно выделять нуждающиеся в защите блоки.

Зададим конечный автомат B = (SB, XB, YB, SOB, δOB,λB), где SB — конечное непустое множество состояний; XB — конечное непустоемножество входных сигналов, которыми служат программные команды; YB — конечное непустое множество выходных сигналов, которыми служат действия над программным кодом; SOBSB — начальное состояние; δB:SB×XBSB — функция переходов; λB:i>SBxXBSB — функция выходов [4]. Граф конечного автомата представлен на рис. 2.

Модель функционирования защиты с использованием меток.title=

Рис. 2. Модель функционирования защиты с использованием меток.

Рис. 2. Модель функционирования защиты с использованием меток: X1B – программный код; <X2B – метка; X3B – зашифрованный код; Y1B – выполнение кода; Y2B – переставить фокус на шифрованный фрагмент; Y3B – дешифровать код; Y4B – переставить фокус на начало кода; Y5B – зашифровать код.

Конечный автомат B = B = (SB, XB, YB, SOB, δOB,λB) обладает памятью на четыре состояния и описывает простейший вариант функционирования защиты фрагмента исполняемого кода.

Рассмотрим для него описание одного прохода.

S0B. Это начальное состояние, в котором находится процесс, пока не будет найдена метка начала защищённого блока;

S1B. В это состояние процесс переходит в случае, когда в состоянии S0B была обнаружена метка начала защищённого блока, и остаётся в нём до тех пор, пока не будет найден указатель на окончание защищённого блока;

S2B. Это состояние соответствует этапу исполнения дешифрованного кода. По сути, это возврат в состояние S0A, но с рядом существенных оговорок по подготовке кода к исполнению. В нём осуществляется последовательное исполнение кодов до той поры, пока не будет найден конец защищённого блока;

S3B. В этом состоянии процесс осуществляет обратную шифрацию фрагмента до момента нахождения метки, после чего происходит возврат в состояние S0A.

Характерной особенностью предлагаемой на рис. 2 модели, следует считать ориентированность на работу с фрагментом кода как объектом защиты, а не с целой функцией или процедурой. В результате дальнейшего анализа конечно–автоматной модели в работе можно сделать вывод о наличии неиспользуемого резерва в состоянии S2B, который предлагается использовать для усложнения структуры защиты.

Двухфазные и двухуровневые модели

При необходимости реализации вложенной защиты, когда защищаемый фрагмент также содержит в себе ряд фрагментов (возможно, с использованием иных алгоритмов шифрования), требуется построить конечный автомат C=(SC, XC, YC, SOC, δOC,λC), граф которого представлен на рис. 3.

Представленная двухуровневая модель и схожие с ней по типу многоуровневые системы относятся к одной группе востребованных защит, ко второй же группе можно отнести двухфазные или многофазные системы [5]. Под фазой следует понимать строго определённую систему шифрования и дешифрования кода, используемую для защиты того или иного фрагмента и расположенной в пределах одного уровня. Соответственно, двухфазная система представлена реализацией двух различных схем шифрования и описывается конечным автоматом D=(SD, XD, YD, SOD, δOD,λD) с рис. 4.

Двухуровневая модель функционирования защиты>

Рис. 3. Двухуровневая модель функционирования защиты.

Рис. 3. Двухуровневая модель функционирования защиты: x1C– программный код; x2C, <x′′2C – метки; x3C – зашифрованный код; y1C – выполнение кода; y2C – переставить фокус на шифрованный фрагмент; y3C – дешифровать код; y4C – переставить фокус на начало кода; y5C – зашифровать код; y6C – дешифровать код (второй алгоритм); y7C – зашифровать код (второй алгоритм).

Двухфазная модель функционирования защиты>

Рис. 4. Двухфазная модель функционирования защиты.

Рис. 4. Двухфазная модель функционирования защиты: <x1D– программный код; ; x2D, <x′′2D – метки; x3D – зашифрованный код; y1D – выполнение кода; y2D – переставить фокус на шифрованный фрагмент; y3D – дешифровать код;; y4D –переставить фокус на начало кода; y5D – зашифровать код; y6D – дешифровать код (алгоритм второй фазы); y7D – зашифровать код (алгоритм второй фазы)

Утверждается, что конечные автоматы двухфазных и двухуровневых моделей (как, впрочем, и N–фазных и N–уровневых моделей) функционально эквивалентны друг другу.

Особенности применения моделей

Предлагаемые два типа моделей, как усложнённые варианты комбинированной модели, отличаются друг от друга не только структурно, но и с точки зрения применимости. Так, многоуровневые модели отличаются высокой ресурсоёмкостью, что в не малой степени обусловлено аппаратными особенностями функционирования современных компьютеров. Действительно, если рассмотреть в качестве примера двухуровневую модель, то мы получим, что, условно говоря, внутренний уровень имеет некоторые черты треда (в той его части, что касается использования памяти) [6].

Если рассматривать внешний уровень как некий процесс с отведённым под него адресным пространством, то внутренний уровень ограничен именно размерами этого адресного пространства (или памяти). И чем больше вложений в каждый уровень, то тем больше свободной памяти требуется (см. рис. 5).

Использование адресного пространства в двух и более уровневых  title=

Рис. 5. Использование адресного пространства в двух и более уровневых моделях.

Соответственно, серьёзное увеличение числа уровней модели вступает в конфликт с необходимым правилом минимизации увеличения системных требований защищаемого программного продукта.

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

Использование адресного пространства в двух и более
фазных моделях

Рис. 6. Использование адресного пространства в двух и более фазных моделях.

В случае комбинирования предлагаемых моделей ситуация существенно усложняется и анализу подлежит каждый конкретный случай.

Практическая реализация

При рассмотрении модели с рис. 2 становится очевидным, что приводимые там метки, служащие для выделения обрабатываемых фрагментов кода, столь же необходимы и в программной реализации. Общий смысл технологии применения меток раскрывает рис. 7.

В первом случае метки выделяются безусловными переходами, что обеспечивает корректное функционирование программы. Во втором же случае во избежание ошибок выполнения после шифрования исполняемого кода происходит замена коротких переходов на один длинный.

Каждая метка представляет собой n–байтное шестнадцатеричное значение. Экспериментально было установлено, что достаточно 8–12 байтов для задания уникальной метки.

Принцип работы меток: A) состояние защищённого
фрагмента на этапе проектирования защиты; B) состояние защищённого
фрагмента после установки защиты

Рис. 7. Принцип работы меток: A) состояние защищённого фрагмента на этапе проектирования защиты; B) состояние защищённого фрагмента после установки защиты.

Принцип работы программного генератора комбинированной защиты следующий:

1. В виде отдельных модулей генерируются блоки кода, отвечающие за шифрование и дешифрование.

2. Разработчик защищаемой программы устанавливает вызовы функций защиты и метки, исходя из соображений безопасности программы.

3. Модифицированный код поступает на вход программного генератора, где происходит окончательная обработка и вызов компилятора языка программирования.

4. Исполняемый код обрабатывается генератором на предмет шифрования необходимых фрагментов.

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

Собственно, алгоритм, отвечающий за полноценное функционирование конечно–автоматной модели защиты с рис. 2 представлен на рис. 8.

Алгоритм работы защиты фрагмента кода

Рис. 8. Алгоритм работы защиты фрагмента кода.

Ограничение программной функциональности

В случае необходимости распространения программного комплекса, непосредственно по сети или на носителях покупателя, минуя запись на диск производителем (распространителем), возникает проблема ограничения программной функциональности. Под ограничением функциональности таких систем понимается защита легитимного пути исполнения программного кода от недобросовестных пользователей, которых не устраивает бесплатная урезанная версия, внутри той же самой программы.

Поставленная задача сильно усложняется сильным программным разбросом фрагментов легитимного пути, что делает невозможным их группировку в отдельные функции.

На рис. 9. представлена схема алгоритма ограничения функциональности программы, реализованного на основе предложенной ранее модели защиты исполняемого кода. Данный способ защиты легитимного пути выполнения программы, позволяет задавать в рамках одной программной системы несколько вариантов ее исполнения и ставит в зависимость надёжность защиты только от использованной системы шифрования.

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

Непосредственно перед началом работы программы по одному из путей исполнения требуется разместить блок контроля наличия кода активации. В случае отсутствия ввода программа исполняется по обычному ограниченному пути, в случае же, когда ввод был произведён,требуется провести дешифрацию защищённых фрагментов и проверить её успешность. В случае возникновения каких–либо ошибок происходит переход к работе по пути с ограниченной функциональностью. Рис.

Защита легитимного пути работы программы анализа
газетных материалов от несанкционированного исполнения

Рис. 9. Защита легитимного пути работы программы анализа газетных материалов от несанкционированного исполнения.

Для осуществления проверки корректности дешифрации достаточно проверить наличие по определённому адресу в расшифрованном блоке заданной последовательности байт. На безопасности шифра это не скажется в силу невозможности восстановления ключа по отдельному блоку открытого кода.

Список использованной литературы

  1. Зыков В.В. Методы защиты программ от копирования и перспективность их применения //Современные проблемы информатизации в технике и технологиях: сб. трудов. Вып. 7. – Воронеж: ЦЧКИ, 2003. с. 55–56.
  2. Зыков В.В. Обзор программных защит и выделение слабых мест // Сб. научных трудов молодых учёных, посвящённый 30–летию НИС ЛГТУ, Липецк, 2003. с. 20–22.
  3. Зыков В.В. Критерии качества защиты программного обеспечения // Современные проблемы информатизации в системах моделирования, программирования и телекоммуникациях: Сб. трудов. Вып. 9. – Воронеж: Изд. «Научная книга», 2004. с. 356–357.
  4. Карпов Ю.Г. Теория автоматов. СПб.: Питер, 2002.
  5. Серебряков В.А. Теория и реализация языков программирования./ В.А. Серебряков, М.П. Галочкин, Д.Р. Гончар. – М.: МЗ–Пресс, 2003.
  6. Орлов С.А. Технологии разработки программного обеспечения. СПб.: Питер, 2002.