МЕНЮ


Фестивали и конкурсы
Семинары
Издания
О МОДНТ
Приглашения
Поздравляем

НАУЧНЫЕ РАБОТЫ


  • Инновационный менеджмент
  • Инвестиции
  • ИГП
  • Земельное право
  • Журналистика
  • Жилищное право
  • Радиоэлектроника
  • Психология
  • Программирование и комп-ры
  • Предпринимательство
  • Право
  • Политология
  • Полиграфия
  • Педагогика
  • Оккультизм и уфология
  • Начертательная геометрия
  • Бухучет управленчучет
  • Биология
  • Бизнес-план
  • Безопасность жизнедеятельности
  • Банковское дело
  • АХД экпред финансы предприятий
  • Аудит
  • Ветеринария
  • Валютные отношения
  • Бухгалтерский учет и аудит
  • Ботаника и сельское хозяйство
  • Биржевое дело
  • Банковское дело
  • Астрономия
  • Архитектура
  • Арбитражный процесс
  • Безопасность жизнедеятельности
  • Административное право
  • Авиация и космонавтика
  • Кулинария
  • Наука и техника
  • Криминология
  • Криминалистика
  • Косметология
  • Коммуникации и связь
  • Кибернетика
  • Исторические личности
  • Информатика
  • Инвестиции
  • по Зоология
  • Журналистика
  • Карта сайта
  • Защита информации в системах дистанционного обучения с монопольным доступом

    разработки на языке С++ для ОС 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 приведена абстрактная схема работы

    алгоритма шифрования/расшифрования. Повторяющиеся блоки обозначены

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

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

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

    верхнем углу больших блоков.

    Сразу отметим, что при своей работе виртуальная машина

    использует виртуальные регистры и память. Начальное содержимое виртуальной

    памяти, как и сам сгенерированный алгоритм, хранится в файле. Например,

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

    расшифровать. Некоторые виртуальные регистры и виртуальные ячейки памяти

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

    Холостые блоки состоят из одной или более базовых инструкций виртуальной

    машины. Они не являются функциональными блоками, и их описание будет

    опушено. Холостым блокам будет уделено внимание в следующем разделе. На

    схеме произвольные регистры/ячейки памяти обозначаются как буква А с

    цифрой. Полиморфный генератор случайным образом выбирает, какой же именно

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

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

    более подробно.

    [pic]

    Рисунок 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. Имеет два аргумента. Результат |

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

    | |качестве первого аргумента. |

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

    |Название |Действие |

    |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. |

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

    |Название |Действие |

    |EO_JMP |Данная инструкция осуществляет безусловный переход по |

    | |адресу, указанному в качестве аргумента. |

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

    | |указанному в качестве аргумента. |

    |EO_RET |Данная инструкция возвращает управление предыдущей |

    | |функции. Аргументов нет. |

    |EO_JZ |Условный переход по адресу, указанному в качестве |

    | |аргумента. Условием является ZERO == true. |

    |EO_JNZ |Условный переход по адресу, указанному в качестве |

    | |аргумента. Условием является ZERO == false. |

    |EO_JA |Условный переход по адресу, указанному в качестве |

    | |аргумента. Условием является ABOVE == true. |

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

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

    EOP_REG – Регистр

    EOP_REF_REG – Память по адресу в регистре.

    EOP_VAR – Переменная.

    EOP_REF_VAR – Память по адресу в переменной.

    EOP_CONST – Константное значение.

    EOP_RAND – Случайное число.

    Перечисленные типы объявлены в файле p_enums.h.

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

    константой 0x12345:

    DWORD AddRegAndConst[] = { EO_ADD, EOP_REG , 1, EOP_CONST, 0x12345 };

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

    виртуальной машине при шифровании/расшифровании данных, приведем отрывок из

    отладочного отчета. Каждое действие в отладочном режиме протоколируется в

    файле uniprot.log. Благодаря этому, было легко отлаживать механизм

    генерации полиморфных алгоритмов и саму работу алгоритмов. Дополнительным

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

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

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

    целью сокращения объема текста, убраны дублирующийся вывод внутри цикла.

    Также при генерации этого алгоритма были выставлена вложенность шифрования

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

    === Start TranslateOperations ===

    mov RAND ==> REG_2

    xchg REG_2 VAR_16 REG_2 VAR_16

    mov CONST ==> VAR_11

    dec VAR_11 ==> VAR_11

    cmp VAR_11 CONST

    jnz CONST

    mov RAND ==> REG_6

    xchg VAR_14 VAR_12 VAR_14 VAR_12

    mov CONST ==> VAR_15

    add VAR_15 VAR_18 ==> VAR_15

    mov RAND ==> REG_4

    mov CONST ==> VAR_19

    add VAR_19 VAR_9 ==> VAR_19

    add REG_8 REG_7 ==> REG_8

    xchg REG_2 VAR_13 REG_2 VAR_13

    Эта часть повторяется много раз:

    mov RAND ==> REG_6

    xor REF_VAR_11 VAR_14 ==> REF_VAR_11

    mov RAND ==> REG_4

    Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12


    Приглашения

    09.12.2013 - 16.12.2013

    Международный конкурс хореографического искусства в рамках Международного фестиваля искусств «РОЖДЕСТВЕНСКАЯ АНДОРРА»

    09.12.2013 - 16.12.2013

    Международный конкурс хорового искусства в АНДОРРЕ «РОЖДЕСТВЕНСКАЯ АНДОРРА»




    Copyright © 2012 г.
    При использовании материалов - ссылка на сайт обязательна.