Главная страница
Навигация по странице:

  • Засоби PHP, що рекомендуються для розробки програми

  • PHP и WMI (COM-objects)

  • Методичні вказівки до виконання лабораторних робіт Київ 2014 Зміст Лабораторна робота 1 Розробка програми розмежування повноважень користувачів на основі парольної автентифікації 3


    Скачать 1.3 Mb.
    НазваниеМетодичні вказівки до виконання лабораторних робіт Київ 2014 Зміст Лабораторна робота 1 Розробка програми розмежування повноважень користувачів на основі парольної автентифікації 3
    АнкорLaby_po_ZI.doc
    Дата11.08.2018
    Размер1.3 Mb.
    Формат файлаdoc
    Имя файлаLaby_po_ZI.doc
    ТипМетодичні вказівки
    #22806
    страница2 из 7
    1   2   3   4   5   6   7

    Лабораторна робота 2 Захист додатків від несанкціонованого використання і копіювання


    Мета роботи

    Оволодіти навиками захисту програмного забезпечення від несанкціонованого використання і копіювання.

    Вміст завдання

    1. Для програми, розробленої при виконанні лабораторних робіт № 1, написати програму-інсталятор, яка:

    • запрошує у користувача папку для установки захищається програми,

    • записує туди файл з здійснимим кодом програми,

    • збирає інформацію про комп'ютер, на якому встановлюється програма,

    • хешірує цю інформацію,

    • підписує її особистим ключем користувача програми і записує підпис до реєстру Windows в розділ HKEY_CURRENT_USER \ Software \ Фамілія_студента як значення параметра Signature.

    2. У саму захищається програму включити фрагмент, в якому

    збирається інформація про комп'ютер, на якому запускається програма,

    • обчислюється хеш-значення цієї інформації,

    • зчитується підпис із зазначеного вище розділу реєстру, яка перевіряється за допомогою відкритого ключа користувача.

    3. При невдалій перевірці робота захищається програми повинна завершуватися з видачею відповідного повідомлення.

    4. Зібрана про комп'ютер інформація включає в себе:

    • ім'я користувача,

    • ім'я комп'ютера,

    • шлях до папки з ОС Windows,

    • шлях до папки з системними файлами ОС Windows,

    • а також дані, обирані відповідно до виданого завданням

    Індивідуальні варіанти завдань


    Собираемая информация о компьютере



    Тип и під­тип кла­виатуры

    К-ть кно­пок мыши

    Ши­рина екрана

    Висота экрана

    Набір диско­вих пристроів

    Объем памяти

    Данные о диске, на котором установ­лена про­грамма

    1

    Ні

    Да

    Ні

    Да

    Ні

    Да

    Объем

    2

    Ні

    Да

    Да

    Ні

    Ні

    Да

    Файловая система

    3

    Да

    Ні

    Ні

    Да

    Ні

    Да

    Объем

    4

    Да

    Ні

    Да

    Ні

    Ні

    Да

    Объем

    5

    Ні

    Да

    Ні

    Да

    Да

    Ні

    Файловая система

    6

    Ні

    Да

    Да

    Ні

    Да

    Ні

    Объем

    7

    Да

    Ні

    Ні

    Да

    Да

    Ні

    Объем

    8

    Да

    Ні

    Да

    Ні

    Да

    Ні

    Объем

    9

    Ні

    Да

    Ні

    Да

    Ні

    Да

    Метка тома

    10

    Ні

    Да

    Да

    Ні

    Ні

    Да

    Метка тома

    11

    Да

    Ні

    Ні

    Да

    Ні

    Да

    Метка тома

    12

    Да

    Ні

    Да

    Ні

    Ні

    Да

    Метка тома

    13

    Ні

    Да

    Ні

    Да

    Да

    Ні

    Метка тома

    14

    Ні

    Да

    Да

    Ні

    Да

    Ні

    Метка тома

    15

    Да

    Ні

    Ні

    Да

    Да

    Ні

    Метка тома

    16

    Да

    Ні

    Да

    Ні

    Да

    Ні

    Метка тома

    17

    Ні

    Да

    Ні

    Да

    Ні

    Да

    Серийный №

    18

    Ні

    Да

    Да

    Ні

    Ні

    Да

    Серийный №

    19

    Да

    Ні

    Ні

    Да

    Ні

    Да

    Серийный №

    20

    Да

    Ні

    Да

    Ні

    Ні

    Да

    Серийный №

    21

    Ні

    Да

    Ні

    Да

    Да

    Ні

    Серийный №

    22

    Ні

    Да

    Да

    Ні

    Да

    Ні

    Серийный №

    23

    Да

    Ні

    Ні

    Да

    Да

    Ні

    Серийный №

    24

    Да

    Ні

    Да

    Ні

    Да

    Ні

    Серийный №



    Теоретичні відомості


    Засоби мов програмування, що необхідні для виконання роботи

    Засоби мови Сі++, що рекомендуються для розробки програми

    . Збір інформації про комп'ютер:

    / / Отримання в буфері 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) предоставляет нам возможность подключаться к следующим провайдерам:

    • Dsprov.dll, провайдер каталога Active Directory (Active Directory provider), позволяет обращаться к Active Directory как к объекту WMI;

    • Ntevt.dll, провайдер журнала событий (Event Log provider), дает возможность управлять журналом событий;

    • Wbemperf.dll, провайдер системных счетчиков (Perfomance Counter provider) — обеспечивает доступ к счетчикам произоводительности;

    • Stdprov.dll, провайдер реестра (Registry provider), позволяет осуществлять чтение и изменение реестра;

    • Snmpincl.dll, провайдер SNMP-устройств (SNMP provider), открывает шлюз доступа к SNMP (Simple Network Management Protocol);

    • Wmiprov.dll, провайдер драйверов устройств (WDM provider), дает возможность получать информацию низкого уровня о драйверах устройств Windows Driver Model (WDM);

    • Cimwin32.dll, провайдер подсистемы Win32 (Win32 provider), обеспечивает доступ к информации о компьютере, ОС, подсистеме безопасности, дисках, периферийных устройствах, файловых системах, файлах, папках, сетевых ресурсах, принтерах, процесах, сервисах и так далее;

    • Msiprov.dll, провайдер установленного ПО (Windows Installer provider) — позволяет получать информацию об установленном ПО.

    Для вывода на 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, среди них:

    • GetBinaryValue — чтение значений типа BINARY;

    • GetDWORDValue — чтение значений типа DWORD;

    • GetExpandedStringValue — чтение значений типа EXPANDED STRING;

    • GetMultiStringValue — чтение значений типа MULTI STRING;

    • CreateKey — создание ключа реестра;

    • SetBinaryValue — запись значения типа BINARY;

    • SetDWORDValue — запись значения типа DWORD;

    • SetExpandedStringValue — запись значения типа EXPANDED STRING;

    • SetMultiStringValue — запись значения типа MULTI STRING;

    • SetStringValue — запись строкового значения;

    • DeleteKey — удаление ключа;

    • DeleteValue — удаление значения ключа;

    • EnumKey — получить перечисление ключей реестра;

    • EnumValues — получить перечисление значений ключей;

    • CheckAccess — проверка прав доступа к ключу реестра.

    В данном случае они не используются, а подробнее узнать об их применении можно в великом и могучем 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 данный функционал работает стабильно.

    1   2   3   4   5   6   7


    написать администратору сайта