Современные информационные технологии/ 4. Информационная безопасность

 

Старший преподаватель Сатмаганбетова  Ж. З.

 

Костанайский государственный университет им. А.Байтурсынова, Казахстан

 

ЗАЩИТА ПРОГРАММНОГО КОДА ОТ МОДИФИКАЦИИ

 

      

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

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

      В связи с этим необходимость исследования во­просов безопасности программного обеспечения обуславливается прямой за­висимостью эффективности функционирования информационных систем от качества и безопасности используемого программного обеспечения

       На сегодняшний день существует множество различных вариантов защиты и множество программ обеспечивающих эту защиту. Развитие систем защит носит динамический характер, к любой системе защиты со временем подбирается «отмычка». Абсолютно надёжной системы не существует, поэтому необходимо искать оптимальное соотношение затрат на разработку системы защиты и прогнозируемых затрат на её обход, учитывая также ценовое соотношение с самим защищаемым ПО. При разработке системы защиты важно правильно подобрать метод, на котором будет основана система защиты.

Среди всех существующих средств защиты ПО от несанкционированного копирования и распространения можно выделить три класса:

1.      Защита компакт диска от копирования,

2.      Необходимость регистрации ПО для получения ключа активации,

3.      Защита программного кода от модификации.

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

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

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

Из всего вышесказанного следует несколько выводов:

·     Защита должна «встраиваться» в программу, а не «навешиваться» на нее впоследствии (защита должна продумываться на этапе проектирования, и подготовительные операции по её включению должны производиться на этапе кодирования ПО).

·     В любой момент времени в памяти не должен находиться полностью расшифрованный и работоспособный программный код.

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

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

·     Разработчик должен сам указывать, какие участки кода и когда необходимо зашифровать/расшифровать, и где должна выполняться проверка целостности (автоматизировать данный процесс невозможно, так как только сам разработчик знает, какие участки кода нуждаются в защите больше всего, и как лучше распределить функции проверок, что бы они выполнялись в течении всего цикла работы программы)

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

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

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

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

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

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

Литература

1 П.Ю. Белкин, О.О. Михальский, А.С. Першаков и др., Защита программ и данных. - М.: Радио и связь, 2000.
2        Долгин А.Е. Защита программного обеспечения от исследования. /НСК N1, специальный выпуск, Москва, 1992 г.

3      В. В. Липаев – Отладка сложных программ – М.: Энергоатомиздат, 1993