МЕНЮ


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

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


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

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

    значений даты/времени. Кроме того, вариантные переменные могут содержать

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

    целые, действительные, строковые, символьные и булевы типы совместимы с

    типом VARIANT в отношении операции присваивания. Вариантные переменные

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

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

    Delphi выполняет автоматически.

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

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

    COM интерфейс, что логичною, так как неясно, как подобные данные

    интерпретировать.

    Описание используемых параметров:

    handle – дескриптор файла для записи.

    buffer – записываемое значение.

    written – возвращает размер записанных данных в байтах.

    HRESULT Read(

    [in] short handle,

    [out] VARIANT *buffer,

    [out, retval] long *read);

    Функция Read читает из файла данные и возвращает их в виде переменной

    типа VARIANT. Чтение производится из файла связанного с дескриптором,

    передаваемого в параметре handle. В возвращаемом значении read после

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

    байт.

    Описание используемых параметров:

    handle – дескриптор файла для чтения.

    buffer – возвращаемые данные.

    read – возвращает размер прочитанных данных в байтах.

    HRESULT WriteString(

    [in] short handle,

    [in] BSTR buffer,

    [out, retval] long *written);

    Функция WriteString служит для записи в зашифрованный файл строки.

    Отметим, что строку можно записать, используя функцию Write, так как тип

    VARIANT позволяет хранить строки. Эта функция заведена для большего

    удобства, так как строковый тип широко распространен. По крайней мере, как

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

    тестирования.

    Описание используемых параметров:

    handle – дескриптор файла для записи.

    buffer – записываемая строка.

    written – возвращает размер записанных данных в байтах.

    HRESULT ReadString(

    [in] short handle,

    [out] BSTR *buffer,

    [out, retval] long *read);

    Функция ReadString служит для чтения строки из зашифрованного файла.

    Описание используемых параметров:

    handle – дескриптор файла для чтения.

    buffer – возвращаемая строка.

    read – возвращает размер прочитанных данных в байтах.

    HRESULT FromFile(

    [in] short handle,

    [in] BSTR FileName,

    [out, retval] long *read);

    Функция FromFile позволяет записать в зашифрованный файл данные,

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

    целиком произвольный файл в зашифрованном файле. Это может быть удобно,

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

    jpg. Если бы данная функция отсутствовала, то пришлось бы вначале

    программно считывать эти файлы в память, а уже затем записывать в

    зашифрованный файл. Чтобы облегчить задачу программисту и была создана эта

    функция. Обратным действием – извлечением файла из зашифрованного хранилища

    – занимается функция ToFile. В результате получается искомый файл в

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

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

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

    заметить, что если есть желание обойтись без временных файлов в

    незашифрованном виде, то никаких сложностей нет. Рассмотрим на примере jpg

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

    функцию Write. Это достаточно просто, так как тип VARIANT может хранить

    массивы байт. В дальнейшем этот массив байт будет возможно непосредственно

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

    диске. Но дело в том, что часто это требует существенной доработки уже

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

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

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

    может быть весьма важным моментом. Как только файл будет отображен на

    экране, этот временный файл можно тут же стереть.

    Описание используемых параметров:

    handle – дескриптор файла для чтения.

    FileName – имя файла добавляемого в зашифрованное хранилище.

    read – возвращает размер прочитанных данных в байтах.

    HRESULT ToFile(

    [in] short handle,

    [in] BSTR FileName,

    [out, retval] long *written);

    Функция ToFile производит обратное действие относительно FromFile. Она

    извлекает файл из хранилища.

    Описание используемых параметров:

    handle – дескриптор файла для чтения.

    FileName – имя извлекаемого файла.

    written – возвращает размер записанных данных в байтах.

    Интерфейс IProtectConformity объединяет набор вспомогательных функций,

    призванных облегчить использование системы с большим количеством файлов, с

    алгоритмами и зашифрованными данными. Например, возьмем АРМ преподавателя.

    В этой системе может быть большое количество различных данных, связанных с

    определенными студентами. Если эти данные зашифрованы, то необходимо знать,

    каким именно файлом с алгоритмом это сделано. Все эти взаимосвязи

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

    СУБД, сложностей возникнуть не должно. Если же нет, то придется вносить

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

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

    БД, предназначены функции описываемого интерфейса. Фактически, они

    позволяют строить и работать с таблицами соответствий. Такая таблица

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

    соответствующего файла алгоритма для шифрования или расшифрования. В такой

    таблице возможен поиск, как по имени зашифрованного файла, так и по имени

    файла с алгоритмом. В дальнейшем файлы, хранящие информацию о соответствии

    файлов с данными и соответствующими файлами с алгоритмами, будем называть

    файлами соответствий. Отметим также, что файлы соответствий тоже

    подвергаются шифрованию.

    interface IProtectConformity : IDispatch

    {

    [id(1), helpstring("method Create Conformity File")]

    HRESULT CreateConformityFile(

    [in] BSTR name,

    [in] BSTR uptFileNameForRead,

    [in] BSTR uptFileNameForWrite,

    [in] BSTR ArrayOfStrings);

    [id(2), helpstring("method Easy Create Conformity File")]

    HRESULT EasyCreateConformityFile(

    [in] BSTR name,

    [in] BSTR uptFileNameForCreate,

    [in] BSTR ArrayOfStrings);

    [id(3), helpstring("method Read Conformity File")]

    HRESULT ReadConformityFile(

    [in] BSTR name,

    [in] BSTR uptFileNameForRead,

    [out, retval] BSTR *ArrayOfStrings);

    [id(4), helpstring("method Get UptAlgName by FileName")]

    HRESULT GetAlgName(

    [in] BSTR Strings,

    [in] BSTR SearchName,

    [out, retval] BSTR *ResultStr);

    [id(5), helpstring("method Get FileName by UptAlgName")]

    HRESULT GetDataName(

    [in] BSTR Strings,

    [in] BSTR SearchName,

    [out, retval] BSTR *ResultStr);

    [id(6), helpstring("method Get UptAlgName by FileName From File")]

    HRESULT GetAlgFromFile(

    [in] BSTR FileName,

    [in] BSTR uptFileNameForRead,

    [in] BSTR SearchName,

    [out, retval] BSTR *ResultStr);

    [id(7), helpstring("method Get FileName by UptAlgName From File")]

    HRESULT GetDataFromFile(

    [in] BSTR FileName,

    [in] BSTR uptFileNameForRead,

    [in] BSTR SearchName,

    [out, retval] BSTR *ResultStr);

    };

    Теперь опишем каждую из функций интерфейса IProtect.

    HRESULT CreateConformityFile(

    [in] BSTR name,

    [in] BSTR uptFileNameForRead,

    [in] BSTR uptFileNameForWrite,

    [in] BSTR ArrayOfStrings);

    Функция CreateConformityFile создает новый файл соответствий и

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

    строки, в которой последовательно записаны имена файлов. Все нечетные –

    имена файлов с данными, все четные – соответствующие алгоритмы шифрования

    или расшифрования. Имена должны быть заключены в двойные кавычки. Это

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

    пробелы. Между кавычкой в конце имени одного файла и кавычкой перед именем

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

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

    информации как о файлах для шифрования, так и для расшифрования не

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

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

    сокращается. Во-вторых, данная функциональность соответствия двух файлов

    может быть применена и для других целей. Хочется сделать ее более

    абстрактной. Следует дать следующий совет если для шифрования большого

    количества файлов одним алгоритмом: удобно создать соответствующий каталог,

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

    этого каталога и соответствующий алгоритм шифрования/расшифрования для

    работы с файлами в этом каталоге.

    Файлы с алгоритмом шифрования и расшифрования для работы с файлом

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

    качестве аргументов функции.

    Описание используемых параметров:

    name – имя создаваемого файла, для хранения информации о соответствии.

    uptFileNameForRead – имя создаваемого файла с алгоритмом расшифрования.

    uptFileNameForWrite – имя создаваемого файла с алгоритмом шифрования.

    ArrayOfStrings – строка с информацией о соответствиях.

    HRESULT EasyCreateConformityFile(

    [in] BSTR name,

    [in] BSTR uptFileNameForCreate,

    [in] BSTR ArrayOfStrings);

    Функция EasyCreateConformityFile подобна функции

    CreateConformityFile, но в отличие от нее, не создает новые файлы с

    алгоритмами шифрования и расшифрования. Она использует уже существующий

    алгоритм шифрования.

    name – имя создаваемого файла, для хранения информации о соответствии.

    uptFileNameForCreate – имя файла с алгоритмом шифрования.

    ArrayOfStrings – строка с информацией о соответствиях.

    HRESULT ReadConformityFile(

    [in] BSTR name,

    [in] BSTR uptFileNameForRead,

    [out, retval] BSTR *ArrayOfStrings);

    Функция ReadConformityFile читает содержимое файла соответствий и

    возвращает его в виде строки. Строка имеет тот же формат, что и

    передаваемая например в функцию CreateConformityFile.

    Описание используемых параметров:

    name – имя зашифрованного файла c информацией о соответствиях.

    uptFileNameForRead – имя файла с алгоритмом расшифрования.

    ArrayOfStrings – возвращаемая строка с информацией о соответствиях.

    HRESULT GetAlgName(

    [in] BSTR Strings,

    [in] BSTR SearchName,

    [out, retval] BSTR *ResultStr);

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

    соответствующий алгоритм шифрования или расшифрования. Поиск производится в

    переданной строке. Формат строки эквивалентен формату, с которым работают и

    другие функции. Например, EasyCreateConformityFile или ReadConformityFile.

    Описание используемых параметров:

    Strings – строка с информацией о соответствиях.

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

    соответствующего алгоритма.

    ResultStr – возвращаемое имя файла с алгоритмом.

    HRESULT GetDataName(

    [in] BSTR Strings,

    [in] BSTR SearchName,

    [out, retval] BSTR *ResultStr);

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

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

    Формат строки эквивалентен формату, с которым работаю и другие функции.

    Например EasyCreateConformityFile или ReadConformityFile.

    Описание используемых параметров:

    Strings – строка с информацией о соответствиях.

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

    поиск соответствующего файла с данными.

    ResultStr – возвращаемое имя файла с данными.

    HRESULT GetAlgFromFile(

    [in] BSTR FileName,

    [in] BSTR uptFileNameForRead,

    [in] BSTR SearchName,

    [out, retval] BSTR *ResultStr);

    Функция GetAlgFromFile, подобно функции GetAlgName, возвращает

    соответствующий алгоритм шифрования или расшифрования по имени файла с

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

    соответствиях, а имя с этой информацией и алгоритм для ее расшифрования.

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

    эффективна. Так, если требуется активно работать с таблицами соответствий,

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

    GetAlgFromFile. Эффективнее будет однократно прочитать информацию о

    соответствиях, используя функцию ReadConformityFile, а затем использовать

    функцию GetAlgName.

    Описание используемых параметров:

    FileName – имя файла с зашифрованной информацией о соответствиях.

    uptFileNameForRead – файл с алгоритмом расшифрования.

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

    соответствующего алгоритма.

    ResultStr – возвращаемое имя файла с алгоритмом.

    HRESULT GetDataFromFile(

    [in] BSTR FileName,

    [in] BSTR uptFileNameForRead,

    [in] BSTR SearchName,

    [out, retval] BSTR *ResultStr);

    Функция GetDataFromFile, подобно функции GetDataName, возвращает имя

    соответствующего файла с данными, по имени файла с алгоритмом. В отличии от

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

    этой информацией и алгоритм для ее расшифрования. Функция может быть более

    удобна в плане ее использования, но она менее эффективна. Так, если

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

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

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

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

    GetDataName.

    Описание используемых параметров:

    FileName – имя файла с зашифрованной информацией о соответствиях.

    uptFileNameForRead – файл с алгоритмом расшифрования.

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

    поиск соответствующего файла с данными.

    ResultStr – возвращаемое имя файла с данными.

    4.3. Руководство программиста по использованию программы ProtectEXE.exe

    Программа ProtectEXE.EXE предназначена для защиты исполняемых файлов

    от модификации. Под исполняемыми модулями понимаются EXE файлы в формате PE

    (Portable Executables). Защита исполняемых модулей основана на их

    шифровании. Особенностью утилиты ProtectEXE является то, что она шифрует

    каждый исполняемый файл уникальным полиморфным алгоритмом. Это затрудняет

    возможность использования программного взломщика, основанного на

    модификации определенных кодов в программе. Поскольку каждый исполняемый

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

    невозможно. Утилита ProtectEXE.EXE не позволяет защититься от динамического

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

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

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

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

    мало целесообразно, а следовательно и скорее всего не будет осуществлено.

    Модуль ProtectEXE.EXE имеет два возможных режима запуска. Первый режим

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

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

    Опишем этап создания зашифрованного файла. Для создания зашифрованного

    файла необходимо запустить ProtectEXE.EXE, указав в качестве параметра имя

    шифруемого исполняемого файла. Можно указать не только имя, но и путь. В

    результате буду сгенерированы два файла. Если было указано только имя, то

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

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

    шифруемый файл. Первый файл будет иметь расширение upb. Он представляет

    собой непосредственно зашифрованный исполняемый файл. Второй файл будет

    иметь расширение upu. Он представляет собой ключ, необходимый для

    расшифровки исполняемого файла. При разработке ProtectEXE было принято

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

    файле, а раздельно. Это было сделано с целью большей гибкости. Если

    хранить все в одном файле, это будет означать, что его всегда будет

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

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

    Страницы: 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 г.
    При использовании материалов - ссылка на сайт обязательна.