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


Лабораторная работа
Защита программ от несанкционированной эксплуатации за счет привязки к носителю информацииЦель работы: получить навыки по установке защиты на разрабатываемые программы за счет привязки к носителю информации (устройства внешней памяти).
1. Основные положения.
Установление рыночных отношений в обществе вынуждает производителей защищать свой продукт от незаконного его использования. Особо актуальной эта проблема становится в области информационных технологий. Как показывает практика, абсолютных способов защиты информации не существует. Какими бы сложными и дорогими не были предлагаемые на рынке средства защиты, их эффективность оказывается условной. С учетом сложившейся реальной обстановки востребованными оказываются несложные и недорогие средства защиты, разрабатываемые и устанавливаемые самим производителем продукта и направленные против незаконных действий квалифицированных пользователей.
Идея защиты основывается на использовании индивидуальных характеристик носителей информации. При запуске приложения проводится проверка на наличие подключенного внешнего устройства с конкретным серийным номером и на нахождение стартовавшей программы на этом устройстве. Данный способ защиты позволяет беспрепятственно копировать приложение, существующие стандарты записи информации не нарушаются, специфических требований к устройствам считывания-записи нет. Возможна организация проверки из разных точек программы с использованием нескольких подобных процедур: цель данных действий - усложнить работу квалифицированного взломщика.
Среда ускоренной разработки приложений Delphi позволяет напрямую работать с функциями API-Windows.
Для получения информации об устройстве используется WinAPI функция GetVolumelnformation. В 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
);
Параметры функции:
IpRootPathName- имя устройства, информацию о котором необходимо получить;
IpVoIumeNameBuffer - имя буфера, в который будет помещено имя тома;
nVoIumeNameSize - размер буфера для имени тома;
IpVoIumeSerialNumber - переменная, в которую будет записан серийный номер;
IpMaximumComponentLength - переменная, в которую будет записано максимальное значение пути, поддерживаемое файловой системой;
IpFiIeSystemFIags- флаги файловой системы, может быть любая комбинация флагов:
FS_CASE_IS_PRESERVED - файловая система сохраняет регистр имен файлов, когда сохраняет имя на диске;
FS_CASE_SENSITIVE- файловая система чувствительна к регистру имен файлов;
FS_UNICODE_STORED_ON_DISK - файловая система поддерживает имена в UNICODE;
FS_PERSISTENT_ACLS - файловая система поддерживает списки доступа (NTFS);
FS_FILE_COMPRESSION - файловая система поддерживает компрессию на уровне файлов;
FS_VOL_IS_COMPRESSED - файловая система поддерживает компрессию на уровне тома;
IpFileSystemNameBuffer - буфер, в который будет помещено имя файловой системы;
nFileSystemNameSize - размер буфера для имени файловой системы.
Типы рассмотренных параметров для корректного использования процедуры в среде Delphi:
IpRootPathName: PChar;
IpVolumeNameBuffer: PChar;
nVoIumeNameSize :dWord;
IpVolumeSerialNumber: dWord;
IpMaximumComponentLength: dWord;
IpFiIeSystemFIags: dWord;
IpFileSystemNameBuffer: PChar;
nFiIeSystemNameSize: dWord;
Начальная загрузка параметров:
IpVolumeNameBuffer:= '';
TOC \o "1-3" \h \z IpVolumeSerialNumber:= 0;
IpMaximumComponentLength:= 0;
IpFileSystemFIags:= 0;
IpFileSystemNameBuffer:= '';
GetMem(IpVoIumeNameBuffer, Max_Path+1); //выделение памяти для переменной
GetMem(IpFiIeSystemNameBuffer, Max_Path+1); //выделение памяти для переменной
nVolumeNameSize:= Max_Path+1;
nFileSystemNameSize:= Max_Path+1;
IpRootPathName:= PChar(DriveComboBox1.Drive+':\');
//имя устройства определяется компонентом TDriveComboBox
Вызов функции:
If GetVolumeInformation(IpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, @lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize)
then begin ...<действия> ...end;
Рекомендации по проектированию защиты программ:
не используйте стандартные обработчики компонентов, а организуйте проверки в цикле сообщений,
не храните коды в одном месте,
не проверяйте код только в одном месте,
не анализируйте характеристику сразу после ее получения (считывания),
не создавайте для проверки функцию или библиотеку,
не задавайте действия, связанные с проверкой, сразу после самой проверки,
применяйте отвлекающие функции проверок,
не храните результаты проверок в переменных,
не проверяйте контрольные данные одним алгоритмом,
не храните результаты проверки в реестре,
применяйте шифрование программ и данных,
не записывайте текстовые строки в программе в их реальном виде.
Действия, направленные против использования отладчиков при взломе программ:
определение отладчика до запуска программы с последующим завершением или эмуляцией ошибки,
изменение работы программы в случае ее выполнения в отладчике,
усложнение листинга,
зашифрованные строки в ресурсах.
2. Выполнение работы
Лабораторное задание. Задача лабораторной работы.
а) определить серийный номер подключенного внешнего носителя информации,
б) встроить в приложение проверку наличия внешнего носителя с конкретным серийным номером.
2.1. Для определения серийного номера внешнего устройства создайте отдельное приложение и используйте в нем стандартный компонент TDriveComboBox. Возможный вариант интерфейса вспомогательного приложения приведен на рис.1

Рис.1 Внешний вид окна вспомогательного приложения
2.2. Для определения подключенных к компьютеру внешних устройств при встраивании защиты в программу используйте функции GetLogicaIDrives: 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;
2.3 При проверке серийного номера внешнего устройства реализуйте вышеперечисленные рекомендации по проектированию защиты программ.
3. Контрольные вопросы
Какие способы защиты от несанкционированного копирования программ Вы знаете?
Охарактеризуйте способ защиты, основанный на использовании меток носителя информации.
Охарактеризуйте способ защиты, основанный на физических дефектах носителя информации.
Охарактеризуйте способ защиты, основанный на временных характеристиках чтения носителя информации.
Как грамотно с точки зрения защиты от взлома представлять в исходном тексте программы шаблоны для сравнения строковых переменных?
Как организовать процедуры, выполняющие одни и те же действия, но имеющие разную «операторную начинку»?
Можно ли хранить значение серийного номера проверяемого устройства не в теле программы, а в отдельном файле?
Целесообразно ли выделять процедуры, осуществляющие действия по защите, в отдельные динамические библиотеки?
Как корректно именовать процедуры, осуществляющие защитные механизмы?
Как организовать шифрование строковых переменных в тексте программы?
Список литературы

Приложенные файлы

  • docx 6165514
    Размер файла: 53 kB Загрузок: 1

Добавить комментарий