Реферат: Winlogon notification package. Теория и практика
WindowStation – определяет имя оконной станции, в которой текущий пользователь работает. Если событие случилось до входа пользователя в систему, то это поле равно NULL;
hToken – дескриптор token-а пользователя. Если событие случилось до входа пользователя в систему, то это поле равно NULL;
hDesktop – дескриптор Desktop’а для текущего события;
pStatusCallback – зарезервировано для внутреннего использования.
После создания динамической библиотеки нужно указать Winlogon, где ее можно найти, и какие события она будет обрабатывать. Вся информация размещается в системном реестре в ключе
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify
Полный доступ к нему имеют только пользователи с правами локального администратора. Обыкновенные пользователи не смогут создавать или изменять подключи и/или значения.
СОВЕТ Стоит отметить, что этого ключа не существует в ОС Win9x, но существует недокументированный аналог – HKEY_LOCAL_MACHINE\System\CurrentControlSet\control\MPRServices. С помощью этого ключа можно указать процессу 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 <Winwlx.h> #include <stdio.h> |
Первый заголовочный файл хранит в себе прототип WLX_NOTIFICATION_INFO. А второй пригодится в процессе создания логов.
У нас уже есть функция DllMain, любезно предоставленная визардом. Оставим ее без изменений. Напишем функцию создания логов. Поскольку структура WLX_NOTIFICATION_INFO содержит в себе Юникод-строки, будет удобно выводить данные в текстовый файл типа Юникод.
void WriteLog(PWSTR pStrEventName, PWLX_NOTIFICATION_INFO pInfo) { // Первый параметр функции WriteLog будет // содержать описание события, К-во Просмотров: 213
Бесплатно скачать Реферат: Winlogon notification package. Теория и практика
|