ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Winlogon notification package. Теорія та практика
         

     

    Інформатика, програмування

    Winlogon notification package. Теорія і практика

    Роман Бурда

    Що це таке

    В операційних системах лінії Windows NT діалогова підтримка входу в систему реалізована за допомогою Winlogon. Він надає цілий ряд корисних інтерфейсів. Найбільш відомим є GINA (Graphical Identification and Authentication dll), який звичайно використовується, коли потрібно змінити стандартний спосіб аутентифікації. Наприклад, реалізувати можливість входу в систему за відбитками пальців, сітківці ока або по електронній картці. Менш відомим, але не менш корисним є Winlogon notification package. Цей інтерфейс реалізує можливість обробляти події на вхід і вихід користувачів, включення і виключення операційної системи і деякі інші. На жаль, останній інтерфейс реалізований тільки в операційних системах Win2000 і вище.

    Теорія

    Winlogon notification package - це dll-бібліотеки, які отримують і обробляють події, згенеровані Winlogon.

    Logon - генерується при вході користувача в систему за допомогою Winlogon + GINA (через консоль, термінал і т.д.). Повідомлення не будуть приходити, якщо користувач зайшов за допомогою LogonUser.

    Logoff - генерується при виході користувача з системи (якщо він увійшов у систему за допомогою Winlogon + GINA).

    Startup - генерується при запуску системи, а також при приєднанні термінального клієнта.

    Shutdown - генерується перед завершенням роботи системи, а також при від'єднанні термінального клієнта.

    StartScreenSaver - генерується при запуску screen saver-а. У обробнику цієї події заборонено показувати інтерфейс користувача.

    StopScreenSaver - генерується при зупинці screen saver-а. У обробнику цієї події заборонено показувати інтерфейс користувача.

    Lock - генерується, коли користувач блокує робочу станцію.

    Unlock - генерується, коли користувач розблоковував робочу станцію, або коли системний адміністратор зняв блокування, змусивши користувача вийти з системи.

    StartShell - генерується після того, як користувач зайшов в систему і мережеві з'єднання були встановлені.

    Для реалізації Winlogon notification package необхідно наступне.

    Спочатку потрібно створити динамічну бібліотеку, яка імпортуватиме набір функцій-обробників подій. Прототип цих функцій повинен будуватися по шаблону:        

    VOID   FunctionName (PWLX_NOTIFICATION_INFO pInfo);     

    Як бачите, вся інформація про дані події зберігається в структурі WLX_NOTIFICATION_INFO.        

    typedef struct _WLX_NOTIFICATION_INFO   

    (   

    ULONG Size;   

    ULONG Flags;   

    PWSTR UserName;   

    PWSTR Domain;   

    PWSTR WindowStation;   

    HANDLE hToken;   

    HDESK hDesktop;   

    PFNMSGECALLBACK   pStatusCallback;   

    ) WLX_NOTIFICATION_INFO, * PWLX_NOTIFICATION_INFO;     

    У цій структурі:

    Size - визначає розмір структури в байтах;

    Flags - поле зарезервовано і має встановлюватися в 0;

    UserName - рядок, що визначає ім'я поточного користувача. Якщо подія трапилася до входу користувача в систему, то це поле одно NULL;

    Domain - рядок, яка визначає назву домену, в який увійшов поточний користувач. Якщо подія трапилася до входу користувача в систему, то це поле одно NULL;

    WindowStation - визначає ім'я віконної станції, в якої поточний користувач працює. Якщо подія трапилася до входу користувача в систему, то це поле одно NULL;

    hToken - дескриптор token-а користувача. Якщо подія трапилося до входу користувача в систему, то це поле одно NULL;

    hDesktop - дескриптор Desktop'а для поточного події;

    pStatusCallback - зарезервовано для внутрішнього використання.

    Після створення динамічної бібліотеки потрібно вказати Winlogon, де її можна знайти, і які події вона буде обробляти. Вся інформація розміщується в системному реєстрі в ключі

    HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionWinlogonNotify

    Повний доступ до нього мають тільки користувачі з правами локального адміністратора. Звичайні користувачі не зможуть створювати або змінювати підключи і/або значення.        

    РАДА   

    Варто відзначити, що цього ключа не   існує в ОС Win9x, але існує недокументовані аналог --   HKEY_LOCAL_MACHINESystemCurrentControlSetcontrolMPRServices. За допомогою   цього ключа можна вказати процесу mpr.exe (цей процес є певним   аналогом Winlogon для Win9x, оскільки також відповідає за вхід користувачів у   систему) завантажувати в свій адресний простір необхідну динамічну   бібліотеку. Таким чином, теоретично можна отримати доступ до подій   входу і виходу користувача із системи. Для вказівки бібліотеки досить   створити з'єднання з довільним ім'ям, і вже там вказати наступні значення.   'DLLName' (REG_SZ) - ім'я динамічної бібліотеки або шлях до неї, 'EntryPoint'   (REG_SZ) - точка входу до бібліотеки. Нею може бути назва будь-якої   експортується функції. 'StackSize' (REG_DWORD) - розмір стека зазвичай   встановлюється в 0. Після перезавантаження системи зазначена бібліотека буде   завантажені в адресний простір mpr.exe. Оскільки в Win9x доступ до   системного реєстру мають все, цей ключ досить часто використовується троянами.   Адже для них це свого роду автозавантаження. Можливо, саме тому Microsoft   не документована цей механізм.     

    Для того щоб підписати динамічну бібліотеку на події Winlogon, необхідно створити з'єднання з довільним ім'ям, після чого вказати значення в ньому:

    DllName (REG_EXPAND_SZ) - ім'я бібліотеки, що містить notification package, наприклад Notify.dll;

    Impersonate (REG_DWORD) - вказує, чи має бути імперсонірован контекст безпеки увійшов користувача, коли Winlogon викликає функцію-обробник. (1 - повинен бути імперсонірован, 0 - не має).

    Asynchronous (REG_DWORD) - вказує, чи повинен процес Winlogon створювати окремий потік для виклику функції-обробника (1 -- створювати окремий потік, 0 - не створювати). Фактично, це значення вказує, як буде працювати Winlogon з обробником - асинхронно або синхронно.

    Наступні значення є необов'язковими. Вони визначають назви функцій, які будуть обробляти однойменні події. Те Тобто існує можливість підписатися не на всі події, а тільки на деякі. Всі значення мають тип REG_SZ. У таблиці 1 наведені їх назви та можливі значення.        

    Назва значення         

    Приклад             

    Logon         

    WLEventLogon             

    Logoff         

    WLEventLogoff             

    Startup         

    WLEventStartup             

    Shutdown         

    WLEventShutdown             

    StartScreenSaver         

    WLEventStartScreenSaver             

    StopScreenSaver         

    WLEventStopScreenSaver             

    Lock         

    WLEventLock             

    Unlock         

    WLEventUnlock             

    StartShell         

    WLEventStartShell     

    Щоб зміни вступили в силу, потрібно перевантажити комп'ютер. Це пояснюється тим, що Winlogon завантажує dll перед завантаженням системи.

    Практика

    Створимо в Visual Studio приклад простої програми, провідною логи повідомлень Winlogon.        

    ПРИМІТКА   

    Демонстраційний проект був створений і   скомпільовано в Visual Studio 6.0.     

    Створимо проект Win32 Dynamic-Link Library з ім'ям Notify. Зазначимо візард різновид проекту - A simple DLL project. Отже, створений порожній проект. Зазначимо використовуються заголовки.        

    # include      

    # include        

    Перший заголовки зберігає в собі прототип WLX_NOTIFICATION_INFO. А другий стане в нагоді в процесі створення логів.

    У нас вже є функція DllMain, люб'язно надана візард. Залишимо її без змін. Напишемо функцію створення логів. Оскільки структура WLX_NOTIFICATION_INFO містить в собі Юнікод-рядки, буде зручно виводити дані в текстовий файл типу Юнікод.        

    void WriteLog (PWSTR pStrEventName,   

    PWLX_NOTIFICATION_INFO   pInfo)   

    (   

    // Перший параметр функції WriteLog буде   

    // містити опис події,   

    // а друге - самі дані.   

    // Задаємо назва log-файлу   

    WCHAR fName [] = L "C: log.txt";   

    WCHAR buf [1024];   

    // Готуємо рядок для логів. Варто зазначити   що якби   

    // було оголошено макрос STRICT, висновок   hDesktop   

    // необхідно було б робити по іншому.   

    swprintf (buf, L "Event:% s, User:% s,   Domain:% s, "   

    L "Window station:% s,   User token 0x% p, "   

    L "Desktop   0x% prn ", pStrEventName,   

    pInfo-> UserName,   pInfo-> Domain, pInfo-> WindowStation,   

    pInfo-> hToken,   pInfo-> hDesktop);   

    // Відкриваємо log-файл для запису.   

    HANDLE hFile =   CreateFileW (fName, GENERIC_WRITE,   

    FILE_SHARE_READ, NULL,   OPEN_EXISTING,   

    FILE_ATTRIBUTE_NORMAL,   NULL);   

    DWORD dwWritten;   

    // Якщо такого файлу немає, або сталася якась інша   

    // помилка, пробуємо створити новий файл.   

    if (hFile == INVALID_HANDLE_VALUE)   

    (   

    hFile = CreateFileW (fName,   GENERIC_WRITE,   

    FILE_SHARE_READ, NULL,   CREATE_NEW,   

    FILE_ATTRIBUTE_NORMAL,   NULL);   

    if (hFile ==   INVALID_HANDLE_VALUE)   

    (   

    // Якщо файл не створився, повідомляємо   користувачеві   

    // системним звуком про виникнення   помилки.   

    :: MessageBeep (MB_ICONASTERISK);   

    return;   

    )   

    WCHAR data = 0xFEFF;   

    // Зазначаємо, що створений файл буде   

    // включати текст типу Юнікод.   

    if (! WriteFile (hFile, & data,   sizeof (data),   

    & dwWritten, NULL))   

      :: MessageBeep (MB_ICONASTERISK);   

    )   

    // Оскільки відкритий файл може бути не   порожнім,   

    // переходимо в його кінець   

    if (SetFilePointer (hFile, 0,   NULL, FILE_END) ==   

    INVALID_SET_FILE_POINTER)   

    (   

      :: MessageBeep (MB_ICONASTERISK);   

    return;   

    )   

    // Записуємо рядок логу в файл   

    if (! WriteFile (hFile, buf, wcslen (buf) *   sizeof (WCHAR),   

    & dwWritten, NULL))   

      :: MessageBeep (MB_ICONASTERISK);   

    // Закінчуємо роботу з файлом   

    CloseHandle (hFile);   

    )     

    Тепер залишилося написати функції-обробники подій. Заради зручності назвемо їх так само, як показано в таблиці 1.        

    extern "C" void __stdcall   

      WLEventLogon (PWLX_NOTIFICATION_INFO pInfo)   

    (   

    WriteLog (L "user   logon ", pInfo);   

    )      

    extern "C" void __stdcall   

      WLEventLogoff (PWLX_NOTIFICATION_INFO pInfo)   

    (   

    WriteLog (L "user   logoff ", pInfo);   

    )      

    extern "C" void __stdcall   

      WLEventStartup (PWLX_NOTIFICATION_INFO pInfo)   

    (   

    WriteLog (L "system   startup ", pInfo);   

    )      

    extern "C" void __stdcall   

      WLEventShutdown (PWLX_NOTIFICATION_INFO pInfo)   

    (   

    WriteLog (L "system   shutdown ", pInfo);   

    )      

    extern "C" void __stdcall   

      WLEventStartScreenSaver (PWLX_NOTIFICATION_INFO pInfo)   

    (   

    WriteLog (L "screen saver   started ", pInfo);   

    )      

    extern "C" void __stdcall   

      WLEventStopScreenSaver (PWLX_NOTIFICATION_INFO pInfo)   

    (   

    WriteLog (L "screen saver   stopped ", pInfo);   

    )      

    extern "C" void __stdcall   

      WLEventLock (PWLX_NOTIFICATION_INFO pInfo)   

    (   

    WriteLog (L "Workstation   locked ", pInfo);   

    )      

    extern "C" void __stdcall   

      WLEventUnlock (PWLX_NOTIFICATION_INFO pInfo)   

    (   

    WriteLog (L "Workstation   unlocked ", pInfo);   

    )      

    extern "C" void __stdcall   

      WLEventStartShell (PWLX_NOTIFICATION_INFO pInfo)   

    (   

    WriteLog (L "User already   loged on and network "   

    L "resouces are   avaliable ", pInfo);   

    )     

    Тепер необхідно експортувати ці функції для інших програм. Для цього створимо файл Notify.def і додамо його в проект. У єдиною секції EXPORTS вкажемо експортовані функції        

    EXPORTS   

    WLEventLogon   

    WLEventLogoff   

    WLEventStartup   

    WLEventShutdown   

    WLEventStartScreenSaver   

    WLEventStopScreenSaver   

      WLEventLock   

      WLEventUnlock   

      WLEventStartShell     

    Після успішної компіляції необхідно підписатися на події Winlogon.        

    ПОПЕРЕДЖЕННЯ   

    Необхідно пам'ятати, що dll виповнюється   в адресному просторі процесу, який її викликає. Якщо dll спровокує   виняткову ситуацію, тоді, якщо не обробити помилку, робота процесу   буде припинено. Процес Winlogon.exe дуже чутливий до таких речей. При   виникненні помилки він покаже синій екран смерті, а в разі наявності   відповідних установок перевантажить систему. Тому наполегливо рекомендується   тестувати програму на віртуальному комп'ютері.     

    Для цього зайдемо до реєстру і знайдемо ключ:

    HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionWinlogonNotify

    Створимо в ньому з'єднання MyNotify і значення, як показано на малюнку нижче.

    Малюнок 1.

    Для зручності помістимо файл Notify.dll за вказаною шляху. Після перезавантаження системи додаток почне створювати логи.        

    ПРИМІТКА   

    Якщо логи не створюються, перевірте, чи не   чи використовується Notify.dll іншим процесом (якщо файл не вдається   перейменувати - значить, хтось його використовує). Якщо Notify.dll використовується,   а логів ні, швидше за все, неправильно задано одне з значень у назвах   функцій-обробників, або такі функції не експортуються динамічної   бібліотекою. Якщо Notify.dll не використовується, перевірте, чи правильно задано   ключ DllName з назвою бібліотеки. Можливо, бібліотека не зареєстрована   в системі, або не може бути завантажена.     

    Висновок

    Winlogon notification package може стати в нагоді в зовсім несподіваних місцях. Наприклад, якщо із системної служби необхідно отримати імена користувачів, що працюють в системі. Усе, що потрібно - це написати і зареєструвати в системі dll, яка за запитом передасть дані в службу (або сама буде передавати ці дані у відповідь на деякі потрібні події).

    Сподіваюся, що ця стаття розширить знання читача про інтерфейсах Winlogon, а також допоможе використовувати отримані знання на практиці.

    Список літератури

    Для підготовки даної роботи були використані матеріали з сайту http://www.rsdn.ru/

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status