Программно-аппаратные средства защиты информации в компьютерах

Методы защиты данных в компьютере можно разделить на механические, аппаратные и программные.
К механическим способам относятся разнообразные крышки и чехлы с замками, клейкие пластины для приклеивания терминала к компьютеру, а компьютера к столу, запираемые помещения с сигнализацией и другие.
Аппаратные средства реализуются в виде специальных электронных модулей, подключаемых к системному каналу компьютера или портам ввода-вывода, и осуществляющих обмен кодовыми последовательностями с защищенными программами.
Наиболее разнообразны программные средства. Сюда относятся программы шифрации данных по задаваемому пользователем ключу, администраторы дисков, позволяющие ограничить доступ пользователей к отдельным логическим дискам, методы установки программного продукта с дистрибутивных дискет, позволяющие выполнить установку не более заданного числа раз, запуск защищаемых программ посредством не копируемых ключевых дискет, специальные защитные программные оболочки, куда погружаются защищаемые программы и многие другие.
Рассмотрим некоторые программные средства защиты программного обеспечения от копирования.
Задача защиты программного обеспечения - создание и идентификация некоторого уникального ключевого признака. В процессе запуска или при работе защищенное приложение проверяет этот уникальный ключевой признак. Если обнаруживается, что ключевой признак совпадает с эталоном, хранящимся в защищенной программе, то программа продолжает выполнение, если нет, программа прекращает свою работу.
Привязка к местоположению на диске
Если требуется исключить копирование программы с жесткого диска на другой жесткий диск, её можно привязать к номеру кластера или сектора, с которого начинается файл программы на диске. Привязка осуществляется следующим образом. Специально подготовленная установочная программа открывает файл с рабочей программой и по таблице открытых файлов находит начальный номер кластера. Это число, являющееся своеобразным ключом, записывается установочной программой в определенное место файла рабочей программы (естественно в поле данных). Рабочая же программа после запуска, прежде всего, выполняет ту же операцию: определяет начальный адрес, а затем сравнивает его с ключом. Если числа совпадают, программа приступает к выполнению своей содержательной части, если не совпадают - аварийно завершается. При копировании программы на другой диск (или даже на тот же самый) она окажется расположенной в другом месте, и номер кластера, записанный установочной программой, уже не будет соответствовать реальному адресу файла, в то же время с помощью установочной дискеты программу не трудно установить на любом диске.
Запись ключа за логическими пределами файла
Как известно, DOS выделяет место под файлы целыми кластерами, в результате чего за логическим концом файла практически всегда имеется свободное пространство (до конца кластера). При копировании файла на другой диск реально переносятся только байты, соответствующие самому файлу, так как число копируемых байтов определяется логической длиной файла. Байты последнего кластера файла, находящиеся за логическими пределами файла, не копируются. Если в них записать ключ, то при копировании ключ исчезнет. Методика работы с программой не отличается от уже описанной. После записи рабочей программы на жесткий диск, она устанавливается с помощью специальной установочной программы (хранящейся на дискете). Установочная программа открывает файл с рабочей программой, перемещает указатель файла на его конец и записывает ключ (одно или несколько слов) за прежними пределами файла. Затем с помощью средств DOS файл укорачивается до прежней длины. В результате ключ оказывается физически прилегающим к файлу, но логически за его пределами. При использовании этого метода установочная программа должна перед записью ключа проанализировать длину файла. Если файл занимает целое число кластеров, его предварительно следует удлинить так, чтобы он занял часть следующего кластера, иначе некуда будет записать ключ. То же получится, если, скажем, при длине ключа 2 байта файл занимает целое число кластеров минус 1 байт. В этом случае файл также требует удлинения.
Рабочая программа после запуска выполняет те же операции, что и установочная (за исключением удлинения файла) и проверяет, записан ли известный ей ключ за концом файла.
Ключевая дискета с нестандартным форматом
Достаточно надежный способ защиты программ от переноса на другие компьютеры заключается в использовании не копируемой ключевой дискеты. В этом случае рабочая программа, находящаяся на жестком диске, перед началом работы проверяет наличие на дисководе дискеты с ключевой информацией. Для того, чтобы ключевую дискету нельзя было размножить с помощью команды DISKCOPY, осуществляющей копирование на физическом уровне, ключевая информация записывается на дорожке с нестандартным форматом, расположенной к тому же за пределами рабочего пространства диска.
Такая ключевая дискета подготавливается специальной установочной программой, которая с помощью функции 05h прерывания BIOS 13h, форматирует, например, дорожку номер 40 (или 80) с размером сектора 256 байт вместо 512 и записывает на неё заданный ключ.
Рабочая программа перед началом осуществляет чтение нестандартной дорожки и при отсутствии самой дорожки или ключа на ней аварийно завершается.
Привязка к параметрам среды
Можно осуществлять защиту файла (т. е. выявлять факт незаконного копирования файла на другой компьютер) используя так называемую "привязку к параметрам среды" (т.е. к определенным характеристикам аппаратной и программной части ЭВМ). Для реализации этого метода обычно используют так называемый "пристыковочный модуль" (ПМ).
Модуль - это часть кода, которая получает управление либо перед началом выполнения основной программы, либо после её завершения (хотя, в принципе, возможны ситуации, когда этот модуль получает управление не один раз за время отработки программы).
Требования к ПМ:
-подключение к файлу любого размера;
-исходный текст (код) защищаемого файла после подключения ПМ трудно отделить от защиты;
-ПМ не должен накладывать ограничений на защищаемый файл.
Характеристики, проверяемые ПМ:
-динамические;
-статические.
Динамические характеристики - это, например, скорость вращения жесткого диска (HDD), точная частота работы микропроцессора (CPU).
Недостаток динамических характеристик: сильная зависимость этих характеристик от температуры, влажности, напряжения, частоты сети, износа отдельных частей ЭВМ.
Статические характеристики - это, например:
- тип микропроцессора в совокупности с разрядностью шины данных;
- тип сопроцессора для работы с плавающей точкой;
- тактовая частота работы микропроцессора (с точностью до единиц мегагерц);
- тип ПЭВМ;
- дата регистрации BIOS;
- сигнатура производителя BIOS и её адрес в оперативной памяти, контрольная сумма байтов BIOS;
- размер основной оперативной памяти;
- размер расширенной памяти;
- размер дополнительной отображаемой памяти;
- тип клавиатуры;
- тип видеоадаптера;
- тип и интерфейс "мыши";
- число параллельных (LPT) портов;
- число последовательных (RS232) портов;
- тип и число НЖМД;
- тип и число НГМД.
2.2.Защита программного обеспечения от копирования с помощью электронных ключей
Использование электронных ключей относится к аппаратным средствам защиты.
Ключ представляет собой устройство, имеющее два разъема: одним он подсоединяется к параллельному или последовательному порту компьютера, другой служит для подключения принтера, модема или прочих устройств. При этом ключ не влияет на работу порта, полностью «прозрачен» для подключаемых через него устройств и не мешает их нормальной работе.
Интеллектуальные и физические возможности ключа во многом определяются той базой, на которой собран ключ. Современные ключи собирают на базе микросхем энергонезависимой электрически перепрограммируемой памяти, так называемой EEPROM-памяти (Electrically Erasable Programmable Read Only Memory); на базе заказных ASIC - чипов (Application Spesific Integrated Circuit) с памятью или без; на базе микропроцессоров.
Ключи на базе EEPROM
Это самые простые и недорогие ключи, выпускаемые для параллельного порта CENTRONICS. Для обеспечения каскадирования дополнительно используется мультиплексор. Количество ключей, которые могут работать кас-кадно, обычно не превышает трех. Из-за типовых схемотехнических решений эти ключи имеют «прозрачность» только для принтеров, работающих в стандартном протоколе CENTRONICS. Двунаправленный протокол, в котором работают современные лазерные и струйные принтеры (HPLJ-V, Stylus-850) обычно ими не поддерживаются, что сильно ограничивает перспективы их использования в будущем.
Размер памяти ключа, доступной на чтение/запись составляет примерно 128 байтов. Часть этой памяти используется для унификации ключа. В ней хранится некоторая служебная информация, тип ключа, идентификатор пользователя (Customer's code) , серийный номер ключа (ID-number).
Ключи на базе ASIC- чипа.
Это, наверное, самый привлекательный тип электронных ключей, так как особенности их функционирования закладываются на стадии проектирования ASIC-чипа (заказной интегральной микросхемы специального применения). Как правило, этот чип вбирает в себя весь интеллект и опыт работы огромного числа специалистов в области защиты, криптографии, микроэлектроники. Он имеет достаточно сложную внутреннюю организацию и нетривиальные алгоритмы работы.
Перед изготовлением ключа под конкретного заказчика сначала специальным образом с помощью специальной аппаратуры программируется ASIC-чип. Как минимум в него заносится уникальный код, присвоенный этому заказчику, и может быть уникальный серийный номер изготавливаемого ключа. Количество комбинаций для кода заказчика составляет порядка 240-250. Эта информация будет доступна в дальнейшем только на чтение и ее нельзя будет изменить никакими средствами.
Одним из главных критериев качества защиты является устойчивость к эмуляции. Эмуляторы электронного ключа могут быть как программные, так и аппаратные. При этом эмулироваться может не только протокол обмена ключа с портом, но и сам ключ. Ключи, построенные на базе EEPROM-памяти, используют для защиты от эмуляции так называемые "плавающие" или изменяемые и "зашумленные" протоколы обмена с портом. Ключи на базе ASIC-чипа имеют дополнительную защиту от эмуляции, реализованную в виде сложнейшей функции, статистический анализ которой не возможно провести за приемлемое время.
ASIC-чип обычно реализует некоторую сложную функцию y = f(x), где х - данные, передаваемые ключу из программы, у - данные, возвращаемые ключом в программу, fx) - функция преобразования входных данных в выходные. Рассмотрим типичные представители ключей на базе ASIC-чипов.
Activator
Выполнен на базе запатентованного компанией Software Security ASIC-чипа, имеющего постоянную память (18 разрядов), однократно программируемую память (24 разряда) и реализующего некоторую функцию. Структурно функция реализуется с помощью восьми элементов: трех счетчиков, четырех селекторов и фиксатора.
Счетчиками являются шестиразрядные регистры с диапазоном счета от 0 до 63, начальные значения счетчиков устанавливаются при изготовлении чипа, могут работать на сложение и на вычитание. При достижении граничных условий (0 и 63) счетчиком вырабатывается выходной сигнал.
Селекторы - шестиразрядные регистры, предназначенные для управле-
ния счетчиками. Операция выполняется счетчиком в том случае, когда
на вход селектора подано значение, прошитое в него при изготовлении. Так же
производится и изменение направления счета.
Фиксатор - это входной накапливающий регистр, который подает данные на вход всех селекторов при поступлении управляющей команды.
Сигнал на выходе формируется либо как логическое "И", либо как логическое "ИЛИ" от всех счетчиков.
Для использования ключей Activator программист должен смоделировать и запрограммировать алгоритм управления счетчиками и селекторами в виде команд обращения к параллельному порту и позаботиться об их маскировании.
Компания Software Security имеет представительство в Белоруссии (г.Минск).

Wibu-Key
Ключ Wibu-Key выпускает немецкая компания WIBU Systems. Основа ключа - программируемый с помощью специального адаптера ASIC-чип. ASIC-чип имеет режим шифрования байта или блока с заданного адреса с одним из 65536 выбранных алгоритмов. Алгоритмы кодирования различны для производителей или пользователей. Ключ обеспечивает скорость шифрования порядка 50 Кбайтов за 500 мс на PC с тактовой частотой 10мГц. В одном ключе может быть записано до 10 кодов различных производителей или пользователей. Код производителя или код фирмы (24 бита) задается производителем ключей и не может быть изменен, код пользователя (24 бита) и номер кодирующего алгоритма (16 бит) программируется перед поставкой защищенного программного обеспечения.
Ключи Wibu-Key имеют довольно приличные размеры (56х54х16мм) и выпускаются как для параллельного, так и для последовательного портов. Для их использования сначала необходимо приобрести Demo-Kit и лицензию стоимостью 500 немецких марок.
Новое поколение ключей HASP (версия R3) выполнено на заказном ASIC-чипе, разработанном инженерами компании ALLADIN. Этот чип производится по 1,5-микронной технологии и содержит порядка 2500 вентилей на кристалле. Кристалл обеспечивает более высокий уровень защиты и полностью совместим с предыдущей версией, на основе которой производились ключи HASP. Ключ HASP (R3) имеет существенно меньшие размеры, чем его предшественник. Его длина составляет всего 39 мм.
На этапе изготовления ASIC-чипа для ключей семейства HASP компанией ALLADIN Knowledge Systems определяется идентификационный код пользователя, уникальный серийный номер чипа и уникальная функция fx). В процессе эксплуатации чипа или ключа эта информация не может быть изменена никакими средствами. Реализуемая чипом функция является генератором последовательности, где на каждое целое входное число без знака из диапазона от 1 до 64 Кбайтов возвращается четыре целых числа без знака. Эти значения постоянны для одной партии ключей. Использование механизма генерации чисел качественно усложняет задачу взлома программ, так как ключевая информация (пароли, шифровальные ключи, условия переходов, ветвлений программы или часть самого кода и т.д.) не хранится ни в теле самой программы, ни в памяти ключа ни в открытом, ни в зашифрованном виде. В этом случае из программы может быть исключено самое уязвимое звено любой защиты - условие проверки элемента защиты.
Ключи на базе микропроцессоров
Электронные ключи, выполненные на базе микропроцессора, в основном предназначены для работы в открытых системах для защиты UNIX - приложений. Обычно микропроцессорные ключи подсоединяются к последовательному порту RS-232/432 рабочей станции и поддерживают платформы IBM RS6000, SUN, DEC Alpfa, Silicon Grapfics, HP, IBM-PC. Эти ключи выполняются как платформонезависимые.
Внутренний микропроцессор ключа реализует некий сложный алгоритм преобразования данных. При работе защищенное приложение посылает ключу стандартный запрос. Ключ его обрабатывает и по заданному алгоритму выполняет некие преобразования данных. Ключи разных производителей могут выполнять различные функции. Это - либо функция шифрования данных, реализуемая процессором ключа, либо иной алгоритм общения защищенного приложения с ключом.
Микропроцессорные ключи обычно поставляются разработчикам программ "чистыми" с исходными кодами процедур доступа к ключу, так что разработчики сами могут их программировать в той среде или на той платформе, для которой пишется приложение. Протокол обмена между ключом и компьютером (рабочей станцией) динамически шифруется.
Доступ к ключу защищается специальным паролем, назначаемым самим разработчиком программного обеспечения. Пароль, как правило, хранится в специальной привилегированной памяти ключа, доступ к которой ограничивается.
Основные достоинства ключей на базе микропроцессоров - платфор-монезависимость; возможность аппаратной реализации функции шифрования; открытый интерфейс.
Недостатки - довольно высокая цена.
2.3.Схемы построения защиты.
Важнейшей составной частью системы защиты с использованием электронных ключей является ее программная компонента. Как правило, она включает в себя:
-защитный "конверт" (Envelope);
-библиотечные функции обращения к ключу (API - Application Program Interface).
Оба способа обеспечения защиты имеют свое назначение и, по возможности, должны применяться совместно.
Защита с использованием пристыковочного механизма (Envelope).
Системы автоматической защиты (automatic implementation systems) предназначены для защиты уже готовых программ (DOS- или WINDOWS-приложений) без вмешательства в исходный код программы. Таким способом могут быть защищены COM и EXE-файлы, в том числе и содержащие внутренние оверлеи. Для встраивания защитного модуля внутрь готовой программы используется "вирусная" технология вживления и перехвата на себя управления после загрузки.
При защите тело программы шифруется и в нее добавляется специальный модуль, который при запуске защищенной программы перехватывает управление на себя. После обработки специальных антиотладочных и антитрассировочных механизмов, выполняются следующие действия:
-проверяется наличие электронного ключа и считывание из него требуемых параметров;
-проверка "ключевых" условий и выработка решения.
В случае TRUE производится загрузка, расшифровка и настройка на выполнение тела защищенной программы и передача на нее управления после выгрузки защитного модуля из памяти.
В случае FALSE загрузка и расшифровка тела защищенной программы в память не производится. Обычно после этого выполняются некоторые маскирующие действия (типа Plug not found), и защищенное приложение заканчивает свое выполнение.
Для защиты от аппаратной или программной эмуляции обмен между защитной оболочкой и электронным ключом выполняется с использованием зашумленного изменяющегося во времени протокола (так называемого "плавающего" протокола). Преимущества этого способа:
-простота и легкость установки;
-возможность автоматического вживления защиты без модификации исходного кода программы;
-наличие профессионального модуля антитрассировки и противодействия отладчикам.
Недостатки:
-электронный ключ проверяется только при запуске, поэтому после запуска приложения на одном компьютере ключ может быть перенесен на другой компьютер
-использование только защитной оболочки не обеспечивает надежной
защиты.
Защита с использованием функций API.
Простейшая функция API - это проверка подключения ключа. Более сложные функции API могут посылать ключу различные входные коды и получать от него ответные коды, которые затем проверяются на соответствие установленным значениям или могут использоваться при шифровании данных. Другая важнейшая группа функций API - это работа с памятью ключа и выполнение операций чтения/записи.
Использование функций API - это очень мощный механизм защиты. Программа может осуществлять вызовы функций обращения к ключу из многих мест, и результаты могут быть разбросаны по всему телу программы и хорошо замаскированы.
С другой стороны, встраивание вызовов API требует некоторых усилий при программировании и модернизации программы, и, чем лучше разработчик хочет защитить свою программу, тем больше усилий и времени ему придется затратить.
Все производители электронных ключей поставляют библиотеки функций API для различных языков программирования, компиляторов, линкеров, платформ и систем. Для каждой функции, как правило, приводится пример ее использования и тестовая программа.
Концепция многоуровневой защиты приложений с использованием API
Как уже отмечалось выше, общая схема защиты приложения с использованием API такова: вызовы процедур API встраиваются в защищаемое приложение, а возвращаемые значения проверяются с целью принятия решения о дальнейшей работе приложения. Потенциально, с использованием функций API можно построить защиту приложения неограниченной стойкости. Однако в описанной схеме существует определенный недостаток, наличие которого сильно ограничивает качество защиты с использованием API.
Проблема заключается в том, что процедуры работы с ключом, которые вызываются из основной программы, являются "низкоуровневыми". Как правило, это процедуры чтения/записи памяти ключа, получения значений аппа-ратно реализованной в ключе функции и т. д. Вызовы таких процедур резко выделяются из общей логической структуры приложения, что позволяет потенциальному взломщику достаточно легко их обнаружить и нейтрализовать.
Теперь представим, что разработчик прикладного программного продукта имеет в своем распоряжении библиотеку функций, специализированных для его приложения, в которой каждая функция обращается к электронному ключу и возвращает корректный результат, в случае наличия нужного ключа (и/или соответствующего значения памяти ключа) и некорректный - при отсутствии ключа (и/или соответствующего значения памяти). Использование такой библиотеки "высокоуровневых" функций работы с ключом имеет следующие преимущества:
-отсутствие в программе проверки значений, полученных из ключа. В случае, если электронный ключ не найден, программа работает некорректно, выдает неправильные результаты. Само собой разумеется, что в программе должны присутствовать и обычные проверки наличия ключа с выдачей соответствующих сообщений, чтобы легальный пользователь не стал жертвой системы защиты;
-необходимость потенциальному взломщику детально разбираться в логике работы приложения, чтобы взломать защиту (а это иногда не под силу даже разработчику);
-автоматическое обеспечение идеологии разнесения "во времени" и "в пространстве" операций получения значений из ключа и их обработки по цепочке "основная программа" - "высокоуровневые процедуры" - "низкоуровневые процедуры".