Методичні вказівки до виконання лабораторних робіт Київ 2014 Зміст Лабораторна робота 1 Розробка програми розмежування повноважень користувачів на основі парольної автентифікації 3
Скачать 1.3 Mb.
|
Лабораторна робота 2 Захист додатків від несанкціонованого використання і копіюванняМета роботи Оволодіти навиками захисту програмного забезпечення від несанкціонованого використання і копіювання. Вміст завдання 1. Для програми, розробленої при виконанні лабораторних робіт № 1, написати програму-інсталятор, яка:
2. У саму захищається програму включити фрагмент, в якому збирається інформація про комп'ютер, на якому запускається програма,
3. При невдалій перевірці робота захищається програми повинна завершуватися з видачею відповідного повідомлення. 4. Зібрана про комп'ютер інформація включає в себе:
Індивідуальні варіанти завданьСобираемая информация о компьютере
Теоретичні відомостіЗасоби мов програмування, що необхідні для виконання роботи Засоби мови Сі++, що рекомендуються для розробки програми . Збір інформації про комп'ютер: / / Отримання в буфері lpBuffer довжини nSize імені користувача поточного сеансу BOOL GetUserName(LPTSTR lpBuffer, LPDWORD nSize); / * Отримання імені комп'ютера в буфері lpBuffer довжини nSize>= MAX_COMPUTERNAME_LENGTH+1 */ BOOL GetComputerName(LPTSTR lpBuffer, LPDWORD nSize); / * Одержання в буфері lpBuffer довжини uSize> = MAX_PATH шляху до каталогу з ОС Windows * / UINT GetWindowsDirectory(LPTSTR lpBuffer,UINT uSize); / * Одержання в буфері lpBuffer довжини uSize> = MAX_PATH шляху до системного каталогу Windows * / UINT GetSystemDirectory(LPTSTR lpBuffer, UINT uSize); / / Отримання типу (nTypeFlag = 0) або підтипу (nTypeFlag = 1) клавіатури int GetKeyboardType(int nTypeFlag); / * Отримання кількості кнопок миші (nIndex = SM_CMOUSEBUTTONS), ширини (nIndex = SM_CXSCREEN) або висоти (nIndex = SM_CYSCREEN) екрану * / int GetSystemMetrics(int nIndex); / * Одержання в буфері lpBuffer довжини nBufferLength рядки з кореневими каталогами всіх дисків, розділених 0-символами; результат - довжина отриманого рядка без заключного 0-символу * / DWORD GetLogicalDriveStrings(DWORD nBufferLength, LPTSTR lpBuffer); / * Одержання в буфері * lpBuffer структури типу MEMORYSTATUS з характеристиками пам'яті комп'ютера (поле dwTotalPhys містить ціле число, рівне загальному обсягу фізичної пам'яті в байтах) * / VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer); / * Отримання інформації про обсяг поточного диска (lpRootPathName = NULL): кількості секторів в кластері (lpSectorsPerCluster), розмірі сектора (lpBytesPerSector), загальній кількості кластерів (lpTotalNumberOfClusters), lpNumberOfFreeClusters = NULL * / BOOL GetDiskFreeSpace(LPCTSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters); / * Отримання інформації про поточний диск (lpRootPathName = NULL): мітці томи (в буфері lpVolumeNameBuffer довжини nVolumeNameSize), серійному номері (у змінній * lpVolumeSerialNumber), файлової системи (в буфері lpFileSystemNameBuffer довжини nFileSystemNameSize), lpMaximumComponentLength = NULL, lpFileSystemFlags = NULL * / BOOL GetVolumeInformation(LPCTSTR lpRootPathName, LPTSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPTSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize); Отримання і перевірка електронного цифрового підпису (ЕЦП) (константи, типи даних і прототипи функцій межах у файлі wincrypt.h): HCRYPTPROV, HCRYPTKEY, HCRYPTHASH - типи даних для дескрипторів криптопровайдером (CSP), криптографічного ключа, хеш-об'єкта ALG_ID - тип даних для кодів криптографічних алгоритмів / * Ініціалізація криптопровайдером: в *phProv записывается его дескриптор, pszContainer=NULL, pszProvider=NULL, dwProvType=PROV_RSA_FULL, dwFlags=0 или (если при первом запуске программы CryptAcquireContext возвращает FALSE) регистрация нового пользователя в криптопровайдере dwFlags= CRYPT_NEW_KEYSET */ BOOL CryptAcquireContext(HCRYPTPROV *phProv, LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType, DWORD dwFlags); / * Створення в криптопровайдером з дескриптором hProv пари ключів ЕЦП (Algid = AT_SIGNATURE, dwFlags = 0) і запис дескриптора відкритого ключа в * phKey * / BOOL CryptGenKey(HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYPTKEY *phKey); / * Отримання у криптопровайдером з дескриптором hProv дескриптора відкритого ключа ЕЦП (dwKeySpec = AT_SIGNATURE) в змінній * phUserKey (якщо функція повертає FALSE, то пару ключів ЕЦП потрібно створити за допомогою функції CryptGenKey) * / BOOL CryptGetUserKey(HCRYPTPROV hProv, DWORD dwKeySpec, HCRYPTKEY *phUserKey); / * Створення порожнього хеш-об'єкта (hProv - дескриптор ініціалізувати криптопровайдером, Algid - код алгоритму хешування, hKey = 0, dwFlags = 0, в * phHash записується дескриптор хеш-об'єкта) * / BOOL CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash); / * Додавання в хеш-об'єкт даних з буфера * pbData довжини dwDataLen (hHash - дескриптор хеш-об'єкта, dwFlags = 0) * / BOOL CryptHashData(HCRYPTHASH hHash, CONST BYTE *pbData, DWORD dwDataLen, DWORD dwFlags); / * Отримання для хеш-об'єкта з дескриптором hHash ЕЦП в буфері pbSignature довжини * pdwSigLen (після виконання функції в цю змінну записується фактична довжина ЕЦП); dwKeySpec = AT_SIGNATURE, sDescription = NULL, dwFlags = 0 * / BOOL CryptSignHash(HCRYPTHASH hHash, DWORD dwKeySpec, LPCTSTR sDescription, DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen); / * Перевірка ЕЦП з буфера * pbSignature довжини dwSigLen для хеш-об'єкта з дескриптором hHash за допомогою відкритого ключа hPubKey (sDescription = NULL, dwFlags = 0) * / BOOL CryptVerifySignature(HCRYPTHASH hHash, BYTE *pbSignature, DWORD dwSigLen, HCRYPTKEY hPubKey, LPCTSTR sDescription, DWORD dwFlags); / / Руйнування хеш-об'єкта з дескриптором hHash BOOL CryptDestroyHash(HCRYPTHASH hHash); / / Руйнування ключа шифрування з дескриптором hKey BOOL CryptDestroyKey(HCRYPTKEY hKey); / / Звільнення криптопровайдером з дескриптором hProv (dwFlags = 0) BOOL CryptReleaseContext(HCRYPTPROV hProv, DWORD dwFlags); / / Робота з реєстром Windows: Клас TRegistry (визначений у файлі vcl \ registry.hpp): конструктор без параметрів; властивості: HKEY RootKey (кореневий розділ реєстру, за замовчуванням HKEY_CURRENT_USER); HKEY CurrentKey (поточний розділ реєстру, тільки для читання); AnsiString CurrentPath (шлях до поточного розділу реєстру, тільки для читання). • методи: / * Відкриття або (якщо CanCreate = true) при необхідності створення поточного розділу реєстру Key * / bool OpenKey (const AnsiString Key, bool CanCreate); / * Запис (перезапис) в поточний розділ реєстру значення параметра Name з буфера Buffer довжини BufSize * / void WriteBinaryData (const AnsiString Name, void * Buffer, int BufSize); / / Запис і закриття поточного розділу реєстру void CloseKey (); / / Перевірка існування в реєстрі розділу Key bool KeyExists (const AnsiString Key); / * Читання з поточного розділу реєстру значення параметра Name в буфер Buffer довжини BufSize * / int ReadBinaryData (const AnsiString Name, void * Buffer, int BufSize); Засоби PHP, що рекомендуються для розробки програми Php – скрипт для определения модели и версии браузера function user_browser($agent) { preg_match("/(MSIE|Opera|Firefox|Chrome|Version|Opera Mini|Netscape|Konqueror|SeaMonkey|Camino|Minefield|Iceweasel|K-Meleon|Maxthon)(?:\/| )([0-9.]+)/", $agent, $browser_info); list(,$browser,$version) = $browser_info; if (preg_match("/Opera ([0-9.]+)/i", $agent, $opera)) return 'Opera '.$opera[1]; if ($browser == 'MSIE') { preg_match("/(Maxthon|Avant Browser|MyIE2)/i", $agent, $ie); if ($ie) return $ie[1].' based on IE '.$version; return 'IE '.$version; } if ($browser == 'Firefox') { preg_match("/(Flock|Navigator|Epiphany)\/([0-9.]+)/", $agent, $ff); if ($ff) return $ff[1].' '.$ff[2]; } if ($browser == 'Opera' && $version == '9.80') return 'Opera '.substr($agent,-5); if ($browser == 'Version') return 'Safari '.$version; if (!$browser && strpos($agent, 'Gecko')) return 'Browser based on Gecko'; return $browser.' '.$version; } PHP и WMI (COM-objects) Как осуществляется мониторинг либо управление машинами через сайт? Для этого используем подключение из PHP к подсистеме WMI посредством создания новых COM-объектов. WMI (инструментарий управления Windows) предоставляет нам возможность подключаться к следующим провайдерам:
Для вывода на web-страницу информации о текущем состоянии машины (память, процессы, службы), а также для выполнения некоторых административных действий необходимо написать функции, которые будут вызываться с параметрами (имя машины или IP-адрес), а затем выводить результат своей работы в соответствующее поле web-страницы. Самые интересные и используемые в рамках данной лабораторной работы функции будут требовать обращения к провайдерам подсистемы Win32 и провайдеру реестра. Например, функция получения и вывода информации о версии BIOS, производителе и модели материнской платы. Данный функционал реализуется с помощью создания нового COM-объекта подключением к провайдеру StdRegProv подсистемы WMI. Все рассмотренные функции вызываются с переменной $server, которая содержит имя управляемой удаленной машины в локальной сети либо ее IP-адрес: $obj = new COM('winmgmts:{impersonationLevel=impersonate}//' .$server.'/root/default:StdRegProv’); $obj->getStringValue(HKLM,$keypath1,$keyvalue_def,$key); echo "BIOS release date: ".$key."\r\n"; $obj->getStringValue(HKLM, $keypath2,$keyvalue_mb_model, $key); echo "Mainboard model: ".$key ."\r\n"; Таким образом, после создания нового COM-объекта методом getStringValue мы читаем раздел реестра HKLM (выбор раздела реестра задается константой, в нашем случае — объявлением define('HKLM',0x80000002);). При необходимости читать другие разделы реестра указываем другие константы: Const HKEY_CLASSES_ROOT = 0x80000000 Const HKEY_CURRENT_USER = 0x80000001 Const HKEY_LOCAL_MACHINE = 0x80000002 Const HKEY_USERS = 0x80000003 Const HKEY_CURRENT_CONFIG = 0x80000005 Кроме используемого метода getStringValue существуют дополнительные методы работы с провайдером StdRegProv, среди них:
В данном случае они не используются, а подробнее узнать об их применении можно в великом и могучем MSDN. Для осуществления функций мониторинга системы потребуется работать с пространством имен WMI (/root/cimv2), что даст нам возможность обращаться к необходимым провайдерам Win32_Processor, Win32_OperatingSystem, Win32_PerfFormattedData_PerfOS_System, Win32_OperatingSystem, Win32_Process, Win32_Service. Итак, получаем информацию о центральном процессоре системы (CPU), включая его загрузку в процентах и данные CPUID, для этого сделаем так: $obj = new COM ('winmgmts:{impersonationLevel=impersonate}//' .$server.'/root/cimv2'); $pc = 0; foreach ($obj->instancesof('Win32_Processor') as $mp) { echo "Processor (".++$pc.")\r\n"; echo "Name: ".trim( $mp->Name )." @ " . $mp->CurrentClockSpeed . " MHz\r\n"; echo "CPU Load: ".$mp->LoadPercentage . "%\r\n"; } Здесь мы создаем новый COM-объект и, обращаясь к методам провайдера Win32_Processor, получаем нужную нам информацию: Данные о температуре процессора мы можем получить, обратившись к пространству имен /root/WMI и провайдеру MSAcpi_ThermalZoneTemperature. Получение актуальной температуры CPU работает не на всех материнских платах ПК, зато прекрасно работает на ноутах. Работа с пространством имен /root/WMI и провайдером MSAcpi_ThermalZoneTemperature: $obj = new COM ('winmgmts:{impersonationLevel=impersonate}//' .$server.'/root/WMI'); foreach($obj->instancesof ('MSAcpi_ThermalZoneTemperature') as $mp) { echo " \r\n"; $ctemp=($mp->CurrentTemperature); echo "Current CPU temperature: " . ( $ctemp — 2732)/10 . "C" . "\r\n"; } Здесь перед выводом на страницу температура переведена из кельвинов в привычные русскому глазу единицы Цельсия. Двигаемся дальше и с помощью старого доброго пространства имен /root/cimv2 получаем информацию об установленной оси, сервис-паках и аптайме. Здесь использованы методы провайдеров Win32_OperatingSystem и Win32_PerfFormattedData_PerfOS_System. Для перевода секунд при отображении uptime используется функция format_time($temp). Выводим параметры OS’и и uptime: foreach($obj->instancesof('Win32_OperatingSystem') as $mp ) { $temp=($mp->Name); echo "OS name: " .substr($temp,0,-40). "\r\n"; $temp2=($mp->ServicePackMajorVersion); echo "Service pack: " . $temp2 . "\r\n"; } foreach ($obj->instancesof('Win32_PerfFormattedData_PerfOS_System') as $mp) { $temp=($mp->SystemUpTime); echo "System uptime: ".format_time($temp)."\r\n"; } Существует немало ограничений при подключении из PHP к подсистеме WMI. Основные из них связаны с возрастом используемой операционной системы. Например, на Windows XP Home Edition данный функционал работать не будет, в XP Professional необходимо проверить следующее: если на удалённом компьютере в локальных политиках безопасности стоит модель "Сетевой доступ - модель совместного доступа и безопасности - гостевая", измените модель на "классическую (обычную)". Настроить данный параметр безопасности можно, открыв соответствующую политику и развернув дерево консоли следующим образом: Панель управления\Администрирование\Локальная политика безопасности\Параметры безопасности\Локальные политики\Параметры безопасности\Сетевой доступ - модель совместного доступа и безопасности -> Классическая. По умолчанию "Гостевая" модель включена в Windows XP Professional, «Классическая» — в семействе Windows Server 2003 и компьютерах Windows XP Professional, присоединенных к домену. Под операционным системами Windows 7, 8 данный функционал работает стабильно. |