Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Задание на подготовку к работе




Лабораторная работа N9

Защита программ от несанкционированной

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

Цель работы: получить навыки по установке защиты на

разрабатываемые программы за счет привязки к носителю информации (устройства внешней памяти).

 

Основные положения.

 

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

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

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

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

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

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

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

Электронный ключ обычно представляет собой небольшое устройство (размером со спичечный коробок), которое присоединяется к компьютеру через один из возможных интерфейсов (обычно это: COM, LPT или USB порты, хотя бывают варианты и в ISA-card исполнении). Например на картинке ключ Eutron для LPT-порта.

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

По функциональным возможностям:

ключи с памятью.

алгоритмические ключи.

алгоритмичиские ключи с памятью.

микропроцессорные ключи.

По сфере применения:

Локальные ключи.-для защиты локальной копии приложения.

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

По виду подключения:

LPT - время отклика у LPT ключей ниже чем у USB, вообще ключи как бы гарантируют прозрачность порта для других устройств, но это не всегда так.(например HASP используемый 1С иногда забивает принтер)

USB - эти ключи с более быстрым временем отклика, чем LPT, соответсвенно дороже.

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

Общие принципы защиты таковы:

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

Защита должна быть разнообразной. Уповать на то, что при использование электронных ключей Вас это спасет от взлома, глупо. Добавьте реализации каких либо видов программной защиты(проверку CRC и подобное).

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

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

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

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

Где тонко - там и рветься. Сделав защиту еще раз проверьте алгоритм защиты, вы должны защищать точки принятия решений Вашего продукта. Если чуствуете, что у Вас слабое место в защите, попробуйте усилить его.

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

 

       Среда ускоренной разработки приложений Delphi позволяет напрямую работать с функциями API-Windows.

Для получения информации об устройстве используется WinAPI функция

 

GetVolumeInformation.

 

В HELP-е Delphi (раздел Windows SDK) дано следующее

описание параметров этой функции:

BOOL GetVolumeInformation(

     LPCTSTR lpRootPathName,       // address of root directory of the file system

     LPTSTR lpVolumeNameBuffer, // address of name of the volume

      DWORD nVolumeNameSize,       // length of lpVolumeNameBuffer

     LPDWORD lpVolumeSerialNumber, // address of volume serial number

     LPDWORD lpMaximumComponentLength,     // address of system's maximum

                                //filename length

    LPDWORD lpFileSystemFlags, // address of file system flags

    LPTSTR lpFileSystemNameBuffer, // address of name of file system

    DWORD nFileSystemNameSize      // length of lpFileSystemNameBuffer

);

 

Параметры функции:

 

lpRootPathName     – имя устройства, информацию о котором необходимо  получить;

lpVolumeNameBuffer – имя буфера, в который будет помещено имя тома;

nVolumeNameSize – размер буфера для имени тома;

lpVolumeSerialNumber – переменная, в которую будет записан серийный номер;

lpMaximumComponentLength – переменная, в которую будет записано  максимальное значение пути, поддерживаемое файловой системой;

lpFileSystemFlags – флаги файловой системы, может быть любая  комбинация флагов:

 

FS_CASE_IS_PRESERVED – файловая система сохраняет регистр имен файлов, когда сохраняет имя на диске;

  FS_CASE_SENSITIVE – файловая система чувствительна к регистру имен файлов;

FS_UNICODE_STORED_ON_DISK – файловая система поддерживает имена в UNICODE;

FS_PERSISTENT_ACLS – файловая система поддерживает списки доступа (NTFS);

FS_FILE_COMPRESSION – файловая система поддерживает компрессию на уровне файлов;

FS_VOL_IS_COMPRESSED – файловая система поддерживает компрессию на уровне тома;

 

lpFileSystemNameBuffer – буфер, в который будет помещено имя файловой системы;

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

 

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

lpRootPathName         : PChar;

lpVolumeNameBuffer     : PChar;

nVolumeNameSize        : dWord;

lpVolumeSerialNumber   : dWord;

lpMaximumComponentLength :   dWord;

lpFileSystemFlags      : dWord;

lpFileSystemNameBuffer : PChar;

nFileSystemNameSize    : dWord;

 

Начальная загрузка параметров:

 

lpVolumeNameBuffer := '';

lpVolumeSerialNumber:= 0;

lpMaximumComponentLength:= 0;

lpFileSystemFlags:= 0;

lpFileSystemNameBuffer:= '';

GetMem(lpVolumeNameBuffer, Max_Path+1); //выделение памяти для

переменной

    GetMem(lpFileSystemNameBuffer, Max_Path+1); //выделение памяти для переменной

   nVolumeNameSize             := Max_Path+1;

   nFileSystemNameSize         := Max_Path+1;

   lpRootPathName  := PChar(DriveComboBox1.Drive+':\');

//имя устройства определяется компонентом TDriveComboBox

 

 Вызов функции:

 

       If GetVolumeInformation(

                         lpRootPathName,

                         lpVolumeNameBuffer,

                         nVolumeNameSize,

                          @lpVolumeSerialNumber,

                         lpMaximumComponentLength,

                         lpFileSystemFlags,

                          lpFileSystemNameBuffer,

                          nFileSystemNameSize)

        then begin …<действия> …end;

 

Рекомендации по проектированию защиты программ:

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

- не храните коды в одном месте,

- не проверяйте код только в одном месте,

- не анализируйте характеристику сразу после ее получения (считывания),

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

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

- применяйте отвлекающие функции проверок,

- не храните результаты проверок в переменных,

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

- не храните результаты проверки в реестре,

- применяйте шифрование программ и данных,

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

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

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

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

- усложнение листинга,

- зашифрованные строки в ресурсах.

 

 



Выполнение работы

 

Задание на подготовку к работе

 

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

2. Запустить Delphi. Среда программирования создаст «пустой» проект.

3. Записать «пустой» проект в папку на своем профиле (пункт основного меню File->Save Project as)

4. Подключить к системному блоку внешний носитель информации (flash-память)

 

Лабораторное задание

 

Задача лабораторной работы –

а) определить серийный номер подключенного внешнего носителя информации,

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

3. Рекомендации при разработке приложения. 3.1. Для определения серийного номера внешнего устройства создайте  отдельное приложение и используйте в нем стандартный компонент  TDriveComboBox. TDriveComboBox -специализированный ComboBox для выбора текущего диска. Имеет свойство DirList, в котором можно указать TDirectoryListBox,  который будет отслеживать переход на другой диск. (страница System)Пример .Определяющий тип устройства, его готовность и количество свободных байт. На форму приложения поместим компонент TDriveComboBox со страницы Win31 и четыре метки.

Рис. 1. Форма приложения для получения информации о дисках

Создадим обработчик события OnChange компонента TDriveComboBox.

procedure TForm1.DriveComboBox1Change(Sender: TObject);var VolName: array [0..255] of char; FSName : array [0..100] of char; VolSN: PDWORD; MaxCompLen,FSFlags: Cardinal; FC,SPC,BPS,NC:DWORD; s: string;begin VolSN:=nil; s:=UpperCase(DriveComboBox1.Drive)+':\'; Label1.Caption:=s; if (GetVolumeInformation(PChar(s),VolName,255, VolSN, MaxCompLen, FSFlags,FSName,100)) then   begin Label2.Caption:='Имя тома: '+AnsiString(VolName); Label3.Caption:='Файловая система: '+AnsiString(FSName) ; if GetDiskFreeSpace(PChar(s),SPC,BPS,FC,NC) then Label4.Caption:='Свободных байт: '+IntToStr(SPC*FC*BPS) else Label4.Caption:='' end   else    begin Label2.Caption:='Диск не готов'; Label3.Caption:=''; Label4.Caption:='' end;end;

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

Рис. 2. Приложение для вывода информации о дисках на этапе выполнения

3.2. Функция GetVolumeInformation- определяет информацию о носителе, среди которой содержится серийный номер.

 

function GetVolumeInformation(

 

lpRootPathName: PChar; //путь к сетевому или локальному

//тому (пример: "\\MyServer\MyShare\" или "C:\".

lpVolumeNameBuffer: PChar; //буфер - в котором будет храниться

                        // имя тома

nVolumeNameSize: DWORD; //размер буфера

lpVolumeSerialNumber: PDWORD; //серийный номер тома

var lpMaximumComponentLength, lpFileSystemFlags: DWORD; //размер

                                  // тома и тип файловой системы

lpFileSystemNameBuffer: PChar; //название файловой системы

 nFileSystemNameSize: DWORD //размер буфера под название ФС

): BOOL; stdcall;

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

 

 

Возможный вариант интерфейса приложения приведен на рис.1 Рис.1 Внешний вид окна вспомогательного приложения 3.2. Для определения подключенных к компьютеру внешних устройств при встраивании защиты в программу используйте функции GetLogicalDrives: Integerи GetDriveType(Name: PChar): Integer. Текст процедуры, выводящей в компонент TListBox список подключенных внешних устройств компьютера: procedure TForm1.SpeedButton1Click(Sender: TObject); var i, mask: Integer; S: String; begin mask := GetLogicalDrives; I := 0; while mask <> 0 do begin s := chr(ord('a') + i) + ':\'; if (mask and 1) <>0 then case GetDriveType(PChar(S)) of 0: ListBox1.Items.Add(S + 'unknow'); 1: ListBox1.Items.Add(S + 'not exists'); Drive_Removable: ListBox1.Items.Add(S + 'removable'); //floppy Drive_Fixed: ListBox1.Items.Add(S + 'fixed');     //hard Drive_Remote: ListBox1.Items.Add(S + 'network'); Drive_CDROM: ListBox1.Items.Add(S + 'CD_ROM');     //cd Drive_RamDisk: ListBox1.Items.Add(S + 'RAM'); end; //case inc(i); mask := mask shr 1; end; end;                                                                          При проверке серийного номера внешнего устройства реализуйте вышеперечисленные рекомендации по проектированию защиты программ.         4. Содержание отчета Отчет оформляется в форме Zip-архива, содержащего все файлы проекта(Project1.cfg, Project1.dof, Project1.dpr, Project1.exe, Project1.res, Unit1.dcu,Unit1.dfm, Unit1.pas). Zip-архив именуется по фамилии студента, номера группы иномера лабораторной работы.        

 

Задания

Напишите приложение, которое выводит сведения о флеш-диске

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










Последнее изменение этой страницы: 2018-06-01; просмотров: 196.

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