Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Тема 13 Методы защиты от копирования инсталляционных дисков.




Тема 13 Методы защиты от копирования инсталляционных дисков.

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

К основным способам нанесения программной некопируемой метки относятся:

• вынос метки за пределы стандартного поля копирования информации на дисковом носителе;

• нестандартная разметка одной или нескольких дорожек диска;

• привязка к временным характеристикам чтения и записи информации с дискового носителя;

• комбинирование нескольких способов.

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

1) форматирование ключевого диска;

2) нанесение на нем физической метки;

3) определение (путем последовательного выполнения операций записи и чтения в каждый сектор диска) конкретного адреса поврежденного участка и его сохранение;

4) при проверке легальности установки программного продукта в секторы диска с сохраненными адресами делается попытка записи и (или) чтения произвольных данных.

В настоящее время на компакт-дисках (СО) распространяется огромное количество информации: музыка, фильмы, программное обеспечение и т. д. Поэтому защита от нелегального копирования является актуальным вопросом. Широкое распространение компакт-диски получили в начале девяностых годов. В то время не было возможности записать диск в домашних условиях, поэтому разработчики старались предотвратить несанкционированное копирование информации с СП на жесткий диск компьютера. Но в начале XXI в. пишущие приводы стали доступны практически для любого пользователя, и сейчас фактически каждый владелец РС может записать СО- (а иногда и ОУО-) диск на своем компьютере. Проблемы защиты аудиоинформации на предшествующих носителях не существовало (или она не была настолько серьезной), так как, например, сделать копию с виниловой пластинки не было никакой возможности. Магнитофонную или видеокассету скопировать было нетрудно, но при этом резко ухудшалось качество содержащейся на ней информации. А вот с компакт-дисками дело обстоит совсем по-другому: чтобы сделать копию, нужно всего лишь несколько минут, причем качество копии будет точно таким же, как и у оригинала. Поэтому разработчики всячески стараются создать новые надежные способы защиты информации, распространяемой на СО, а нарушители стараются сделать все возможное, чтобы их взломать. Информация на диске хранится в виде последовательности питов (углублений) и лендов (возвышений), которая образует спираль, идущую от центра диска к его периферии. Если в определенном участке этой последовательности есть переход от пита к ленду (или от ленда к питу), то на соответствующем месте в потоке данных стоит единица, а если такого перехода нет, то ноль. Каждые 36 байт образуют кадр (FI frame); каждые 98 кадров, в свою очередь, образуют сектор. Внутри сектора кадры перемешаны, что позволяет уменьшить отрицательное влияние физических дефектов на качество записи информации.

Сектор является принципиально важной порцией информации, так как это наименьшая часть данных, которую может считать CD-привод. Адресация секторов возникла в то время, когда они использовались для записи музыки, и поэтому имеет вид минуты: секунды: доли (доля равна '/75 секунды). В стандарте для записи Audio CD (IЕС 908) сектор представляет собой блок из 2352 байтов, содержащий в себе только поток цифровой музыки. Но этот способ оказался непригодным для записи данных, так как на треке длиной в минуту могло содержаться около тысячи ошибок. В связи с этим пришлось ввести некоторые вспомогательные поля. У разных режимов записи эти поля отличаются.

 

Тема 14 Методы настройки устанавливаемого ПО на характеристики компьютера.

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

Характеристиками компьютера, на которые может быть выполнена настройка устанавливаемого программного обеспечения, являются:

• имя компьютера;

• имя пользователя;

• версия операционной системы;

• параметры центрального процессора;

• параметры оперативной памяти;

• тип используемой клавиатуры;

• параметры используемой мыши;

• ширина и высота экрана монитора;

• информация о дисковых устройствах компьютера;

• параметры диска, на котором выполняется установка программного продукта (емкость, тип файловой системы, серийный номер, метка тома);

• путь к папкам с файлами операционной системы и др.

Для получения значений указанных характеристик могут использоваться следующие функции из набора Windows API:

BOOL GetUserName(LPTSTR lpBuffer, LPDWORD nSize);

/* получение в буфере lpBuffer длины nSize имени пользователя

текущего сеанса */

BOOL GetComputerName(LPTSTR lpBuffer, LPDWORD nSize);

/* получение имени компьютера в буфере lpBuffer длины nSize> = MAX_COMPUTERNAME_LENGTH+l */

UINT GetWindowsDirectory(LPTSTR lpBuffer, UINT uSize);

/* получение в буфере lpBuffer длины uSize> =MAX_PATH пути к каталогу с ОС Windows */

UINT GetSystemDirectory(LPTSTR lpBuffer, UINT uSize);

/* получение в буфере lpBuffer длины uSize> =MAX_PATH пути к системному каталогу Windows */

int GetKeyboardType(int nTypeFlag); /* получение типа (nTypeFlag=0) или подтипа (nTypeFlag=l) клавиатуры */

int GetSystemMetrics(int nlndex); /* получение количества кнопок мыши (nIndex=SM_CMOUSEBUTTONS), ширины (nIndex=SM_CXSCREEN) или высоты (nIndex=SM_CYSCREEN) экрана */

DWORD GetLogicalDriveStrings(DWORD nBufferLength, LPTSTR lpBuffer); /* получение в буфере lpBuffer длины nBufferLength строки с корневыми каталогами всех дисков, разделенных 0-символами; результат — длина полученной строки без заключительного 0-символа */

VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer);

/* получение в буфере * lpBuffer структуры типа MEMORYSTATUS с характеристиками памяти компьютера (поле dwTotalPhys содержит целое число, равное общему объему физической памяти в байтах) */

BOOL GetDiskFreeSpace(LPCTSTR IpRootPathName, LPDWORD IpSectorsPerCluster, LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters, LPDWORD IpTotalNumberOfClusters);

/* получение информации об объеме текущего диска (lpRootPathName=NULL): количестве секторов в кластере (IpSectorsPerCluster), размере сектора (lpBytesPerSector), общем количестве кластеров (IpTotalNumberOfClusters), lpNumberOfFreeClusters=NULL */ BOOL GetVolumeInformation(LPCTSTR IpRootPathName, LPTSTR lpVolumeNameBuflfer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPTSTR lpFileSystemNameBuflfer, DWORD nFileSystemNameSize); /* получение информации о текущем диске (lpRootPathName=NULL): метке тома (в буфере

lpVolumeNameBuffer длины nVolumeNameSize), серийном номере (в переменной *lpVolumeSerialNumbery), файловой системе (в буфере lpFileSystemNameBuffer длины nFileSystemNameSize^ lpMaximumComponentLength=NULL, lpFileSystemFlags=NULL */

BOOL SystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinlni); /* получение в буфере pvParam значений системных параметров длиной uiParam; набор запрашиваемых параметров определяется в uiAction; fWinIni=0 */

Приведем пример фрагмента программы, вычисляющей ЭЦП для значений набора характеристик используемого для установки программного продукта компьютера и записывающего ЭЦП в реестр Windows. Для вычисления ЭЦП используются функции криптографического интерфейса приложений Windows, а для работы с реестром — классы библиотеки Visual Component Library системы программирования Borland C++ Builder.

/* подключение заголовочного файла с определением классов для работы с системным реестром */

#include

// глобальная переменная для имени раздела реестра с ЭЦП AnsiString RegName;

/* функция вычисления хеш-значения характеристик компьютера с помощью криптопровайдера hProv */

HCRYPTHASH HashCompParams( Н CRY PT Р RO V hProv) {HCRYPTHASH hHash; // дескриптор хеш-значения // буфер для имени компьютера и пользователя char Bufl[MAXCOMPUTERNAMELENGTH+l];

// буфер для пути к папкам операционной системы

char Buf2 [MAX PATH];

int Data; // запрашиваемые данные

unsigned long Len; // длина запрашиваемых данных

// создание пустого хеш-значения

CryptCreateHash(hProv, CALG SHA, 0, 0, & hHash);

// хеширование имени пользователя Len=sizeof( Bufl); if(GetUserName(Bufl, & Len))

CryptHashData(hHash, Bufl, lstrlen(Bufl), 0);

// хеширование имени компьютера Len=sizeof(Bufl);

if(GetComputerName(Bufl, & Len))

CryptHashData(hHash, Bufl, lstrlen(Bufl), 0);

// хеширование пути к папке с файлами операционной системы if(GetWindowsDirectory(Buss, sizeof(Buf2)))

CryptHashData(hHash, Buf2, lstrlen(Buf2), 0);

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

if(GetSystemDirectory(Buss, sizeof(Buss)))

CryptHashData(hHash, Buss, lstrlen(Buss), 0);

II хеширование значений параметров мыши и экрана монитора

Data=GetSystemMetrics(SM_CMOUSEBUTTONS);

if(Data) CryptHashData(hHash, (BYTE*)& Data, sizeof(Data), 0);

Data=GetSystemMetrics(SM_CYSCREEN);

if(Data) CryptHashData(hHash, (BYTE*)& Data, sizeof(Data), 0);

// хеширование информации о дисковых устройствах Data=GetLogicalDriveStrings(sizeof(Buf2), Buss); if(Data) CryptHashData(hHash, Buss, Data, 0); if(GetVolumeInformation(NULL, NULL, 0, NULL, NULL, NULL, Buss, sizeof(Buss))) CryptHashData(hHash, Buss, lstrlen(Buss), 0); return hHash; }

TRegistry *RegKey=new TRegistry; // объект класса раздела реестра HCRYPTHASH hHash; // дескриптор хеш-значения HCRYPTPROV hProv; // дескриптор криптопровайдера HCRYPTKEY hSignKey; // дескриптор ключа ЭЦП BYTE Sign[MAX_PATH]; // буфер для ЭЦП DWORD SigLen=sizeof(Sign); // длина ЭЦП Ц инициализация криптопровайдера

if(! CryptAcquireContext(& hProv, NULL, NULL, PROV_RSA_FULL, 0)) if((unsigned)GetLastError()==NTE_BAD_KEYSET) CryptAcquireContext(& hProv, NULL, NULL, PROV_RSA_FULL, CRY PTN EWKEY SET);

else throw Ехсерйоп(" Ошибка при инициализации CryptoAPI! " );

// создание раздела реестра

RegKey-> OpenKey(RegKey-> CurrentPath+" SOFTWARE" +RegName,

true);

II вычисление хеш-значения характеристик компьютера hHash=HashCompParams(hProv);

I/ создание ключа ЭЦП

if(! CryptGetUserKey(hProv, AT_SIGNATURE, & hSignKey)) CryptGenKey(hProv, AT_SIGNATURE, 0, & hSignKey);

I/ получение ЭЦП

CryptSignHash(hHash, AT SIGNATURE, NULL, 0, Sign, & SigLen); // запись ЭЦП в реестр как значения параметра Signature RegKey-> WriteBinaryData(" Signature", (void*)Sign, SigLen);

RegKey- > CloseKey();

// разрушение объектов криптопровайдера CryptDestroyHash(hHash); CryptDestroyKey(hSignKey); CryptReleaseContext(hProv, 0);

II уничтожение объекта класса раздела реестра delete RegKey;

// продолжение работы программы установки

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

/* подключение заголовочного файла с определением классов для работы с системным реестром */

#include

// глобальная переменная для имени раздела реестра с ЭЦП AnsiString RegName;

/* функция вычисления хеш-значения характеристик компьютера с помощью криптопровайдера hProv */

HCRYPTHASH HashCompParams( Н CRY PT Р RO V hProv)

{... }

HCRYPTPROV hProv=0; // дескриптор криптопровайдера HCRYPTHASH hHashComp=0; // дескриптор хеш-значения HCRYPTKEY hPubKey=0; // дескриптор открытого ключа ЭЦП BYTE Sign[MAX_PATH]; // буфер для ЭЦП

TRegistry *RegKey=new TRegistry; // объект класса раздела реестра try

{ // проверка существования раздела реестра с ЭЦП if(! RegKey-> OpenKey(RegKey-> CurrentPath +" SOFTWARE" + RegName, false))

throw Ехсерйоп(" Несанкционированный запуск программы! " );

// чтение ЭЦП с получением ее длины в Res

int Res= RegKey-> Read BinaryData(" Signature", Sign, sizeof(Sign));

// проверка успешности чтения ЭЦП из реестра if(! Res) throw ЕхсерІіоп(" Несанкционированньій запуск программы! " );

/* получение дескриптора криптопровайдера с проверкой регистрации в нем пользователя текущего сеанса */

if(! CryptAcquireContext(& hProv, NULL, NULL, PROV_RSA_FULL, 0)) throw Ехсерйоп(" Несанкционированный запуск программы! " );

// проверка создания ключей ЭЦП для текущего пользователя if(! CryptGetUserKey(hProv, AT_SIGNATURE, ? hPubKey)) throw Ехсерйоп(" Несанкционированный запуск программы! " );

/* вычисление хеш-значения характеристик компьютера, на котором производится запуск защищенной программы */ hHashComp=HashCompParams(hProv);

// проверка ЭЦП

if(! CryptVerifySignature(hHashComp, Sign, Res, hPubKey, NULL, 0)) throw ЕхсерйопО'Несанкционированный запуск программы! " );

// продолжение работы программы в случае правильности ЭЦП

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

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...