Вы находитесь на странице: 1из 9

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное


учреждение высшего образования
«Тульский государственный университет»

КАФЕДРА ИНФОРМАЦИОННОЙ БЕЗОПАСНОСТИ

ПРОГРАММНО-АППАРАТНЫЕ СРЕДСТВА ОБЕСПЕЧЕНИЯ


ИНФОРМАЦИОННОЙ БЕЗОПАСНОСТИ

Лабораторная работа № 2
Методы и средства привязки программного обеспечения
к аппаратному окружению и физическим носителям

Выполнили: ст. группы 230711


Акользина И. С.
Кузнецова А. В.
Кузьминова С. С.
Проверил:
Абрамов Д. А.
______________

Тула 2015
1. Цель работы
Изучить способы взаимодействия программного обеспечения с
операционной системой и аппаратурой для реализации привязки ПО к
текущей аппаратно-программной конфигурации ЭВМ.

2. Задание на работу
Вариант № 3. Привязка программы к конфигурации системы
(видеокарта).

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

2
4. Ход работы
При запуске программы на экран выводится меню: «1 – получение
информации о видеокарте. 2 – генерация ключа. 3 – проверка ключа».
Для получения информации о видеокарте используется структура
Windows API DISPLAY_DEVICE:
typedef struct _DISPLAY_DEVICE
{
DWORD cb;
TCHAR DeviceName[32];
TCHAR DeviceString[128];
DWORD StateFlags;
TCHAR DeviceID[128];
TCHAR DeviceKey[128];
} DISPLAY_DEVICE, *PDISPLAY_DEVICE;

В файл inf.txt выводится следующая информация: название


видеокарты, объем видеопамяти, ID видеокарты, ветка реестра
видеоадаптера, имя устройства.
Генерация ключа осуществляется на стороне разработчика
программного продукта. Для файла inf.txt определяется значение хеш-кода
по алгоритму md5. Значение ключа выводится в файл hash.txt.
При проверке ключа выполняется сбор информации о видеокарте и
генерация по полученной информации ключа . Затем производится сравнение
сгенерированного ключа со значением ключа из файла hash.txt. Если
значения ключей совпадают, то на экран выводится «Проверка пройдена
успешно», иначе выводится «У Вас нет прав доступа к данному
программному продукту».

Программа
// pasoib_2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "md5.h"
using namespace std;

void information() //Получение информации о видеокарте


{
ofstream out("inf.txt"); //Выходной файл, содержащий информацию о видеокарте

DISPLAY_DEVICE lpDisplayDevice;
DWORD dwFlags;
DWORD cc;
3
lpDisplayDevice.cb = sizeof(lpDisplayDevice);
dwFlags = 0;
cc = 0;

while (EnumDisplayDevices(NULL, cc, &lpDisplayDevice, dwFlags))


{
cc=cc+1;

//Название видеокарты
wstring wstrValue;
wstrValue = lpDisplayDevice.DeviceString;
string strValue;
strValue.assign(wstrValue.begin(), wstrValue.end()); //перевод wstring в
string
out << strValue << endl;

//Объем видеопамяти
out << lpDisplayDevice.StateFlags/1024/1024 << endl;

//ID видеокарты
wstrValue = lpDisplayDevice.DeviceID;
strValue.assign(wstrValue.begin(), wstrValue.end());
out << strValue << endl;

//Ветка реестра видеоадаптера


wstrValue = lpDisplayDevice.DeviceKey;
strValue.assign(wstrValue.begin(), wstrValue.end());
out << strValue << endl;

//Имя устройства
wstrValue = lpDisplayDevice.DeviceName;
strValue.assign(wstrValue.begin(), wstrValue.end());
out << strValue << endl << endl;
}
}

void key_generation() //Генерация ключа на основе полученных данных о видеокарте


{
FILE *file;
char x1;
file=fopen("inf.txt", "rb+"); //Файл, содержащий информацию о видеокарте

long size;
fseek(file, 0, SEEK_END);
size=ftell(file);
fseek(file, 0, SEEK_SET);

char* mass;
mass=new char[size];

for (long i=0; i<size; i++)


{
fread(&x1, sizeof(char),1,file);
mass[i]=x1;
}

//Вычисление хеш-кода файла по алгоритму md5


string m=md5(mass, size);

ofstream out("hash.txt"); //Выходной файл, содержащий значение сгенерированного


ключа
out << m << endl;

4
fclose(file);
}

void key_verification() //Проверка ключа для данного компьютера


{
//Получение информации о видеокарте для проверяемого компьютера
ofstream out("inf1.txt"); //Информация о видеокарте для проверяемого компьютера

DISPLAY_DEVICE lpDisplayDevice;
DWORD dwFlags;
DWORD cc;

lpDisplayDevice.cb = sizeof(lpDisplayDevice);
dwFlags = 0;
cc = 0;

while (EnumDisplayDevices(NULL, cc, &lpDisplayDevice, dwFlags))


{
cc=cc+1;

//Название видеокарты
wstring wstrValue;
wstrValue = lpDisplayDevice.DeviceString;
string strValue;
strValue.assign(wstrValue.begin(), wstrValue.end()); //перевод wstring в
string
out << strValue << endl;

//Объем видеопамяти
out << lpDisplayDevice.StateFlags/1024/1024 << endl;

//ID видеокарты
wstrValue = lpDisplayDevice.DeviceID;
strValue.assign(wstrValue.begin(), wstrValue.end());
out << strValue << endl;

//Ветка реестра видеоадаптера


wstrValue = lpDisplayDevice.DeviceKey;
strValue.assign(wstrValue.begin(), wstrValue.end());
out << strValue << endl;

//Имя устройства
wstrValue = lpDisplayDevice.DeviceName;
strValue.assign(wstrValue.begin(), wstrValue.end());
out << strValue << endl << endl;
}

//Генерация ключа на основе полученных данных о видеокарте


FILE *file;
char x1;
file=fopen("inf1.txt", "rb+");

long size;
fseek(file, 0, SEEK_END);
size=ftell(file);
fseek(file, 0, SEEK_SET);

char* mass;
mass=new char[size];

for (long i=0; i<size; i++)


{
fread(&x1, sizeof(char),1,file);
mass[i]=x1;

5
}

//Вычисление хеш-кода по алгоритму md5


string m=md5(mass, size);

//Проверка сгенерированного ключа (сравнение с содержимым файла hash.txt)


ifstream in("hash.txt");
string h;
in >> h;

if (h==m) cout << "Проверка пройдена успешно." << endl;


else cout << "У Вас нет прав доступа к данному программному продукту." << endl;

getch();
}

int _tmain(int argc, _TCHAR* argv[])


{
setlocale(LC_ALL, "RUS");

//Меню
cout << "1 - получение информации о видеокарте" << endl;
cout << "2 - генерация ключа" << endl;
cout << "3 - проверка ключа" << endl;

int a;
cin >> a;
cout << endl;

if (a==1) information();
if (a==2) key_generation();
if (a==3) key_verification();

return 0;
}

Инструкция пользователю
Программа, созданная при выполнении данной лабораторной работы,
осуществляет привязку программного продукта к конфигурации системы
(используется информация о видеокарте).
При запуске программы на экран выводится меню: «1 – получение
информации о видеокарте. 2 – генерация ключа. 3 – проверка ключа». При
выборе «1» осуществляется сбор информации о видеокарте пользователя.
Полученная информация выводится в файл inf.txt.
При выборе «2» для файла inf.txt генерируется ключ с помощью
алгоритма md5. Значение ключа выводится в файл hash.txt.
При выборе «3» происходит сбор информации о видеокарте
(аналогично выбору «1»), генерация по полученной информации ключа

6
(аналогично выбору «2»). Затем производится сравнение сгенерированного
ключа со значением ключа из файла hash.txt. Если значения ключей
совпадают, то на экран выводится «Проверка пройдена успешно», иначе
выводится «У Вас нет прав доступа к данному программному продукту».

Инструкция программисту
Программа, созданная при выполнении данной лабораторной работы,
осуществляет привязку программного продукта к конфигурации системы
(используется информация о видеокарте).
Программа содержит следующие функции:
 void information() - получение информации о видеокарте;
 void key_generation() - генерация ключа на основе полученных данных
о видеокарте;
 void key_verification() - проверка ключа для данного компьютера;
 string md5(char* in, long size) – вычисление хеш-кода по алгоритму md5
для заданного набора символов. Текст данной функции содержится в файле
md5.h.

Результаты работы программы


При запуске программы на экран выводится меню: «1 – получение
информации о видеокарте. 2 – генерация ключа. 3 – проверка ключа»
(рисунок 1).

Рисунок 1 – Главное меню программы

Рисунок 2 – содержимое файла inf.txt после выбора в меню программы


«1 – получение информации о видеокарте».

7
Рисунок 2 – Содержимое файла inf.txt

Рисунок 3 – содержимое файла hash.txt после выбора в меню


программы «2 – генерация ключа».

Рисунок 3 – Содержимое файла hash.txt

Рисунок 4 – результат проверки после выбора в меню «3 – проверка


ключа».

Рисунок 4 – Результат проверки ключа

5. Вывод
В процессе выполнения лабораторной работы мы изучили способы
взаимодействия программного обеспечения с операционной системой и
аппаратурой для реализации привязки ПО к текущей аппаратно-программной
конфигурации ЭВМ.

8
Привязка программного обеспечения к информации о пользователе /
конфигурации компьютера и последующая активация программного
обеспечения в настоящий момент используется достаточно широко (пример –
операционная система Windows).
Достоинство данного метода защиты заключается в том, что не
требуется никакого специфического аппаратного обеспечения, и программу
можно распространять посредством цифровой дистрибуции (по сети
Интернет).
Основной недостаток заключается в том, что программное обеспечение
становится неработоспособным в случае, если пользователь производит
модернизацию компьютера (если привязка осуществляется к аппаратной
конфигурации компьютера).