logo
PASOIB

Глава 5. Защита исходных текстов программного обеспечения

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

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

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

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

Дробление программы. Чем выше степень дробления программы, тем труднее осуществлять анализ ее исходного текста. Если разбить исходный текст программы на элементарные функции, состоящие, например, из 10 строк, то данные функции будут давать очень мало информации о выполняемых ими действиях в общей совокупности. Анализирующему человеку необходимо будет сформировать общую целостную картину работы программы, реконструировать весь алгоритм в целом.

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

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

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

Ловушка 1. Данная методология основана на совмещении разнотипных данных в одном аргументе. Допустим, если значение аргумента < n, то он – число, иначе – указатель на функцию. В данном случае необходима тщательная продуманность реализации. Вторым недостатком таких ловушек является то, что они отрицательно сказываются на переносимости программ под другие платформы. Их можно использовать только тогда, когда переносимость не требуется.

Ловушка 2. Использование в программе необычных конструкций. Например, с точки зрения С++, перестановка индекса и имени массива ничего не меняет: buff[666], 666[buff]. Человека же можно поймать на такую запись.

Ловушка 3. Использование пробелов при объявлении макроса. Например

1) Запись Define x(a,b) a+b - Определяет макрос x(a,b) – сумма аргументов.

2) Define x (a,b) a+b – макрос x, заменяющий последовательность (a,b) последовательностью a+b.

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