Вход

Защита программ от взлома и нелегального копирования

Реферат* по компьютерным сетям
Дата добавления: 20 июня 2006
Язык реферата: Русский
Word, rtf, 4.7 Мб (архив zip, 2 Мб)
Реферат можно скачать бесплатно
Скачать
Данная работа не подходит - план Б:
Создаете заказ
Выбираете исполнителя
Готовый результат
Исполнители предлагают свои условия
Автор работает
Заказать
Не подходит данная работа?
Вы можете заказать написание любой учебной работы на любую тему.
Заказать новую работу
* Данная работа не является научным трудом, не является выпускной квалификационной работой и представляет собой результат обработки, структурирования и форматирования собранной информации, предназначенной для использования в качестве источника материала при самостоятельной подготовки учебных работ.
Очень похожие работы



Защита программ от взлома и нелегального копирования


(C) Зайцев Олег, 1999

Эта статья посвящена достаточно актуальной в настоящее время тематике - защите программ от взлома и нелегального копирования. Этой теме посвящено много статей, одна из наиболее интересных (из тех, которые попались мне) - статья "Защита shareware-программ" Владимира Каталова в Компьютерре Online#240. Он привел ряд советов по написанию shareware программ и я не хочу повторяться - сходите, почитайте.

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

Инструментарий хакера. Современный хакер имеет в своем арсенале набор разнообразных утилит для взлома. Их можно подразделить на несколько категорий

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

  • Дизассемблеры. Производят дизассемблирование программы для дальнейшего изучения полученного кода. Один из наиболее популярных - IDA. От дизассемблера достаточно легко защититься - зашифровать или заархивировать программу. Тогда дизассемблируется только архиватор или кодировщик.

  • Средства мониторинга. Это набор утилит, отслеживающих операции с файлами, реестром, портами и сетью.

  • Средства пассивного анализа программы. Показывают разную информацию о программе - извлекают ресурсы, показывают связи, используемые библиотеки. Классический пример - утилита DEPENDS.EXE из комплекта Visual Studio. Она показывает, какие библиотеки используются программой и какие функции импортируются.

  • Прочие утилиты. Их великое множество (можно найти на диске типа "Все для хакера", причем в изобилии). Это разнообразные редакторы, анализаторы ...

Наиболее популярны следующие программы мониторинга :

FileMon - утилита, позволяющая вести мониторинг всех операций с файлами. Имеет удобный фильтр, может сохранять отчет в файле. Поэтому нет смысла делать "секретные" файлы где-нибудь в Windows/System - их элементарно найти.

RegMon - аналог FileMon, только ведется мониторинг всех операций с реестром. Аналогично файлам, бессмысленно создавать в реестре "секретные" ключи - они сразу бросаются в глаза.

PortMon - мониторинг работы с портами ввода/вывода

TCP_VIEW - монитор соединений по TCP-IP

RegUtils - набор утилит для контроля за реестром - делает копии реестра, позволяет сравнивать копии и просматривать изменения.

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

Основы построения защиты - шаг за шагом

Как ввести регистрационный код. Ввод пароля или регистрационного номера является ответственным делом - хакер постарается отловить адрес памяти, в который будет записан пароль. Затем на обращение по этому адресу ставится точка останова (команда BPM в SoftICE), что позволяет поймать начало процедуры проверки регистрационного кода. Если для ввода используются стандартные элементы ввода Windows, то алгоритм действий хакера можно формализовать и выглядит он примерно так:

  1. Устанавливает точку останова на считывание текста из стандартного элемента ввода (функции GetWindowText, GetGlgItemText модуля KERNEL32)

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

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

Набор этих действий стандартен и мне не раз попадались подробные руководства типа "Взлом Windows программ - шаг за шагом", ориентированные на продвинутого пользователя.

Рассмотри несколько решений, которые могут затруднить взлом на этом этапе.

Совет _0. Старайтесь как можно меньше применять стандартные функции (особенно API-шные) и компоненты VCL. Так что Assembler, Assembler и еще раз Assembler ...

Сущность этого совета надеюсь очевидна - современные дизассемблеры умеют распознавать стандартные процедуры высокоуровневых языков, а API - вообще отдельный разговор - SoftICE обладает изумительной возможностью - загружать символьные имена для любых указанных библиотек (особенно для KERNEL32.DLL) - отладка резко упрощается, т.к. мы видим имена вызываемых функций и можем ставить точки останова на вызов функций по их имени.

Совет _1. Применяйте нестандартный способ ввода пароля.

Наипростейший путь - написать свой визуальный компонент для ввода регистрационного кода. Он конечно должен будет обрабатывать события от клавиатуры, но момент считывания кода нельзя поймать избитыми методами. Это уже что-то, но есть второй способ взлома, основанный на поиске введенного кода в памяти. Для этого в SoftICE есть удобная команда "S стартовый адрес L длина 'образец'" , которая позволяет найти введенное значение в памяти.

Совет _2. Не храните введенный код в одном месте !

Совет _3. Не храните введенный код открытым текстом !

Итак, что же следует сделать. Для начала необходимо завести в программе 5-10 переменных типа STRING и после ввода кода переписать введенное значение в них. Делать это лучше всего не в одном месте, а распределить по программе. Таким образом поиск даст кучу адресов, по которым будет находиться введенный код. Я в таком случае поступаю так - по таймеру создаю в динамической памяти новую строковую переменную, пишу в нее код. Затем на следующем срабатывании таймера создаю новую переменную, переписываю в нее код, а старую уничтожаю. При определенном навыке можно заполонить память значениями введенного кода и сделать поиск почти бесполезным. Причем такое копирование можно совместить с проверкой кода или эмуляцией этой проверки. Затем с эти строками неплохо поделать какие-либо операции - сравнить с чем-нибудь ...

Советы 3 и 1 можно объединить - создать свой компонент, который позволит вводить код нестандартным способом с его одновременной шифровкой.

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

Совет _4. Ни в коем случае не анализируйте код сразу после его ввода.

Чем дальше ввод кода от его анализа, тем лучше. Самое разумное - после ввода кода поблагодарить пользователя за сотрудничество и сообщить, что со временем будет выполнена регистрация программы. А анализ кода произвести, например, через 1-2 минуты в совершенно другом месте программы.

Совет _5. Не проверяйте код только в одном месте и не пишите для проверки функцию.

Достаточно найти и отключить эту проверку, и защита взломана. Если проверок несколько, они разные и распределены по программе, то взлом затрудняется.

Совет _6. Не проверяйте пароль одним алгоритмом.

Рекомендуется разработать 2-3 алгоритма проверки, например 1-2 цифры должны делиться на 3, а 3-7 наложенные по какому-либо алгоритму на имя пользователя должны дать в сумме 4. Эти две проверки осуществляем в различных местах с достаточно большим временным разносом - взломав первый метод хакер не будет догадываться о существовании еще нескольких, которые проявятся со временем.

Совет _7. Ни в коем случае не предпринимайте никаких действий после проверки. По неизвестной причине большинство программ выглядят примерно так

IF NOT(SuperRegCodeCheck) then

Begin

ShowMessage('Неверный код, дальнейшая работа невозможна');

halt;

end;

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

Совет _8. Отвлекающие маневры.

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

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

Классический пример нарушения этого правила

IF NOT(LegalCopy) then

ShowMessage('Сохранение работает только в зарегистрированной версии')

else

SaveFile;

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

MOV [адрес LegalCopy], 1

RET

Совет _10. (вытекает из 9) Не храните результатов проверки на диске или в реестре.

Типичная ошибка - выяснили, что копия зарегистрирована и сделали где-нибудь метку. Отловить это достаточно просто (см. описание REGMON и FILEMON). Наилучший способ - сохранить пароль и имя пользователя в том виде, в котором он их ввел. Затем при каждом запуске программы проверять корректность этого кода, но не забывая Совет _11. Ничего не проверяйте сразу при запуске приложения или сразу после считывания сохраненного имени или кода. Помните, что считывание кода и его ввод в окне регистрации идентичны по мерам защиты - дублирование в разных областях памяти, шифрование ...

Выводы: мы устроим проверку кода в нескольких местах программы, при этом применим несколько алгоритмов проверки, не будем использовать API.Кроме того, стоит проделать несколько отвлекающих маневров.

Общие советы по защите программ

  • CRC - контрольные суммы. Любой файл, строку или блок данных можно защитить контрольной суммой, которую затем можно рассчитать и сравнить с эталоном. При сравнении с эталоном конечно следует весть осторожно - см. первые 11 советов. Итак, совет 12. Защищайте программы и данные контрольными суммами. Это поможет не только от взлома, но и защитит программы от вируса или внедрения троянца.

  • Применяйте шифровку программ и данных. Очень неплохо сжать программу и данные. Я, например, разработал свой собственный архиватор - RAR-у и ZIP-у он конкуренции не составит, но сжатые им данные разжать очень непросто, придется изрядно повозиться. Да и изменить их проблематично - придется разжать, изменить и сжать.

  • Отлов пошаговой отладки программы. Существует много способов, я в свое время провел целое исследование этого вопроса под DOS, насобирал и придумал не менее 20 методов, но они мало приемлемы под Windows. Самый простой и надежный способ - таймер. При работе программы периодически фиксируем системное время и рассчитываем время работы фрагментов кода между ними. И если 200-400 команд процессора работают 2-3 минуты, то тут есть над чем задуматься.

Совет 13. Не определяйте дату и время стандартными способом !! Придумайте что-нибудь оригинальное.

Совет 14.Не стоит хранить что-либо секретное в файлах или реестре. Работа с файлами или реестром может быть детально запротоколирована и проанализирована, и все тайное станет явным.

Совет 15.Не храните ничего важного открытым текстом, особенно сообщения типа "Это незарегистрированная версия ...", "Введенный пароль не верен ...".
Они для хакера - как для быка красная тряпка, и действительно - находим такое сообщение, ставим точку останова на обращение к участку памяти с этим сообщением и получаем возможность поймать момент выдачи этого сообщения.

Советы по созданию меток для организации ограничения по времени

Защита "ограничение времени работы" состоит в том, что программа каким образом фиксирует момент своего первого запуска и работает установленное время (обычно 20-30 дней). После истечения этого срока программа отказывается запускаться. Как проверить текущую дату я уже где-то тут писал - нестандартным способом, например по дате на файлах реестра или свежесозданном своем файле. Весь фокус в другом - как зафиксировать на компьютере дату первого запуска (естественно так, чтобы изничтожение программы и ее повторная установка не давали эффекта). Использование "секретных" файлов в системных папках или изменения в существующих файлах легко отловить при помощи FILEMON. Реестр то же отпадает из-за REGMON. Прочие методы (типа записи в ВООТ сектор ...) тоже неприемлемы - не те времена, по Windows все это не пройдет. Наиболее оригинально (на мой взгляд) прошить дату в саму программу и постоянно обновлять ее на своем сайте (естественно, автоматически). Таким образом отсчет неявно идет от момента скачивания программы с сайта. Есть тут правда и минус - после завершения срока можно повторно скачать эту программу и получить еще 15-20 дней ... . С другой стороны это оригинально - пользователю рано или поздно надоест скачивать эту программу и он или откажется от нее, или купит. Но при этом стоит помнить, что программу можно скачать несколько раз и сравнить варианты, выявив, где лежит дата. Поэтому стоит позаботиться о том, чтобы изменился почти весь файл (например, изменить пару опций компилятора)

Советы по формированию регистрационных кодов

Формирование кодов может вестись по следующим основным направлениям:

  • Жестко фиксированные коды, прошитые в программу. Их обычно немного и их огласка сводит защиту к нулю.

  • Некий алгоритм проверки кода. Немного лучше первого, но лишь немного. Возьмите за пример код Windows - его знает любой пользователь

  • Алгоритм проверки кода, использующий имя пользователя. Очевидно, что для каждого имени будет уникальный номер (или номера - их может быть несколько, в зависимости от алгоритма). Это уже лучше, но нелегальное распространение держится на эгоизме зарегистрированных пользователей - ничто не мешает им предать имя/пароль огласке, но тогда хотя бы можно вычислить виновника и заблокировать его код

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

  • On-Line регистрация. Состоит в том, что программа в On-Line связывается с сайтом разработчиков (или компании, осуществляющей продужу софта) и передает туда ревизиты пользователя. В ответ программе передается регистрационная информация. Этот метод может и хорош для ряда программ, но на мой взгляд не выдерживает никакой критики по двум соображениям:
    1. Никто не может гарантировать, что конкретно передаст программа в Инет. А передать она может все, что угодно - параметры компьютера, пароли, любые данные и т.п.
    2. Конкретный пользователь ножет не иметь доступа к Инет. Это особенно важно для программ, работа которых не связана напрямую с Сетью. И зарегистрировать такую программу его практически никто к себе на компьютер не пустит (из соображений п.п. 1)

Рекомендовать тут что-либо бесполезно, но я например использую разновидности метода 3.







Защита от компьютерного пиратства. Русский стиль.


По данным BSA (Business Software Alliance), доля нелегальных копий программных продуктов в России составляет 95 % — это дает основание относиться к компьютерному пиратству как к национальному бедствию.

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

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

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

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

Разумеется, электронные ключи имеют и качественно более высокий уровень защищенности от взлома, чем программная защита. Однако не следует думать, что они являются некоей панацеей, обеспечивающей абсолютно “неснимаемую” защиту. Отечественные хакеры пребывают в постоянном поиске новых методов взлома; и в плане взлома программно-аппаратной защиты ими уже накоплен богатый опыт. Сегодня в первую очередь страдают морально устаревшие электронные ключи (а такие, учитывая скорость развития технологий, уже существуют), либо те, разработчики которых не учитывают особенностей хакерского движения в России. В результате среди имеющихся сегодня на рынке систем программно-аппаратной защиты есть и такие, взломать которые русским хакерам не сложнее, чем простенькую программную защиту.

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

Как сегодня “ломают” защиту

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

Рассмотрим наиболее популярные из современных методов взлома программно-аппаратной защиты.

Создание аппаратной копии электронного ключа

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

Создание аппаратных копий ключа применимо только в тех случаях, когда хакеру известен конкретный тип микросхемы памяти, когда хакер имеет специальное аппаратное устройство (программатор) для записи данных в микросхему памяти ключа-копии и, самое главное,— при условии, что память электронного ключа никак не защищена от ее нелегального считывания. Именно это третье условие и стало “ахиллесовой пятой” некоторых марок электронных ключей, именно слабость (а то и полное отсутствие) защиты данных в памяти ряда ключей обусловило распространение этого метода взлома.

Методу присущи несколько недостатков. Главный из них в том, что, даже получив нелегальную копию программы, не удастся решить задачу ее незаконного распространения — ведь копия так и осталась защищенной, просто теперь она “привязана” к “левому” электронному ключу. Кроме этого, достаточно велика стоимость такого копирования — зачастую дешевле просто купить легальную копию продукта. Поэтому такой метод не получил столь широкого распространения, как следующий.

Создание эмулятора электронного ключа

Хакер, изучив внутреннюю логику работы электронного ключа, создает некий программный модуль — резидент, DLL, драйвер и т.п., — который в той или иной степени эмулирует (то есть воспроизводит) работу электронного ключа. Качественно написанный эмулятор способен воспроизвести работу ключа во всех тонкостях, включая особенности протокола обмена между защищенной программой и ключом, генерацию им верных ответов для “всех случаев жизни” и т.д. В результате защищенная программа будет спокойно работать, даже не подозревая, что имеет дело отнюдь не с электронным ключом, а с программным “суррогатом-заменителем”.

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

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

Но в любом случае эмуляторы должны верно воспроизводить не только посылаемые ключом данные, но и протокол обмена с ним (в противном случае защищенная программа не сможет “понять” переданных эмулятором данных).

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

  • “Плавающий” протокол обмена с электронным ключом. Данные, передаваемые между электронным ключом и программой, искусственно “зашумляются”, причем с течением времени характер передаваемого вместе с данными “шума” меняется хаотическим образом. Так как эмулятор обязан воспроизводить не только поступающие от ключа данные, но и все особенности протокола обмена с ним, “зашумление” протокола обмена сильно усложняет (и удорожает) задачу написания эмулятора, вынуждая его быть слишком сложным. В настоящее время практически все разработчики электронных ключей применяют “плавающие” протоколы обмена.

  • Использование для защиты аппаратных алгоритмов электронного ключа. Оно позволяет существенно усложнить логику работы ключа — на запрос программы он будет возвращать нечто гораздо более сложное, чем просто “да / нет”. Соответственно, для того чтобы написать универсальный эмулятор такого ключа, нужно как минимум составить список верных ответов на все возможные вопросы, что может быть чрезвычайно трудоемко и дорого.

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

Отделение модуля автоматической защиты

Метод автоматической защиты готовых программ (его еще называют методом envelope или “конвертом” защиты) доступен практически во всех системах программно-аппаратной защиты. Его преимущества очевидны: при помощи специальной утилиты в считанные секунды можно “надеть” защиту на любую готовую программу. Экономится масса времени, которого всегда не хватает, не требуется никаких навыков в области построения защиты, а порой этот метод вообще является единственно возможным (например, если по каким-либо причинам Вам недоступны исходные тексты защищаемых программ). Однако у этого метода есть своя “ахиллесова пята”. Так как защита устанавливается на готовую программу, она не может образовать с программной неразрывного целого. Модуль автоматической защиты как бы “приклеивается” к программе, а это значит, что у хакера есть теоретическая возможность отделить, “отклеить” его — причем без ущерба для самой программы. Российскими хакерами накоплен в этом плане огромный опыт, есть даже специальные утилиты автоматического взлома программ, защищенных таким методом.

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

Другой действенный метод спасти защиту от быстрого взлома — это комбинирование автоматической защиты с защитой при помощи функций API. В этом случае хакер, даже “отсоединив” модуль автоматической защиты, не получит незащищенной программы — во многих местах ее тела останутся нетронутыми вызовы функций API защиты.

Удаление вызовов функций API

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

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

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

  • Разработка нетривиальной логики взаимодействия программы и защиты. Не приходится рассчитывать на приемлемый уровень защищенности программы, если информация, возвращаемая функциями API, используется программой для банального сравнения: “верно / неверно”. Есть множество эффективных приемов усложнения логики работы программы с модулями защиты. Откладывание реакции программы на информацию, полученную от ключа, использование ответных данных ключа в качестве индексов каких-либо массивов, подсчет контрольных сумм данных с использованием значений, полученных от ключа и т.д.— это лишь наиболее простые из таких приемов. Воспользовавшись ими и им подобными, можно создать защищенную программу, разобраться в логике работы которой хакеру будет очень и очень сложно. В результате шансы удалить из программы все вызовы функций API без последствий для самой программы станут минимальными. “Осколки” защиты постоянно будут проявляться во взломанной программе, ограничивая ее возможности и нарушая нормальный ход ее работы. Такую программу можно рассматривать лишь как демонстрационную — ведь пользователь не сможет использовать все ее возможности и рано или поздно будет вынужден приобрести легальную копию такой программы. Ниже мы еще рассмотрим некоторые методы усложнения логики взаимодействия программы и защиты.

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

Итак, как видите, есть много способов взлома даже такой мощной защиты, как электронные ключи. А есть ли система защиты, способная по-настоящему хорошо противостоять всем этим методам? Несомненно, в природе не существует защиты, самим фактом своего существования сводящей на нет все усилия хакеров по ее взлому. Любая система защиты — это не готовое решение, это инструмент. И воспользоваться этим инструментом можно по-разному. Можно подойти к вопросу формально, потратить на процесс защиты от силы 10–15 минут — и результат будет неудовлетворительным, даже если используется самая лучшая защита в мире! А можно, изучив систему во всех тонкостях, реализовать все возможности защиты — и, как говорится, результат превзойдет ожидания. Иными словами, очень многое зависит от квалификации и трудолюбия программиста, “надевающего” защиту на программу. И в этом нет ничего удивительного: ведь, к примеру, и с помощью одного и того же компилятора можно создать надежный, мощный, конкурентоспособный программный продукт, а можно и такой, который, кроме “зависания” операционной системы, не способен сделать ничего.

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

Вот почему ключевым моментом, влияющим на всю последующую работу с защитой, является сам процесс выбора конкретной системы. При этом не стоит уповать только лишь на громкие имена и регалии ее разработчиков. Рынок защиты — особенно в нашей стране — меняется очень динамично, российские хакеры с поразительной легкостью свергают с пьедесталов, казалось бы, “непотопляемых” лидеров, и их место занимают другие. В такой ситуации человеку, не владеющему полной картиной происходящего на рынке, легко стать жертвой иллюзий и поставить на “героя вчерашних дней”. Поэтому проблему выбора защиты нужно решать комплексно, отталкиваясь от своих собственных нужд и от объективной технической информации о той или иной системе защиты. И, при прочих равных условиях, лучше отдать предпочтение той из них, которая имеет действительно серьезные характеристики.

Технология Stealth на страже ваших доходов

Накал борьбы между разработчиками защиты и хакерами непрерывно растет. Хакеры без устали создают все более совершенные технологии взлома защиты. Появление таких методов взлома, как эмуляторы электронных ключей, их аппаратное копирование и т.п., заставило задуматься о необходимости новых технологий защиты, направленных, прежде всего, на борьбу с новейшими методами взлома. Причем совершенно ясно, что это должны быть принципиально новые технологии — дальнейшее совершенствование существующих в достаточной степени бессмысленно, так как является не более чем полумерой. Нужна защита, не имеющая прежних “родимых пятен”, в которой надежно закрыты все возможные узкие места.

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

Речь идет о технологии Stealth, разработанной в России в конце 1996 года как ответ на новую фазу “холодной войны” между хакерами и разработчиками защиты. Электронные ключи, выполненные по этой технологии, обеспечивают такое качество и стойкость защиты, о котором раньше не приходилось и мечтать. Сейчас по этой технологии выпускаются 2 типа электронных ключей — Guardant Stealth и Guardant Net.

Электронные ключи, выполненные по технологии Stealth, характеризуются несколькими общими признаками: они предназначены для работы в параллельном порту IBM-совместимого компьютера, выполнены на базе микроконтроллера, поддерживают генерацию аппаратных алгоритмов, имеют энергонезависимую память, полностью “прозрачны” для любых периферийных устройств.

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

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

Аппаратные алгоритмы Y=F(X). В отличие от своего предшественника, Stealth-ключи имеют аппаратные алгоритмы кодирования данных. Они обеспечивают высочайший уровень защищенности от взлома и снабжают Stealth-ключи принципиально новыми возможностями.

До 18 алгоритмов в одном Stealth-ключе. В одном Stealth-ключе можно организовать до 18 различных аппаратных алгоритмов. Для защиты можно одновременно пользоваться несколькими алгоритмами. Это еще больше усложнит процесс взлома защиты.

Высочайшая сложность аппаратных алгоритмов. В формировании каждого аппаратного алгоритма участвует так называемый определитель — последовательность байт, защищенная от чтения и модификации. Длина определителя может достигать 200 байт или 1600 бит. Нетрудно подсчитать, что для подбора алгоритма с таким определителем хакеру придется перебрать до 21600 различных комбинаций. Взяв минимальное время работы такого алгоритма, получим, что для его подбора хакеру потребуется порядка 10475... тысячелетий!!!

Уникальность аппаратных алгоритмов каждого пользователя защиты. Каждый пользователь защиты на базе Stealth-ключей получает электронные ключи с несколькими созданными по умолчанию аппаратными алгоритмами, вид определителя которых уникален. Аппаратные алгоритмы в ключах, предназначенных для Вас, будут кодировать одни и те же данные по-иному, нежели у любого другого пользователя защиты Guardant. Это не позволит хакерам создать универсальный эмулятор Stealth-ключей.

Возможность создания собственных аппаратных алгоритмов. Вы можете не только пользоваться уже готовыми аппаратными алгоритмами, но и создавать свои собственные! Вы можете задавать свойства своего аппаратного алгоритма, конструировать его определитель и т.д. В результате электронный ключ станет кодировать данные по алгоритму, конкретный вид и свойства которого будут известны только Вам! Используя свои уникальные аппаратные алгоритмы, Вы полностью исключите вероятность создания универсальных эмуляторов для Ваших программных продуктов (или для разных версий одного вашего продукта).

Использование свойств аппаратного алгоритма. В создании аппаратного алгоритма Stealth-ключа участвует также и комбинация свойств алгоритма, которую Вы можете задать сами. Вы можете сделать алгоритмы одинаковыми у всех Ваших Stealth-ключей либо сделать их зависимыми от абсолютно уникальной величины — ID Stealth-ключа. Можно создать алгоритм с ограничением числа его запусков для надежной защиты демо-версий Ваших программ. Комбинируя свойства Ваших аппаратных алгоритмов, можно не только повысить уровень стойкости защиты, но и решить вопросы маркетинга защищенных продуктов.

Кодирование до 255 байт данных одновременно. Любой из аппаратных алгоритмов Stealth-ключа за один сеанс способен обработать до 255 байт (или 2040 бит) данных. Причем на шифруемую последовательность длиной N байт накладывается нециклическая шифрующая последовательность длиной N байт. Возможность кодирования большого объема данных обеспечивает мощнейшую защиту от подбора хакерами верных ответов Stealth-ключа.

Наличие “быстрых” алгоритмов. Помимо аппаратных алгоритмов, Вы можете использовать для защиты алгоритм быстрого преобразования данных. Эта уникальная возможность позволит Вам производить кодирование сверхбольших объемов данных с такой высокой скоростью, что сам процесс будет совершенно незаметен для пользователя Вашего защищенного приложения.

Множественность кодов доступа к электронному ключу. Для выполнения любой операции со Stealth-ключом требуется задать код доступа к нему. Существуют Общий код и 3 Личных кода доступа. Не зная какого-либо из Личных кодов, невозможно выполнить с ключом и соответствующий этому коду набор операций! Использование нескольких кодов доступа значительно осложняет задачу получения любого нелегального доступа к Stealth-ключу.

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

Кодирование данных в памяти Stealth-ключа. Все данные хранятся в памяти Stealth-ключей в кодированном виде, причем в каждом ключе кодирование производится уникальным образом. Самим же процессом кодирования / декодирования занят микроконтроллер ключа. Такой метод хранения данных делает бессмысленным их считывание — даже при помощи дорогостоящих аппаратных устройств, защититься от которых невозможно. Ведь, например, для получения аппаратной копии ключа нужно эти данные записать в другой Stealth-ключ (так называемый ключ-копию). Но микроконтроллер любого другого Stealth-ключа будет неверно интерпретировать эти данные, так как будет декодировать их иначе.

Аппаратная блокировка отладчиков. Stealth-ключ имеет уникальную аппаратную защиту от изучения логики его работы под отладчиком. Если ключ обнаружит, что протокол обмена с ним выполняется в среде отладчика (а в этом случае все временные интервалы неизбежно увеличиваются), он попросту перестает отвечать на любые запросы. Таким образом, Stealth-ключ сразу же выбивает из-под ног хакера привычную ему почву, заставляя использовать какие-то нестандартные и неудобные методы его изучения.

Особенности протокола обмена со Stealth-ключом

Протокол обмена со Stealth-ключом:

  • “Плавающий”. Вместе с реальными данными между защищенной программой и ключом передается специально генерируемый “мусор”— ничего не значащие данные.

  • Кодированный. Все данные, курсирующие между программой и электронным ключом, непрерывно кодируются.

Эти два свойства протокола помогают обеспечить надежную защиту от создания эмуляторов Stealth-ключей.

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

  • С автоматической верификацией. Любая операция записи в память Stealth-ключа сопровождается автоматической операцией верификации — записанные данные обязательно проверяются на адекватность.

  • С автоповторами. Если из-за помех, вносимых другими устройствами, при обмене с ключом возникает сбой, то производятся автоматические повторы выполнения операции.

Эти свойства значительно повышают надежность обмена со Stealth-ключом и обеспечивают ему высокий уровень совместимости с аппаратным и программным обеспечением.

Энергосбережение и полная “прозрачность” Stealth-ключа

В Stealth-ключе используется уникальная гибкая система энергопотребления — микроконтроллер управляет уровнем потребления Stealth-ключом энергии, оперативно меняя свою тактовую частоту. Кроме 2 стандартных состояний (“сон”/активная работа), Stealth-ключ имеет и уникальное промежуточное состояние, которое отличается очень низким уровнем энергопотребления. В это состояние Stealth-ключ переходит в случае, если на его вход приходят данные для подключенного через него периферийного устройства. Наличие гибкой системы энергопотребления и промежуточного состояния работы ключа обеспечило ему наивысший уровень “прозрачности”. На практике Stealth-ключи полностью “прозрачны” для любых периферийных устройств и для любых протоколов обмена с ними.Кстати, именно это свойство ключей, выполненных по новой технологии, легло в основу названия самой технологии (“stealth”— по-английски “невидимка”).

Таким образом, электронный ключ, выполненный по технологии Stealth, надежно защищен от всех известных методов взлома. Кроме того, такой ключ имеет целый ряд особенностей, повышающих уровень надежности и совместимости защиты. Технология Stealth доказала свою жизнеспособность и является сегодня наиболее передовой и перспективной. А лучшее тому доказательство — мнение многих отечественных хакеров, что Stealth-ключи наиболее хорошо защищены сами и дают наилучший уровень защиты программным продуктам среди всех систем программно-аппаратной защиты, представленных на российском рынке.



















80. Функции и процедуры защиты вс

1.3.3. Функции, процедуры и средства защиты ВС Определив понятия

объектов и ресурсов, установим множество операций и функций,

которые могут быть выполнены над нами. Первая группа операций -

это операции инициализации объектов при входе в ВС. К ним

относятся: идентификация, подтверждение подлинности и

установление сферы действия объекта. После этого объекту

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

объектов: обмен сообщениями, использование услуг электронной

почты, проведение телеконференций и т.п. При реализации этих

операций и функций выявляются различные аспекты проблем защиты и

обеспечения целостности данных. Функции и средства защиты,

относящиеся к активным элементам ВС, целесообразно определить как

функции и средства защиты объектов /MUFT86/. Вторая группа

операций - это операции передачи данных и управляющих сообщений

по линиям связи. Они также требуют защиты, поскольку линии связи

- уязвлимый комплект ВС. Соответствующие функции и средства

защиты целесообразно определить как функции и средства защиты

каналов передачи данных (линий связи) /VOYD83/. Третья группа

операций - это операции над данными. Они связаны с использованием

данных, их содержанием, способом организации, обеспечением

доступа к ним и их применением. При анализе проблем защиты эта

группа операций выявляет уязвимость информации, которую

генерируют объекты ВС, используя данные из различных сетевых БД,

доступ к которым ограничен. Соответствующие функции и средства

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

хранения и использования информации, и их целесообразно

определить как функции и средства защиты баз данных ВС /DENN79,

DENN87/. Четвертая группа операций - это операции управления

процессами, выполняемыми в ВС. Соответствующие средства защиты

осуществляют координацию, синхронизацию,обеспечивают целостность

и защиту процессов в ВС. Они могут быть объединены в подсистему

управления ВС. Таким образом, все операции: требования к защите,

функции, средства и механизмы защиты - могут быть отнесены к

одной из следующих четырех групп: - защита объектов ВС; - защита

линий связи; - защита баз данных; - защита подсистемы управления

ВС. Такая структура операций, функций, процедур, средств и

подсистем защиты была предложена первоначально в работе /MUFT83/,

нашла признание и вошла в международный стандарт /ISO87/. ЗАЩИТА

ОБЪЕКТОВ ВС С каждым объектом ВС связана некоторая информация,

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

символов, алгоритм, подтверждающие подлинность объекта. Определим

такую информацию как идентификатор объекта. Процесс верификации

этого идентификатора назовем идентификацией объекта. Если объект

имеет некоторый идентификатор, зарегистрированный в сети, он

называется легальным объектом; остальные объекты относятся к

нелегальным. Идентификация защищенного объекта - одна из функций

подсистемы защиты, которая выполняется в первую очередь, когда

объект делает попытку войти в сеть. Если процедура завершается

успешно, объект является легальным для данной сети. Следующий шаг

- верификация идентификатора объекта и устанавливает, что

предполагаемый легальным объект действительно является таким,

каким себя объявляет. После того как объект идентифицирован и

верифицирован, должны быть установлены сфера его и доступные

ресурсы ВС. Такая процедура называется предоставлением

полномочий. Перечисленные три процедуры инициализации относятся к

единственному объекту ВС, и поэтому их следует отнести к

средствам защиты самого объекта. В контексте защиты каналов

передачи данных (линий связи) подтверждение подлинности означает

установление подлинности объектов, связывающихся между собой по

линиям связи, реализуемым с помощью сетевых механизмов защиты.

Таким образом, следующая совокупность функций защиты -

подтверждение подлинности соединения абонентов по линиям связи

/VOYD83/. Эти функции называются взаимоподтверждениемподлинности

(peer-to-peer authentication) соудинений объектов/ISO85/. Термин

соединение используется для того, чтобы определить логическую

связь (потенциально сторонюю) между двумя взаимосвязанными

объектами сети. Процедура подтверждения подлинности выполняется

обычно в самом начале сеанса в процессе установления соединения.

Цель - обеспечить высокую степень уверенности, что соединение

установлено с равноправным объектом и вся информация ,

предназначенная для обмена, верифицирована и подтверждена. После

того как соединение установлено, необходимы следующие четыре

процедуры, чтобы обеспечить защиту об обмене сообщениями /ISO85/:

а) получатель должен быть уверен в истиннности источника данных

(подтверждение подлинности идентификатора и самого отправителя);

б) получатель должен быть уверен в истинности передаваемых

данных; в) отправитель должен быть уверен в истинности

доставленных данных (расписка в получении). Некоторые авторы

рассматривают только процедуры а) и б), в которых средствами

защиты являются соответственно цифровая сигнатура и цифровая

печать /АКL83, DAVI83/. Если реализованы лишь эти процедуры, то

только получатель имеет уверенность, что защита при передаче была

обеспечена. Для того чтобы гарантировать такую же степень

уверенности для отправителя, должны быть выполнены процедуры в) и

г), а отправитель должен также получить расписку в получении

(уведомление о вручении в принятой почтовой терминологии). Такая

процедура называется почтовым отправлением с уведомлением о

вручении или удостоверяющей почтой (certified mail)/BLUM83/.

Поэтому средством защиты такой процедуры является цифровая

сигнатура подтверждающего ответного сообщения, которое, в свою

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

Для того чтобы обеспечить отправителя доказательством истинности

переданного сообщения, ответное сообщение (подтверждение) должно

включать некоторую модификацию цифровой (почтовой) печати

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

получении исходного сообщения. Если все четыре процедуры

реализованы в ВС, они гарантируют защищенность данных при

передаче по линии связи и определяют функцию защиты, которую

можно было бы назвать функцией подтверждения передачи

(nonrepudiation service)/ISO85/. В этом случае отправитель не

может отрицать ни факта посылки сообщения, ни его содержания, а

получатель не может отрицать ни факта получения сообщения, ни

истинности его содержания. Особое место в подтверждении

подлинности передачи сообщения занимает проблема защиты

отправлений по каналам электронной почты, когда отправитель

посылает сообщение получателю, который не является активным в

момент пересылками сообщений. Это означает, что:

-взаимоподтверждение подлинности невозможно; -цифровые печать и

сигнатура проверяются в более позднее время, когда получатель

войдет в ВС; -верификация уведомления о вручении сообщения со

стороны отправителя также откладывается. Поэтому процедура защиты

электронной почты использует функцию, аналогичную функции

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

протоколов для надежного управления ключами, обеспечения

целостности ресурсови верификации отсроченных процедур. Иные

проблемы, связанные с подтверждением передачи сообщений,

возникают при организации телеконференций связана с тем, что

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

период времени проведения телеконференции с целью обеспечить

взаимодействие участников. Если эта процедура реализована с

использованием некоторого ассиметричного криптографического

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

сгенерировать общий открытый криптографический ключ

/INGE82,BOUD86/. Для всех перечисленных процедур, функций и

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

друг другу объекта взаимодействуют в недружественном сетевом

окружении. Это означало бы, что источник угроз по отношению к

соединению, находился вне этого соединения. Более сложно

гарантировать защиту при передаче сообщений между

недружественными объектами, когда никто никому не доверяет. В

этом случае следует проследить, чтобы передаваемая объектами

информация была равнозначной по своей важности. Используемая в

этих целях процедура защиты в случае двух участников называется

подписанием контракта (contrakt signing) /BLUM83/ и может быть

распространена на случай многостороннего соединения нескольких

объектов /BAUE83, DENN83/. Тогда такие функции защиты могут быть

определены как подписание двустороннего или многостороннего

контракта соответственно. Для недружественных объектов в

литературе предложены некоторые другие процедуры защиты.

Электронные устройства жеребьевки позволяют двум не доверяющим

друг другу объектам провести жеребьевку в условиях ВС абсолютно

случайно и беспристрастно, так что никто из участников не может

повлиять на исход /BLUM81, EVEN85/. Такая процедура жеребьевки

может быть использована, чтобы реализовать некоторые другие

функции и протоколы в защищенном режиме(например, при игре в

покер, распределенные вычисления, вычисления с зашифрованными

данными, нераспознаваемые интерактивные протоколы и т.п.)

/BRAS87/. Другой пример объединения недружественных объектов - n

пользователей создают замкнутую группу, но хотят устанавливать

связь, только еслии по крайней мере k из них активны

однавременно. Такая защита называется (k,n)- пороговой схемой, и

ее используют, чтобы установить категории (уровни) участвующих

объектов /SHAM79/. Функции, процедуры и средства защиты объектов

ВС даны в табл.1.1. Таблица 1.1. Функции, процедуры и средства

защиты объектов ВС Защита объекта * Идентификация зашишенного

объекта * Подтверждение подлинности * Предоставление полномочий

Защита группы объектов * Взаимное подтверждение подлинности *

Цифровая сигнатура * Цифровая печать * Уведомление о вручении *

Средства подтверждения передачи * Защита отправлений по каналам

электронной почты * Защита при проведении телеконференций

Взаимодействие недружественных объектов * Подписание контракта *

Жеребьевка * (k,n) -пороговые схемы защиты Защита линий связи ВС

/VOYD83/ Линии связи - один из наиболее уязвимых компонентов ВС.

В их составе можно указать большое число потенциально опасных

мест, через которые злоумышленники могут проникнуть в ВС.

Действия злоумышленников квалифицируются как пассивные и активные

вторжения. В случае пассивного вторжения злоумышленник только

наблюдает за сообщениями, передаваемыми по линиям связи, не

нарушая их передачу. Такое вторжение называют наблюдением за

сообщениями (release of messeg contents). Даже если непонятны

сами данные, злоумышленник может наблюдать за управляющей

информацией, которая сопровождает сообщения, и таким образом

выявить размещение и идентификаторы объектов ВС. Наконец, он

может проверить длину сообщений, время отправления, частоту

сеансов связи. Последние два вида пассивных вторжений связывают

либо с анализом трафика /PURS86/, либо с нарушением защиты

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

является двухуровневая защита линий связи, при которой

реализуютсяследующие уровни защиты: защита процесса передачи

сообщения и шифрование текста самого сообщения. Тогда, даже если

шифрованный текст будет выделен из передаваемого сообщения, для

получения исходного текста потребуются дополнительные действия.

Это позволяет двум объектам обмениваться секретными сообщениями,

а злоумышленник, осуществляющий тайное наблюдение, остается

одураченным, полагая, что он в состоянии читать передаваемые

сообщения. Такой механизм называется чистым каналом /SIMM84/.

Другое, более жестокое требование, используемое для защиты

передаваемых сообщений, состоит в том, что истинные

идентификаторы объектов сети (зарегистрированные и используемые в

процессе верификации защищенных объектов) должны быть скрыты не

только от пассивных вторжений со стороны незарегистрированных

пользователей, но также и друг от друга. Такое средство защиты

называется цифровым псевдонимом /CHAU81/. В этом случае

пользователь получает разные идентификаторы для разных

соединений, тем самым скрывая истинные идентификаторы не только

от злоумышленников, но также и от равноправных партнеров.

Соответствующие средства защиты ВС, необходимые для

противодействия пассивным вторжениям в подсистемах связи состоят

в следующем: - защита содержания сообщения; - предотвращение

возможности анализа трафика; - чистый канал; - цифровой

псевдоним. Злоумышленник может организовать активные вторжения,

осуществляя различные манипуляции над сообщениями во время

соединения. Сообщения могут быть неявно модифицированы,

уничтожены, задержаны, скопированы, изменен порядок их

следования, введены в сеть через линию связи в более позднее

время. Могут быть также синтезированы ложные сообщения и введены

в сеть через канал передачи данных. В то время как активные

вторжения представляют собой комбинации способов, описанных в

разд. 1.2, соответствующие механизмы защиты существенно зависят

от способа вторжения. Поэтому целесообразно выделить следующие

категории активных вторжений: - воздействие на поток сообщений:

модификация, удаление, задержка, переупорядочение, дублирование

регулярных и посылка ложных сообщений; - воспрепятствие передаче

сообщений; - осуществление ложных соединений. Воздействие на

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

подлинности, целостности и порядку следования сообщений во время

соединения. В контексте коммуникационных функций ВС подтверждение

подлинности сообщения означает, что источник сообщения можно

надежно определить, т.у. указать, что полученное сообщение

передано данному объекту некоторым другим объектом в течение

времени соединения. Целостность сообщения означает, что сообщение

не модифицировалось в процессе передачи, а понятие "порядок

следования" означает, что местоположение сообщения в потоке

сообщений может быть проверено. Вторжение в процедуры

установления подлинности может быть осуществленно путем

модификации управляющей информации, сопровождающей сообщения, и

таким образом сообщения будут отосланы в неправильном направлении

или включать фиктивные сообщения (специально сформированные или

сохраненные из предшествующих соединений). Нарушение целостности

может быть вызвано модификацией части данных в сообщении, а

нарушение порядка следования - удалением сообщений или изменением

информации, управляющей передачей сообщения. Хотя защита от

воздействия на поток сообщений поддерживается коммуникационными

протоколами, в данном контексте защита направлена на то, чтобы

пресечь умышленные вторжения, а не просто защищаться от случайных

непреднамеренных ошибок элементов сети. Поэтому процедура защиты,

обеспечивающая противодействие угрозам целостности, порядку

следования и подлинностим отдельных сообщений, может быть

определена как обеспечение целостности потока сообщений.

Воспрепятствие передаче сообщения - вторая категория активных

вторжений в подсистемах связи. Она объединяет вторжения, в

которых злоумышленник либо удаляет все сообщения во время

соединения, либо действует в более мягкой манере, задерживая все

сообщения, идущие в одном или обоих направлениях. Такое вторжение

может быть организовано нелегальным пользователем, который,

генерируя интенсивный трафик фиктивных и подставных сообщений, не

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

связи. Трудноуловимое различие между атаками на поток сообщений и

воспрепятствием их передаче зависит от интенсивности атак и

состояния соединения. Например, механизмы защиты, обеспечивающие

целостность потока сообщений, могут выявить некоторые вторжения,

препятствующие передаче сообщений. Но если соединение пассивно,

т.е. все сообщения разрешаются в любом направлении, то протокол

функционирования объекта на одном из концов соединения может

оказаться не в состоянии определить, когда следующее сообщение

должно поступить от соответствующего объекта. В такой ситуации

невозможно определить угрозу с целью воспрепятствовать передаче

сообщения, которая полностью прерывала бы поток поступающих

сообщений. Чтобы защититься от таких вторжений, необходимы другие

механизмы защиты. Cоответствующая процедура защиты сети могла бы

быть названа процедурой поддержки непрерывности процесса

передачи. Она гарантирует взаимодействующим в ВС объектам

невозможность нелегального удаления всех сообщений в процессе

соединения без разрушения самого соединения. Осуществление ложных

соединений - третья категория активных вторжений в линии связи.

Она объединяет вторжения, в которых злоумышленник либо повторяет

записи предшествующих законных соединений, либо делает попытки

установить соединение под неправильным идентификатором. Чтобы

предупредить такие вторжения, процедура инициализации соединения

должна включать некоторые защищенные механизмы, которые

верифицируют целостность соединения (т.е. определяют, что попытка

соединения была выполнена в разрешенное время). Таблица 1.2.

Функции, процедуры и средства защиты линий связи ВС Функции,

процедуры и средства защиты от пассивных вторжений *

Конфиденциальность содержания сообщения *

Предотвращениевозможного анализа трафика * Чистый канал *

Цифровые псевдонимы Функции, процедуры и средства защиты от

активных вторжений * Поддержание целостности потока сообщений *

Поддержание непрерывности процесса передачи * Поддержание

подлинности соединения Чтобы устранить возможность входа в ВС с

неправильным идентификатором, соединение должно поддерживать

защищенную проверку протоколов объектов на каждом конце

соединения (взаимоподтверждение). Хотя верификация идентификатора

объекта - сложная проблема, которая может потребовать

подтверждения подлинности и контроля защищенности вне ВС, часть

проблемы идентификации должна быть решена в рамках ВС. Хотя эта

категория вторжений аналогична атакам на поток сообщений,

процедура инициализации соединения требует привлечения

дополнительных механизмов защиты. Такая процедура защиты может

быть названа подтверждением подлинности соединения. В табл. 1.2.

представлены функции, процедуры и средства защиты линий связи.

Защита баз данных ВС Защита БД означает защиту самих данных и их

контролируемое использование на рабочих ЭВМ сети, а также защиту

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

сгенерирована из этих данных. Управление данными при организации

защиты информационных баз /ISO87/, применяющие различные

механизмы защиты и криптографические ключи в качестве данных, не

входит в рассматриваемую группу средств защиты. такие процедуры

неявно вошли в процедуры защиты объектов ВС. Защита данных в

процессе передачи между узлами сети поддержана процедурами защиты

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

данных, то данные и их логические структуры представляются двумя

различными способами. Отдельные объекты данных могут быть сами

объектами защиты, но могут быть организованы в структуры БД

(сегменты, отношения, каталоги и т.п.). Защита таких структур

рассматривается в основном при анализе механизмов контроля

доступа. Подобный подход известен как внешняя защита данных.

Когда такие механизмы защиты относятся к защите отдельных

объектов данных, содержащихся в сетевой БД, подход к защите

данных определяется как внутренняя защита данных /DENN79/. Ниже

дана оценка текущего состояния разработки функций, процедур и

средств внутренней защиты данных, их возможностям и ограничениям.

Функции, процедуры и средства защиты, которые обеспечивают защиту

данных на рабочих ЭВМ, могут быть описаны следующим образом: 1.

Защита содержания данных (data content protection) объединяет

функции, процедуры и средства защиты, которые предупреждают

несанкционированное раскрытие конфиденциальных данных и

информации из БД /DENN79/. 2. Средства контроля доступа (acces

control security service) разрешают доступ к данным только

полномочных объектов в соответствии со строго определенными

правилами и условиями /BUSS81/. 3. Управление потоком защищенных

данных (security-consistent flow of data) при передаче из одного

сегмента БД в другой обеспечивает перемещение данных вместе с

механизмами защиты, присущими исходным данным /DENN79/. 4.

Предотвращение возможности выявления (prevention of inference)

конфиденциальных значений из данных, содержащихся в регулярных

или схоластических БД /DENN79/, в результате выявления

статистически достоверной информации. 5. Контроль согласованности

(consistency control) при использовании БД предполагает процедуры

защиты, которые обеспечивают защиту и целостность отдельных

элементов данных, в частности их значений (зависимость от

значений). Успешная реализация таких процедур в ВС означает, что

данные в БД всегда логически связаны и значения критических

данных передаются от узла к узлу только при наличии специальных

полномочий /CONN72/. 6. Контексная защита (contect protection)

данных, характерная для схем защиты динамических БД, также должна

быть включена в состав процедур защиты БД. В этом случае защита

отдельного элемента БД в каждый данный момент времени зависит от

проведения всей системы защиты, а также предшествующих операций,

выполненных над этим элементом (зависимость от предыстории)

/HART76/. 7. Предотвращение создания несанкционированной

информации (presentation of unauthorized information generation)

предполагает наличие средств, которые предупреждают, что объект

получает (генерирует) информацию, превышающую уровень прав

доступа, и осуществляет это, используя логическую связь между

данными в БД /MUFT77/. В таблице 1.3 приведен перечень функций,

процедур и средств защиты сетевых БД. Таблица 1.3. Функции,

процедуры и средства защиты БД в ВС Защита содержания данных

Средства контроля доступа Управление потоком защищенных данных

Предотвращение возможности выявления конфиденциальных значений

Контроль согласованности данных (зависимость от значения)

Контекстная защита данных (зависимость от предыстории)

Предотвращение создания несанкционированной информации Защита

подсистемы управления ВС Четвертая группа средств защиты - защита

процессов, циркулирующих в ВС. Здесь используются два понятия -

объект и среда. Объект - любой активный компонент ВС (как это

определено выше), а среда - операционное окружение этого объекта

в тот интервал времени, когда объект активен и представляет собой

некоторое расширительное толкование понятия субъекта /GRAH72/.

Некоторые функции управления процессами уже упоминались при

описании функций, процедур и средств защиты объектов и баз данных

ВС. Поскольку пользователи являются активными объектами ВС, то их

идентификация и подтверждение подлинности ничем не отличается от

соответствующих процедур для любых других компонентов сети.

Аналогично когда обсуждаются средства защиты управления доступом

к сегментам БД, то можно воспользоваться теми же процедурами для

пресечения нелегального доступа к ресурсам сети. Среди большого

числа различных процедур управления процессами следует выделить

следующие шесть: - обеспечение защиты ресурсов сети от

воздействия неразрешенных процессов и несанкционированных

запросов от разрешенных процессов; - обеспечение целостности

ресурсов при нарушении расписания и синхронизации процессов в

сети, ошибочных операций; - обеспечение целостности ресурсов при

нарушении расписания и синхронизации процессов в сети, ошибочных

операций; - обеспечение защиты ресурсов сети от

несанкционированного контроля, копирования или использования

(защита программного обеспечения); - обеспечение защиты при

взаимодействии недружественных программных систем (процессов); -

реализация программных систем, не обладающих памятью; - защиты

распределения вычислений. Первые три процедуры связаны с защитой

и обеспечением целостности ресурсов ВС (включая процессы), в то

время как последние три относятся к организации вычислительных

процессов в сети и реализации сетевого окружения. Механизмы

защиты ресурсов ВС должны контролировать доступ к объектам ВС,

особенно информационным. Диапазон требований к этим механизмам

защиты включает, с одной стороны, полную изоляцию выполняемой

программы от других программ, а сдругой - разрешение их

взаимодействия и совместного использования. Внутри этого

диапозона можно выделить еще 4 подуровня, причем реализация

каждого последующего более сложна по сравнению с преддущим

/GRAH72/: - запрещение совместного использования ресурсов (полная

изоляция процессов); - совместное использование копий ресурсов

(программ и сегментов баз данных); - совместное использование

самих ресурсов (программ и сегментов баз данных); - совместное

использование программных систем или подсистем. Эти четыре

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

функций при условии обеспечения защиты и целостности сетевых

ресурсов. Это означает, что процессы в ВС должны поддерживаться

подсистемами, корректность функционирования которых проверена и

гарантирована. Целостность ресурсов ВС может быть разрушена ,

хотя каждый из взаимодействующих процессов функционирует

правильно. Несовместимость некоторого ресурса может проявиться

из-за возможного нарушения расписания событий в сети, т.е. при

нарушении последовательности выполняемых процессов. Вместо

понятия правильного расписания можно воспользоваться другим

понятием, которое позволяет дать полезные для практики способы

управления процесами в сети, - понятием конфликтности /PAPA83/.

Говорят, что два события конфликтуют, если либо оба связаны с

выполнением операций записи для одного и того же объекта, либо

над одним и тем же объектом делается попытка выполнить

одновременно операции записи и чтения. Поэтому для полноты списка

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

добавить условие соблюдения порядка следования сообщений, что

гарантирует поддержку целостности ресурсов сети. Защита процессов

как сетевых ресурсов имеет два аспекта: защита от нелегального

просмотра (защита содержания) и защита от несанкционированного

копирования и распространения. Наиболее подходящий механизм для

защиты содержания сообщений - криптография, хотя для реализации

защиты програмного обеспечения никаких практически значимых

криптографических схем до сих пор не предложено. Но некоторые

идеи и решения уже можно найти в литературе /HERZ86/. Защита от

несанкционированного копирования и распространения может быть

обеспечена механизмами защиты, используемыми для обеспечения

контроля доступа. Другая процедура, связанная с защитой процессов

в ВС, - взаимодействие недружественных подсистем. Эта защита

должна обеспечивать процессы некоторыми сетевыми ресурсами с

гарантией, что их активность санкционирована. Одна из хорошо

известных угроз такой защите - так называемая атака троянского

коня. Сетевой процесс рассматривается как некоторая машина с

конечным числом состояний, память которой может быть источником

нелегального доступа к несанкционированной информации, процессам

или подсистемам. Такая память может быть представлена как память,

аккумулирующая отдельные значения, некоторую информацию или

последовательности состояний процесса. Для того чтобы

предотвратить эти угрозы, реализация сетевых подсистем с

забыванием должна быть одной из функций защиты ВС. Применение

таких средств означает, что никакие процессы не могут порождать

защищенную информацию ни путем сохранения данных и информации, ни

путем выполнения каких-либо специальных последовательностей

операций. В процедурах защиты распределенных вычислений,

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

f(x1, x2,....xn) n аргументов, эти аргументы должны удовлетворять

следующим условиям: - не должны быть доступны ни порознь, ни в

целом группой /YAO82/; - должны быть зашифрованы /FEIG86/. В

табл. 1.4 представлены процедуры и средства защиты процессов в

ВС. Таблица 1.4 Функции, процедуры и средства защиты подсистемы

управления ВС Защита и обеспечение целостности сетевых ресурсов *

Выявление процессов и посистем * Контроль конфликтности процессов

* Защита программного обеспечения Принципы организации сетевых

вычислений * Взаимодействие недружественных подсистем *

Реализация процессов, не обладающих памятью * Защита

распределенных вычислений Концепция защищенной ВС может быть

сформулирована, исходя из перечня функций, процедур и средств

защиты, перечисленных в табл. 1.1 - 1.4, следующим образом:

Определение 1.5. Защищенная ВС - это сеть, в которой все операции

выполняются только при соблюдении строго определенных правил и

условий или, другими словами, если все функции, процедуры и

средства защиты, перечисленные в табл. 1.1 - 1.4, реализованы в

ВС. Авторы осазнают, что ,возможно, существует более строгое

формальное определение защищенной ВС, но считают, что в настоящее

время изложенная концепция достаточна для формулировки

определения.







Защита программных продуктов

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

     Использование микропроцессорной технологии (а куда сейчас без нее?). Электронные ключи, выполненные по технологии Stealth, имеют встроенный микроконтроллер. Это обстоятельство открывает множество принципиально новых возможностей защиты (а заодно и возможностей снятия их :)).
     В процессе создания защиты используются аппаратные алгоритмы типа Y=F(X). В отличие от своих прототипов, Stealth-ключи имеют аппаратные алгоритмы кодирования данных. Они обеспечивают дополнительный уровень защищенности от взлома.
     Используется до 18 алгоритмов в одном Stealth-ключе, т.е. в одном Stealth-ключе можно организовать до 18 различных аппаратных алгоритмов и, соответственно, для защиты одного программного продукта можно одновременно пользоваться несколькими алгоритмами (до 18). Это еще больше усложнят процесс взлома защиты.
     Аппаратные алгоритмы обладают достаточно высокой сложностью. В формировании каждого аппаратного алгоритма участвует так называемый определитель — последовательность байт, защищенная от чтения и модификации. Длина определителя может достигать 200 байт или 1600 бит. Нетрудно подсчитать, что для подбора алгоритма с таким определителем придется перебрать до 21600 различных комбинаций. Взяв минимальное время работы такого алгоритма, получим, что для его подбора потребуется порядка 10475 тысячелетий (теория, теория...).
     Уникальность аппаратных алгоритмов каждого пользователя защиты. Каждый пользователь защиты на базе Stealth-ключей получает электронные ключи с несколькими созданными по умолчанию аппаратными алгоритмами, вид определителя которых уникален.
     Есть возможность создания собственных аппаратных алгоритмов. В результате электронный ключ станет кодировать данные по алгоритму, конкретный вид и свойства которого будут отличаться от свойств и вида другого ключа.
     Использование свойств аппаратного алгоритма. В создании аппаратного алгоритма Stealth-ключа участвует также и комбинация свойств алгоритма, которую можно задать самому. Можно сделать алгоритмы одинаковыми у всех Stealth-ключей для данного защищаемого программного продукта, либо сделать их зависимыми от абсолютно уникальной величины — ID Stealth-ключа. Можно создать алгоритм с ограничением числа его запусков для надежной защиты демо-версий программ.
     Кодирование до 255 байт данных одновременно. Любой из аппаратных алгоритмов Stealth-ключа за один сеанс способен обработать до 255 байт (или 2040 бит) данных. Причем на шифруемую последовательность длиной N байт накладывается нециклическая шифрующая последовательность длиной N байт. Возможность кодирования большого объема данных обеспечивает дополнительную защиту от подбора верных ответов Stealth-ключа.
     Наличие "быстрых" алгоритмов. Помимо аппаратных алгоритмов, можно использовать для защиты алгоритм быстрого преобразования данных. Эта возможность позволяет производить кодирование сверхбольших объемов данных с такой высокой скоростью, что сам процесс будет совершенно незаметен для пользователя защищенного приложения.
     Множественность кодов доступа к электронному ключу. Для выполнения любой операции со Stealth-ключом требуется задать код доступа к нему. Существуют Общий код и 3 Личных кода доступа. Не зная какого-либо из Личных кодов, невозможно выполнить с ключом и соответствующий этому коду набор операций. Использование нескольких кодов доступа значительно осложняет задачу получения любого нелегального доступа к Stealth-ключу.
     Аппаратные запреты. Можно наложить аппаратные запреты на чтение или запись любой области доступной памяти Stealth-ключей. И тогда никакими программными средствами не удастся ни считать, ни модифицировать данные, записанные в этой области памяти (если бы все было так).
     Кодирование данных в памяти Stealth-ключа. Все данные хранятся в памяти Stealth-ключей в кодированном виде, причем в каждом ключе кодирование производится уникальным образом. Самим же процессом кодирования/декодирования занимается микроконтроллер ключа. Такой метод хранения данных теоретически делает бессмысленным их считывание — даже при помощи дорогостоящих аппаратных устройств. Например, для получения аппаратной копии ключа нужно эти данные записать в другой Stealth-ключ (так называемый ключ-копию). Но микроконтроллер любого другого Stealth-ключа будет неверно интерпретировать эти данные, так как будет декодировать их иначе - в соответсвии со своим алгоритмом (тогда какая это, блин, копия?).
     Аппаратная блокировка отладчиков. Stealth-ключ имеет уникальную аппаратную защиту от изучения логики его работы под отладчиком. Если ключ обнаружит, что протокол обмена с ним выполняется в среде отладчика (а в этом случае все временные интервалы неизбежно увеличиваются), он попросту перестает отвечать на любые запросы.

Это по поводу прозрачности ключа - периферийное устройство работает как-будто бы без него.
 
     Протокол обмена со Stealth-ключом:
     "Плавающий". Вместе с реальными данными между защищенной программой и ключом передается специально генерируемый "мусор"— ничего не значащие данные (для исследования-то они как раз значащие).
     Кодированный. Все данные, курсирующие между программой и электронным ключом, непрерывно кодируются.
     Эти два свойства протокола помогают обеспечить надежную защиту от создания эмуляторов Stealth-ключей.
     Самонастраивающийся. В процессе работы происходит оптимальная настройка параметров протокола на особенности аппаратного и программного окружения.
     С автоматической верификацией. Любая операция записи в память Stealth-ключа сопровождается автоматической операцией верификации — записанные данные обязательно проверяются на адекватность.
     С автоповторами. Если из-за помех, вносимых другими устройствами, при обмене с ключом возникает сбой, то производятся автоматические повторы выполнения операции.
     Эти свойства значительно повышают надежность обмена со Stealth-ключом и обеспечивают ему высокий уровень совместимости с аппаратным и программным обеспечением.


Исследование и снятие защиты.

Создание аппаратной копии электронного ключа.


     С помощью специальных программных или аппаратных средств считывают содержимое микросхемы памяти электронного ключа и переносят эту информацию в аналогичные микросхемы памяти других электронных ключей. Таким образом создаются аппаратные копии электронного ключа, пригодные для работы с защищенной программой.
     Создание аппаратных копий ключа применимо только в тех случаях, когда известен конкретный тип микросхемы памяти, когда имеется программатор для записи данных в микросхему памяти ключа-копии и, самое главное,— при условии, что память электронного ключа никак не защищена от ее нелегального считывания. Именно это третье условие и стало слабым местом некоторых марок электронных ключей, именно слабость (а то и полное отсутствие) защиты данных в памяти ряда ключей обусловило распространение и успешное применение этого метода взлома.
     Методу присущи несколько недостатков. Главный из них в том, что, даже получив нелегальную копию программы, не удастся решить задачу ее незаконного распространения — ведь копия так и осталась защищенной, просто теперь она “привязана” к “левому” электронному ключу. Кроме этого, достаточно велика стоимость такого копирования — зачастую дешевле просто купить легальную копию продукта. Поэтому такой метод не получил широкого распространения.

Создание эмулятора электронного ключа.


     Изучив внутреннюю логику работы электронного ключа, создается некий программный модуль — резидентная программа, DLL, драйвер и т.п., — который эмулирует (то есть воспроизводит) работу электронного ключа. Качественно написанный эмулятор способен воспроизвести работу ключа во всех тонкостях, включая особенности протокола обмена между защищенной программой и ключом, генерацию им верных ответов и т.д. В результате защищенная программа будет спокойно работать, даже не подозревая о подмене.
     По степени универсальности эмуляторы можно разделить на универсальные (эмулируют работу любого электронного ключа определенной марки) и неуниверсальные или crack’и (эмулируют работу всех ключей конкретного пользователя защиты, ключей, поставляемых с определенным программным продуктом или с определенной его версией, либо одного конкретного ключа).
     По принципу организации эмуляторы можно разделить на эмуляторы структуры ключа (как правило, это универсальные эмуляторы ключей без аппаратных алгоритмов либо ключей с примитивно простыми аппаратными алгоритмами) и эмуляторы ответов электронных ключей. При этом первые воспроизводят структуру электронного ключа во всех ее тонкостях, что и обусловливает их универсальность, а вторые используют специально созданную таблицу верных ответов ключа.
     Но в любом случае эмуляторы должны верно воспроизводить не только посылаемые ключом данные, но и протокол обмена с ним (в противном случае защищенная программа не сможет "понять" передаваемые эмулятором данные).
     Эмуляторы электронных ключей — это мощный и эффективный метод взлома программно-аппаратной защиты, получивший достаточно широкое распространение. В настоящее время разработчики электронных ключей используют следующие методы борьбы с программной эмуляцией:
     1. "Плавающий" протокол обмена с электронным ключом. Данные, передаваемые между электронным ключом и программой, искусственно "зашумляются", причем с течением времени характер передаваемого вместе с данными "шума" меняется хаотическим образом. Так как эмулятор обязан воспроизводить не только поступающие от ключа данные, но и все особенности протокола обмена с ним, "зашумление" протокола обмена сильно усложняет (и удорожает) задачу написания эмулятора. В настоящее время практически все разработчики электронных ключей применяют "плавающие" протоколы обмена.
     2. Использование для защиты аппаратных алгоритмов электронного ключа. Оно позволяет существенно усложнить логику работы ключа — на запрос программы он будет возвращать нечто гораздо более сложное, чем просто "да / нет". Соответственно, для того чтобы написать универсальный эмулятор такого ключа, нужно как минимум составить список верных ответов на все возможные вопросы, что может быть чрезвычайно трудоемко и дорого. Сегодня электронные ключи многих марок содержат аппаратные алгоритмы, отличающиеся степенью сложности и свойствами. Однако, к сожалению, отнюдь не всякий аппаратный алгоритм способен надежно защитить электронный ключ от эмуляции. Для этого аппаратный алгоритм должен быть сложным, чтобы его нельзя было вычислить эмпирическим путем; он должен уметь обрабатывать большой объем информации за один сеанс (например, если алгоритм может одновременно преобразовывать только 2 байта данных, это означает, что количество всех возможных вопросов — а значит и ответов — ключа равно 65536. Для составления полной таблицы ответов такого ключа потребуется меньше часа. Электронные ключи у разных пользователей системы защиты должны содержать разные аппаратные алгоритмы, чтобы нельзя было написать универсальный эмулятор для всех электронных ключей этой марки.

Отделение модуля автоматической защиты.


     Метод автоматической защиты готовых программ (его еще называют методом envelope или "конвертом" защиты) доступен практически во всех системах программно-аппаратной защиты. Его преимущества: при помощи специальной утилиты в считанные секунды можно "повесить" защиту на любую готовую программу. Экономится масса времени, которого всегда не хватает, не требуется никаких навыков в области построения защиты, а порой этот метод вообще является единственно возможным (например, если по каким-либо причинам недоступны исходные тексты защищаемых программ). Однако у этого метода есть слабое место. Так как защита устанавливается на готовую программу, она не может образовать с программной неразрывного целого. Модуль автоматической защиты как бы "приклеивается" к программе, а это значит, что есть теоретическая возможность отделить, "отклеить" его — причем без ущерба для самой программы. Да и опыт в этом плане накоплен большой, есть даже специальные утилиты автоматического взлома программ, защищенных таким методом.
     Абсолютно надежного способа противодействия взлому автоматической защиты не существует, и ее взлом — это лишь вопрос времени. А время взлома такой защиты, в свою очередь, зависит от ее качества. В наибольшей степени страдает автоматическая защита тех систем, разработчики которых не учли уже используемых специфических приемов взлома. Но существует и весьма надежная автоматическая защита, которая не поддается "стандартным" утилитам автоматического взлома и вынуждает выполнять большую часть работы вручную. Соответственно возрастает стоимость взлома, и в ряде случаев оказывается более выгодным приобрести легальную копию программы.
     Другой действенный метод спасти защиту от быстрого взлома — это комбинирование автоматической защиты с защитой при помощи функций API. В этом случае, даже "отсоединив" модуль автоматической защиты, еще не получим незащищенной программы — во многих местах ее тела останутся нетронутыми вызовы функций API защиты.
 

Удаление вызовов функций API.


     Помимо автоматической защиты, в распоряжение пользователя предоставлен набор функций API защиты. Как правило, API существуют для всех популярных языков программирования и содержат самые разнообразные функции. Пользователь защиты должен вписать вызовы нужных функций в исходный текст защищаемой программы, скомпилировать и слинковать его с соответствующим объектным модулем API. В результате защита будет внедрена глубоко в тело программы, и при правильной организации логики своей работы будет составлять с программой неразрывное целое. Взломать защиту такого типа гораздо сложнее, чем автоматическую — хотя бы потому, что невозможно создать универсальное средство автоматического взлома. При помощи дисассемблеров и отладчиков изучается логика работы программы, находятся места, в которых происходят вызовы функций API (либо точки входа в сами эти функции — смотря что оказывается проще), и нужным образом исправляется программный код. Для борьбы с этим методом взлома есть несколько испытанных способов:
     1. Комбинирование защиты при помощи функций API с автоматической. Хорошая автоматическая защита умеет защищать программу и от дисассемблера, и от отладчика. Следовательно, для того чтобы использовать весь инструментарий в полную силу, придется сначала "снять" модуль автоматической защиты. Кстати, именно поэтому все разработчики защиты рекомендуют комбинировать оба метода. Модуль автоматической защиты должен образовывать "внешний уровень обороны", защищая программу от дилетантов и скрывая от любопытных глаз ядро защиты, реализованное функциями API.      2. Усложнение логики работы самих модулей защиты. Профессиональные системы защиты имеют в своем арсенале много внутренних методов борьбы с изучением логики их работы. Кодирование тела модулей автоматической защиты и библиотек API, "зашумление" фрагментов их кода, подсчет контрольных сумм важных участков кода — эти и многие другие меры способны существенно усложнить процесс исследования логики работы самих модулей защиты.
     3. Разработка нетривиальной логики взаимодействия программы и защиты. Не приходится рассчитывать на приемлемый уровень защищенности программы, если информация, возвращаемая функциями API, используется программой для банального сравнения: "верно / неверно". Есть множество эффективных приемов усложнения логики работы программы с модулями защиты. Откладывание реакции программы на информацию, полученную от ключа, использование ответных данных ключа в качестве индексов каких-либо массивов, подсчет контрольных сумм данных с использованием значений, полученных от ключа и т.д.— это лишь наиболее простые из таких приемов. Воспользовавшись ими и им подобными, можно создать защищенную программу, разобраться в логике работы которой будет уже сложнее. В результате шансы удалить из программы все вызовы функций API без последствий для самой программы станут минимальными. "Остатки" защиты постоянно будут проявляться во взломанной программе, ограничивая ее возможности и нарушая нормальный ход ее работы. Такую программу можно рассматривать лишь как демонстрационную — ведь пользователь не сможет использовать все ее возможности и рано или поздно будет вынужден приобрести легальную копию такой программы.
     4. Использование ответов аппаратных алгоритмов в работе программы. На этапе установки защиты важные для программы данные можно закодировать при помощи аппаратного алгоритма ключа и в таком виде записать их в тело программы. В процессе работы программа в нужные моменты будет запускать аппаратный алгоритм, декодирующий эти данные, а затем использовать их по назначению. При такой схеме организации защиты даже полное удаление из программы всех обращений к функциям API ничего не дает. Ведь защищенная программа содержит свои важные данные в кодированном виде, и раскодировать их, не имея электронного ключа, нельзя.
     Кого заинтересовала данная тема - можете подробнее почитать о ключах Stealth здесь.



















Не только защита

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

Демо-версии

С помощью электронных ключей легко создавать демо-версии программных продуктов без написания демонстрационного варианта программы. Можно свободно распространять копии, заблокировав или ограничив некоторые возможности программы, которые активируются только с помощью ключа. Или же предоставлять пользователям полнофункциональную программу в качестве пробной («trial») версии, ограничив количество ее запусков.

Аренда и лизинг

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

Продажа программы по частям (помодульная продажа)

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

Лицензирование в локальных вычислительных сетях

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


© Рефератбанк, 2002 - 2024