Рефераты
 

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

p align="left">Почему проблема использования криптографических методов в информационных системах (ИС) стала в настоящий момент особо актуальна?

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

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

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

Проблемой защиты информации путем ее преобразования занимается криптология. Криптология разделяется на два направления - криптографию и криптоанализ. Цели этих направлений прямо противоположны.

Криптография занимается поиском и исследованием методов преобразования информации с целью скрытия ее содержания.

Сфера интересов криптоанализа _ исследование возможности расшифровывания информации без знания ключей.

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

Симметричные криптосистемы.

Криптосистемы с открытым ключом.

Системы электронной цифровой подписи (ЭЦП).

Системы управление ключами.

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

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

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

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

Текст _ упорядоченный набор из элементов алфавита.

В качестве примеров алфавитов, используемых в современных ИС можно привести следующие:

алфавит Z33 - 32 буквы русского алфавита (исключая "ё") и пробел;

алфавит Z256 - символы, входящие в стандартные коды ASCII и КОИ-8;

двоичный алфавит _ Z2 = {0,1};

восьмеричный или шестнадцатеричный алфавит.

Шифрование - процесс преобразования исходного текста, который носит также название открытого текста, в шифрованный текст.

Расшифрование - процесс, обратный шифрованию. На основе ключа шифрованный текст преобразуется в исходный.

Криптографическая система представляет собой семейство T преобразований открытого текста. Члены этого семейства индексируются, или обозначаются символом k; параметр k обычно называется ключом. Преобразование Tk определяется соответствующим алгоритмом и значением ключа k.

Ключ - информация, необходимая для беспрепятственного шифрования и расшифрования текстов.

Пространство ключей K - это набор возможных значений ключа.

Криптосистемы подразделяются на симметричные и асимметричные (или с открытым ключом).

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

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

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

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

Кpиптостойкостью называется характеристика шифра, определяющая его стойкость к расшифрованию без знания ключа (т.е. криптоанализу). Имеется несколько показателей криптостойкости, среди которых:

· количество всех возможных ключей;

· среднее время, необходимое для успешной криптоаналитической атаки того или иного вида.

Эффективность шифрования с целью защиты информации зависит от сохранения тайны ключа и криптостойкости шифра.

2.2.2. Асимметричные криптосистемы

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

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

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

Криптосистема с открытым ключом определяется тремя алгоритмами: генерации ключей, шифрования и расшифрования. Алгоритм генерации ключей открыт, всякий может подать ему на вход случайную строку r надлежащей длины и получить пару ключей (k1, k2). Один из ключей (например, k1) публикуется, он называется открытым, а второй, называемый секретным, хранится в тайне. Алгоритмы шифрования и расшифрования таковы, что для любого открытого текста m .

Рассмотрим теперь гипотетическую атаку злоумышленника на эту систему. Противнику известен открытый ключ k1, но неизвестен соответствующий се-кретный ключ k2. Противник перехватил криптограмму d и пытается найти сообщение m, где . Поскольку алгоритм шифрования открыт, противник может просто последовательно перебрать все возможные сообщения длины n, вычислить для каждого такого сооб-щения mi криптограмму и сравнить di с d. То сообщение, для которого di = d и будет искомым открытым текстом. Если пове-зет, то открытый текст будет найден достаточно быстро. В худшем же случае перебор будет выполнен за время порядка 2nT(n), где T(n) - время, требуемое для шифрования сообщения длины п. Если сообщения имеют длину порядка 1000 битов, то такой перебор неосуществим на практике ни на каких самых мощных компьютерах.

Мы рассмотрели лишь один из возможных способов атаки на кри-птосистему и простейший алгоритм поиска открытого текста, назы-ваемый обычно алгоритмом полного перебора. Используется также и другое название: «метод грубой силы». Другой простейший алгоритм поиска открытого текста - угадывание. Этот очевидный алгоритм требует небольших вычислений, но срабатывает с пренебрежимо малой вероятностью (при больших длинах текстов). На самом деле противник может пытаться атаковать криптосистему различными способами и использовать различные, более изощренные алгоритмы поиска откры-того текста.

Для примера кратко расскажем о нескольких классических асимметричных системах шифровани.

2.2.2.1. Криптосистема Эль-Гамаля

Система Эль-Гамаля - это криптосистема с открытым ключом, основанная на пр
облеме логарифма. Система включает как алгоритм шифрования, так и алгоритм цифровой подписи.

Множество параметров системы включает простое число p и целое число g, степени которого по модулю p порождают большое число элементов Zp. У пользователя A есть секретный ключ a и открытый ключ y, где y = ga (mod p). Предположим, что пользователь B желает послать сообщение m пользователю A. Сначала B выбирает случайное число k, меньшее p. Затем он вычисляет

y1 = gk (mod p) и y2 = m Е (yk (mod p)),

где Е обозначает побитовое "исключающее ИЛИ". B посылает A пару (y1, y2).

После получения шифрованного текста пользователь A вычисляет

m = (y1a mod p) Е y2.

Известен вариант этой схемы, когда операция Е заменяется на умножение по модулю p. Это удобнее в том смысле, что в первом случае текст (или значение хэш-функции) необходимо разбивать на блоки той же длины, что и число yk (mod p). Во втором случае этого не требуется и можно обрабатывать блоки текста заранее заданной фиксированной длины (меньшей, чем длина числа p).

2.2.2.2. Криптосистема Ривеста-Шамира-Эйделмана

Система Ривеста-Шамира-Эйделмана (Rivest, Shamir, Adlеman - RSA) представляет собой криптосистему, стойкость которой основана на сложности решения задачи разложения числа на простые сомножители. Кратко алгоритм можно описать следующим образом:

Пользователь A выбирает пару различных простых чисел pA и qA , вычисляет nA = pAqA и выбирает число dA, такое что НОД(dA, j(nA)) = 1, где j(n) - функция Эйлера (количество чисел, меньших n и взаимно простых с n. Если n = pq, где p и q - простые числа, то j(n) = (p _ 1)(q _ 1)). Затем он вычисляет величину eA, такую, что dAЧeA = 1 (mod j(nA)), и размещает в общедоступной справочной таблице пару (eA, nA), являющуюся открытым ключом пользователя A.

Теперь пользователь B, желая передать сообщение пользователю A, представляет исходный текст

x = (x0, x1, ..., xn-1), x О Zn , 0 Ј i < n,

по основанию nA:

N = c0+c1 nA+....

Пользователь В зашифровывает текст при передаче его пользователю А, применяя к коэффициентам сi отображение :

,

получая зашифрованное сообщение N'. В силу выбора чисел dA и eA, отображение является взаимно однозначным, и обратным к нему будет отображение

Пользователь А производит расшифрование полученного сообщения N', применяя .

Для того чтобы найти отображение , обратное по отношению к , требуется знание множителей nA = pAqA. Время выполнения наилучших из известных алгоритмов разложения при n > 10145 на сегодняшний день выходит за пределы современных технологических возможностей.

2.2.2.3. Криптосистема, основанная на эллиптических кривых

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

2.2.3. Адаптированный метод асимметричного шифрования

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

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

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

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

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

2.3. Преимущества применения полиморфных алгоритмов шифрования

К преимуществам применения полиморфных алгоритмов шифрования для систем, по функциональности схожим с АСДО, можно отнести следующие пункты:

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

· сложность создания универсальных средств для обхода системы защиты;

· легкая реализация системы асимметрического шифрования;

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

· возможность расширения виртуальной машины с целью сокрытия части кода.

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

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

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

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

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

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

2.4. Функциональность системы защиты

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

1.
Генератор полиморфных алгоритмов шифрование и расшифрования.

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

3. Асимметричная система шифрования данных.

4. Ограничение использования полиморфных алгоритмов по времени.

5. Защита исполняемых файлов от модификации.

6. Контроль за временем возможности запуска исполняемых файлов.

7. Поддержка таблиц соответствий между именами зашифрованных файлов и соответствующих им алгоритмам шифрования/расшифрования.

8. Упаковка шифруемых данных.

ГЛАВА 3. РЕАЛИЗАЦИЯ СИСТЕМЫ ЗАЩИТЫ

3.1. Выбор средств разработки и организации системы

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

Естественным выбором будет использование Visual C++. Он отвечает всем необходимым требованиям. Также понадобится библиотека для сжатия данных. Наиболее подходящим кандидатом является библиотека ZLIB. Теперь рассмотрим по отдельности каждый из этих компонентов, с целью показать почему был сделан именно такой выбор. В рассмотрение войдут: язык С++, среда Visual C++, библиотека активных шаблонов (ATL), библиотека ZLIB.

3.1.1. Краткая характеристика языка программирования С++

Объектно-ориентированный язык С++ создавался как расширение языка Си. Разработанный Бьярном Страуструпом (
Bjarne Stroustroup) из AT&T Bell Labs в начале 80-х, С++ получил широкое распространение среди программистов по четырем важным причинам.

· В языке С++ реализовано несколько дополнений к стандартному Си. Наиболее важным из этих дополнений является объектная ориентация, которая позволяет программисту использовать объектно-ориентированную парадигму разработки.

· Компиляторы С++ широко доступны, а язык соответствует стандартам ANSI.

· Большинство программ на С++ широко доступны, а язык соответствует стандартам ANSI.

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

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

Хотя большинство экспертов рассматривают С++ как самостоятельный язык, фактически С++ представляет собой развитое объектно-ориентированное расширение Си, или объектно-ориентированный «гибрид». Язык допускает смешанное программирование с использованием концепции программирования Си и объектно-ориентированной концепции, и это можно охарактеризовать как недостаток.

Объектно-ориентированное программирование (ООП) основная методология программирования 90-х годов. Она является результатом тридцатилетнего опыта и практики, которые берут начало в языке Simula 67 и продолжаются в языках Smalltalk, LISP, Clu и в более поздних Actor, Eiffel, Objective C, Java и С++. ООП это стиль программирования, который фиксирует поведение реального мира так, что детали разработки скрыты, а это позволяет тому, кто решает задачу, мыслить в терминах, присущих этой задаче, а не программирования. ООП это программирование, сфокусированное на данных, причем данные и поведение неразрывно связаны. Они вместе составляют класс, а объекты являются экземплярами класса.

С++ относительно молодой и развивающийся язык, только в 1998 году был утвержден стандарт ANSI, и еще не все компиляторы полностью соответствуют этому стандарту. Тем не менее язык очень популярен и распространен не меньше, чем Си.

Выбор был остановлен на языке С++ по следующим причинам. Поскольку будет использоваться среда Visual C++, то нет смысла отказываться от преимуществ языка С++, тем более, что программа достаточно сложная. Например, механизмы исключений могут быть весьма полезны. Еще одним преимуществом является возможность использовать умные указатели на COM интерфейсы, что часто бывает очень удобно. Использование библиотеки ATL тоже подразумевает необходимость языка С++, так как она написана именно на нем.

3.1.2. Краткая характеристика среды Visual C++

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

Чтобы облегчить работу программиста практически все современные компиляторы с языка C++ содержат специальные библиотеки классов. Такие библиотеки включают в себя практически весь программный интерфейс Windows и позволяют пользоваться при программировании средствами более высокого уровня, чем обычные вызовы функций. За счет этого значительно упрощается разработка приложений, имеющих сложный интерфейс пользователя, облегчается поддержка технологии COM и взаимодействие с базами данных.

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

Подобные средства автоматизированного создания приложений включены в компилятор Microsoft Visual C++ и называются MFC AppWizard. Заполнив несколько диалоговых панелей, можно указать характеристики приложения и получить его тексты, снабженные обширными комментариями. MFC AppWizard позволяет создавать однооконные и многооконные приложения, а также приложения, не имеющие главного окна, -вместо него используется диалоговая панель. Можно также включить поддержку технологии COM, баз данных, справочной системы.

Среда Visual C++ 6.0 была выбрана как одно из лучших средств разработки на языке С++ для ОС Microsoft Windows. Немаловажным фактором является ее поддержка такими утилитами, как Visual Assist, BoundsChecker, которые в свою очередь позволяют создавать программы более быстро и качественно. Компилятор Visual C++ генерирует достаточно оптимизированный код, что весьма важно для разрабатываемого приложения.

3.1.3. Краткая характеристика библиотеки ATL

Библиотека активных шаблонов (ATL) представляет собой основу для создания небольших СОМ - компонентов. В ATL использованы новые возможности шаблонов, добавленные в C++. Исходные тексты этой библиотеки поставляются в составе системы разработки Visual C++. Кроме того, в эту систему разработки введено множество мастеров Visual C++, что облегчает начальный этап создания ATL-проектов.

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

§ Утилита AppWizard, предназначенная для создания первичного ATL-проекта.

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

§ Поддержка по умолчанию основных интерфейсов COM, таких как IUnknown и IClassFactory.

§ Поддержка механизма транспортировки пользовательского интерфейса.

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

§ Существенная поддержка разработки небольших элементов управления ActiveX.

Основной задачей ATL является облегчение создания небольших СОМ-компонентов. Задача MFC -- ускорение разработки больших Windows-приложений. Функции MFC и ATL несколько перекрываются, в первую очередь в области поддержки OLE и ActiveX.

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

3.1.4. Краткая характеристика библиотеки ZLIB

Библиотека ZLIB представляет собой небольшую и удобную библиотеку на языке С. Ее назначение - упаковка и распаковка данных. Поскольку она распространяется в исходных кодах, то ее будет легко и удобно использовать в разрабатываемом модуле. Также отметим, что эта библиотека является свободно распространяемой, что не влечет за собой нарушения авторских прав.

3.2. Полиморфный генератор алгоритмов шифрования

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

3.2.1. Общие принципы работы полиморфных алгоритмов шифрования и расшифрования

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

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

Рисунок 5. Алгоритм шифрования/расшифрования в общем виде.

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

Блок 2 заносит в виртуальный регистр или переменную (обозначим ее как A2) размер блока данных. А2 выполняет роль счетчика в цикле преобразования данных. Заметим, что ее значение всегда в 4 раза меньше, чем настоящий размер шифруемых/расшифруемых данных. Это связано с тем, что полиморфные алгоритмы всегда работают с блоками данных, кратных по размеру 4 байтам. Причем, операции преобразования выполняются над блоками, кратными 4 байтам. О выравнивании данных по 4 байта заботятся более высокоуровневые механизмы, использующие виртуальную машину и полиморфные алгоритмы для шифрования и расшифрования данных. Возникает вопрос, откуда алгоритму "знать", какого размера блок ему необходимо зашифровать, ведь при его генерации такой информации просто нет. Необходимое значение он просто берет из ячейки памяти. Виртуальная машина памяти знает именно об этой ячейке памяти и перед началом выполнения полиморфного алгоритма заносит туда необходимое значение.

Блок 3 помещает в виртуальный регистр или переменную (обозначим ее как A3) константу, участвующую в преобразовании. Эта константа, возможно, затем и не будет использована для преобразования данных, все зависит от того, какой код будет сгенерирован. Блок 3 может быть повторен несколько раз. Над данными осуществляется целый набор различных преобразований, и в каждом из них участвуют различные регистры/переменные, инициализированные в блоке 3.

Блок 4 можно назвать основным. Именно он, а, точнее сказать, набор этих блоков производит шифрование/расшифрование данных. Количество этих блоков случайно и равно количеству блоков номер 3. При преобразованиях не обязательно будет использовано значение из A3. Например, вместо A3 может использоваться константа или значение из счетчика. На данный момент полиморфный генератор поддерживает 3 вида преобразований: побитовое "исключающее или" (XOR), сложение и вычитание. Набор этих преобразование можно легко расширить, главное, чтобы такое преобразование имело обратную операцию.

Блок 5 служит для увеличения A1 на единицу. Как и во всех других блоках эта операция может быть выполнена по-разному, то есть с использованием различных элементарных инструкций виртуальной машины.

Блок 6 организует цикл. Он уменьшает значение A2 на единицу, и если результат не равен 0, то виртуальная машина переходит к выполнению четвертого блока. На самом деле управление может быть передано на один из холостых блоков между блоком 3 и 4, но с функциональной точки зрения это значения не имеет.

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

Блок 8 завершает работу алгоритма.

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

Для начала приведем список инструкций, поддерживаемых на данный момент виртуальной машиной. Коды этих инструкций имеют тип E_OPERATION и определены в файле p_enums.h следующим образом:

enum E_OPERATION // Инструкции

{

EO_ERROR = -1, // Недопустимая инструкция

EO_EXIT_0, EO_EXIT_1, EO_EXIT_2, // Конец работы

EO_NOP_0, EO_NOP_1, EO_NOP_2, EO_NOP_3, // Пустые команды

EO_TEST_TIME_0, EO_TEST_TIME_1, // Контроль времени

EO_MOV, EO_XCHG, // Пересылка данных

EO_PUSH, EO_POP, // Работа со стеком

EO_XOR, EO_AND, EO_OR, EO_NOT, // Логические операции

EO_ADD, EO_SUB, EO_MUL, EO_DIV, EO_NEG, // Арифметические операции

EO_INC, EO_DEC,

EO_TEST, EO_CMP, // Операции сравнения

// (влияют на флаги)

EO_JMP, EO_CALL, EO_RET, // Операторы безусловного перехода

EO_JZ, EO_JNZ, EO_JA, EO_JNA, // Условные переходы

};

В таблице 1 приведена информация по этим инструкциям и перечислены их аргументы.

Таблица 1. Описание инструкций виртуальной машины.

Название

Действие

EO_EXIT_0

EO_EXIT_1

EO_EXIT_2

Команды завершения работы. После ее выполнения виртуальная машина остановится, и управление будет передано выше. Данные инструкции аргументов не имеют.

EO_TEST_TIME_0 EO_TEST_TIME_1

Команды контроля времени. Имеют один аргумент - последний доступный день использования.

EO_MOV

Команда пересылки данных. Имеет два аргумента - источник и получатель.

EO_XCHG

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

EO_PUSH

Сохраняет переданный аргумент в стеке.

EO_POP

Снимает значение с вершины стека и помещает в указанную ячейку памяти или регистр.

EO_XOR

Логическая операция XOR. Имеет два аргумента. Результат помещается в ячейку памяти или регистр, переданный в качестве первого аргумента.

Название

Действие

EO_AND

Логическая операция AND. Имеет два аргумента. Результат помещается в ячейку памяти или регистр, переданный в качестве первого аргумента.

EO_OR

Логическая операция OR. Имеет два аргумента. Результат помещается в ячейку памяти или регистр, переданный в качестве первого аргумента.

EO_NOT

Логическая операция NOT. Имеет один аргумент. Результат помещается в ячейку памяти или регистр, переданный в качестве аргумента.

EO_ADD

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

EO_SUB

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

EO_MUL

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

EO_DIV

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

EO_NEG

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

EO_INC

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

EO_DEC

Уменьшает значение ячейки памяти или регистра на единицу, передаваемой в единственном аргументе.

EO_TEST

Операция сравнения двух аргументов на равенство. Если аргументы равны, то флаг ZERO выставляется в true, в противном случае в false.

EO_CMP

Операция сравнения двух аргументов. Если аргументы равны, то флаг ZERO выставляется в true, в противном случае в false. Если первый аргумент меньше второго, то флаг ABOVE выставляется в true, в противном случае в false.

Название

Действие

EO_JMP

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

EO_CALL

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

EO_RET

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

EO_JZ

Условный переход по адресу, указанному в качестве аргумента. Условием является ZERO == true.

EO_JNZ

Условный переход по адресу, указанному в качестве аргумента. Условием является ZERO == false.

EO_JA

Условный переход по адресу, указанному в качестве аргумента. Условием является ABOVE == true.

EO_JNA

Условием является ABOVE == false.

Страницы: 1, 2, 3, 4, 5


© 2010 BANKS OF РЕФЕРАТ