Windows 전원 켜기 로그인 인증 및 Gina DLL

11816 단어 windows
Windows의 전원 켜기 암호 인증 모듈은 일반적으로 Gina DLL로 이루어집니다.NT/2000에서 인터랙티브 로그인 지원은 WinLogon이 GINA DLL을 호출하여 이루어진 것이고 GINA DLL은 인터랙티브 인터페이스를 제공하여 사용자의 로그인에 인증 요청을 제공한다.1. Gina의 원리인 WinLogon은 GINA DLL과 상호작용을 하는데 기본값은 MSGINA이다.DLL(System32 디렉토리)Microsoft는 MSGINA 대신 GINA DLL을 직접 작성할 수 있는 인터페이스를 제공합니다.DLL.
윈로곤을 초기화할 때 3개의 데스크톱을 만듭니다: (1) 윈로곤 데스크톱: 주로 윈도 보안 등 인터페이스를 표시합니다. 예를 들어 Ctrl + Alt + DEL, 로그인하는 인터페이스 등 (2) 프로그램 데스크톱: 우리가 평소에 본 내 컴퓨터가 있는 인터페이스 (3) 화면 보호 데스크톱: 화면 보호 디스플레이 인터페이스입니다.
기본적으로 GINA는 로그인 대화상자를 표시하고 사용자가 사용자 이름과 비밀번호를 입력합니다.따라서 사용자 이름과 암호를 얻으려면 새로운 GINA DLL을 작성하여 인터페이스에서 msgina를 호출할 수 있습니다.dll 함수 WlxLoggedOutSAS.
2. Gina DLL 내보내기 함수
NT/2000에서 인터랙티브 로그인 지원은 WinLogon이 GINA DLL을 호출하여 이루어진 것이고 GINA DLL은 인터랙티브 인터페이스를 제공하여 사용자의 로그인에 인증 요청을 제공한다.GINA DLL은 다음 함수를 출력합니다(Winlogon에서 호출됨).
(1) WlxActivateUserShell: 사용자 셸을 활성화합니다.(2) WlxDisplayLockedNotice: GINA DLL에 잠금 정보를 표시할 수 있습니다.(3) WlxDisplaySASNotice: 사용자가 로그인하지 않았을 때 Winlogon에서 이 함수를 호출합니다.(4) WlxDisplayStatusMessage: Winlogon은 상태 정보로 이 함수를 호출하여 표시합니다.(5) WlxGetStatusMessage: Winlogon에서 이 함수를 호출하여 현재 상태 정보를 가져옵니다.(6) WlxInitialize: 지정된 창 위치에서 GINA DLL을 초기화합니다.(7) WlxIsLockOk: 워크스테이션이 정상적으로 잠겨 있는지 확인합니다.(8) WlxIslogoffOk: 로그아웃이 정상적인지 확인합니다.(9) WlxLoggedOnSAS: 사용자가 로그인했고 워크스테이션이 잠기지 않았습니다. 만약에 SAS 이벤트를 받으면 Winlogon에서 이 함수를 호출합니다.(10) WlxLoggedOutSAS: 사용자가 로그인하지 않았습니다. SAS 이벤트를 받았을 때 Winlogon에서 이 함수를 호출합니다.(11) WlxLogoff: 로그아웃 작업을 요청할 때 GINA DLL에 알립니다.(12) WlxNegotiate: 현재 Winlogon 버전에서 GINA DLL을 사용할 수 있는지 여부를 나타냅니다.(13) WlxNetworkProviderLoad: 네트워크 서비스 제공 프로그램이 신분과 인증 정보를 수집한 후에 Winlogon에서 이 함수를 호출합니다.(14) WlxRemoveStatusMessage: Winlogon은 이 함수를 호출하여 GINA DLL에 상태 정보를 표시하지 말라고 알립니다.(15) WlxScreensaverNotify: GINA와 화면 보호 작업의 상호작용을 허용합니다.(16) WlxShutdown: 이 함수를 닫기 전에 Winlogon에서 호출하면 GINA가 카드 리더기에서 스마트카드를 종료하는 등 모든 닫는 작업을 수행할 수 있습니다.(17) WlxStartApplication: 시스템이 사용자의 컨텍스트에서 응용 프로그램을 시작해야 할 때 이 함수를 호출합니다.(18) WlxWkstaLocked SAS: 워크스테이션이 잠겨 있으면 SAS를 수신하면 Winlogon에서 이 함수를 호출합니다.이러한 18개의 기본 함수를 다시 작성함으로써 USB 인증 시스템의 Windows 로그인 인증을 실현합니다.
3. Gina DLL 프로토타입 코드
// USBGina.cpp :    DLL          。

//



#include "stdafx.h"



#define REALGINA_PATH      TEXT("MSGINA.DLL")



// Winlogon     

PWLX_DISPATCH_VERSION_1_0 g_pWinlogon;



// DLL  

HINSTANCE hDllInstance;



// Winlogon   

HANDLE hGlobalWlx;



// WLX_VERSION_1_0

PFWLXNEGOTIATE                pfWlxNegotiate;

PFWLXINITIALIZE               pfWlxInitialize;

PFWLXDISPLAYSASNOTICE         pfWlxDisplaySASNotice;

PFWLXLOGGEDOUTSAS             pfWlxLoggedOutSAS;

PFWLXACTIVATEUSERSHELL        pfWlxActivateUserShell;

PFWLXLOGGEDONSAS              pfWlxLoggedOnSAS;

PFWLXDISPLAYLOCKEDNOTICE      pfWlxDisplayLockedNotice;

PFWLXWKSTALOCKEDSAS           pfWlxWkstaLockedSAS;

PFWLXISLOCKOK                 pfWlxIsLockOk;

PFWLXISLOGOFFOK               pfWlxIsLogoffOk;

PFWLXLOGOFF                   pfWlxLogoff;

PFWLXSHUTDOWN                 pfWlxShutdown;



// WLX_VERSION_1_1

PFWLXSTARTAPPLICATION         pfWlxStartApplication  = NULL;

PFWLXSCREENSAVERNOTIFY        pfWlxScreenSaverNotify = NULL;



// WLX_VERSION_1_3

PFWLXNETWORKPROVIDERLOAD      pfWlxNetworkProviderLoad  = NULL;

PFWLXDISPLAYSTATUSMESSAGE     pfWlxDisplayStatusMessage = NULL;

PFWLXGETSTATUSMESSAGE         pfWlxGetStatusMessage     = NULL;

PFWLXREMOVESTATUSMESSAGE      pfWlxRemoveStatusMessage  = NULL;



// DLL       

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)

{

    switch (ul_reason_for_call)

    {

        case DLL_PROCESS_ATTACH:

            hDllInstance = hModule;

        case DLL_THREAD_ATTACH:

        case DLL_THREAD_DETACH:

        case DLL_PROCESS_DETACH:

            break;

    }

    return TRUE;

}



//      , WlxNegotiate    

BOOL MyInitialize(HINSTANCE hDll, DWORD dwWlxVersion)

{

    //      , msgina.dll HOOK WLX_VERSION_1_0    

    pfWlxNegotiate = (PFWLXNEGOTIATE) GetProcAddress(hDll, "WlxNegotiate");

    if (!pfWlxNegotiate)

    {

        return FALSE;

    }



    pfWlxInitialize = (PFWLXINITIALIZE) GetProcAddress(hDll, "WlxInitialize");

    if (!pfWlxInitialize)

    {

        return FALSE;

    }



    pfWlxDisplaySASNotice = (PFWLXDISPLAYSASNOTICE) GetProcAddress(hDll,

        "WlxDisplaySASNotice");

    if (!pfWlxDisplaySASNotice)

    {

        return FALSE;

    }



    pfWlxLoggedOutSAS = (PFWLXLOGGEDOUTSAS) GetProcAddress(hDll,

        "WlxLoggedOutSAS");

    if (!pfWlxLoggedOutSAS)

    {

        return FALSE;

    }



    pfWlxActivateUserShell = (PFWLXACTIVATEUSERSHELL) GetProcAddress(hDll,

        "WlxActivateUserShell");

    if (!pfWlxActivateUserShell)

    {

        return FALSE;

    }



    pfWlxLoggedOnSAS = (PFWLXLOGGEDONSAS) GetProcAddress(hDll, "WlxLoggedOnSAS");

    if (!pfWlxLoggedOnSAS)

    {

        return FALSE;

    }



    pfWlxDisplayLockedNotice = (PFWLXDISPLAYLOCKEDNOTICE) GetProcAddress(hDll,

        "WlxDisplayLockedNotice");

    if (!pfWlxDisplayLockedNotice)

    {

        return FALSE;

    }



    pfWlxIsLockOk = (PFWLXISLOCKOK) GetProcAddress(hDll, "WlxIsLockOk");

    if (!pfWlxIsLockOk)

    {

        return FALSE;

    }



    pfWlxWkstaLockedSAS = (PFWLXWKSTALOCKEDSAS) GetProcAddress(hDll,

        "WlxWkstaLockedSAS");

    if (!pfWlxWkstaLockedSAS)

    {

        return FALSE;

    }



    pfWlxIsLogoffOk = (PFWLXISLOGOFFOK) GetProcAddress(hDll, "WlxIsLogoffOk");

    if (!pfWlxIsLogoffOk)

    {

        return FALSE;

    }



    pfWlxLogoff = (PFWLXLOGOFF) GetProcAddress(hDll, "WlxLogoff");

    if (!pfWlxLogoff)

    {

        return FALSE;

    }



    pfWlxShutdown = (PFWLXSHUTDOWN) GetProcAddress(hDll, "WlxShutdown");

    if (!pfWlxShutdown)

    {

        return FALSE;

    }



    // HOOK WLX_VERSION_1_1      。

    if (dwWlxVersion > WLX_VERSION_1_0)

    {

        pfWlxStartApplication = (PFWLXSTARTAPPLICATION) GetProcAddress(hDll,

            "WlxStartApplication");

        if (!pfWlxStartApplication)

        {

            return FALSE;

        }



        pfWlxScreenSaverNotify = (PFWLXSCREENSAVERNOTIFY) GetProcAddress(hDll,

            "WlxScreenSaverNotify");

        if (!pfWlxScreenSaverNotify)

        {

            return FALSE;

        }

    }



    // HOOK WLX_VERSION_1_3      

    if (dwWlxVersion > WLX_VERSION_1_2)

    {

        pfWlxNetworkProviderLoad = (PFWLXNETWORKPROVIDERLOAD) GetProcAddress(hDll,

            "WlxNetworkProviderLoad");

        if (!pfWlxNetworkProviderLoad)

        {

            return FALSE;

        }



        pfWlxDisplayStatusMessage = (PFWLXDISPLAYSTATUSMESSAGE) GetProcAddress(hDll,

            "WlxDisplayStatusMessage");

        if (!pfWlxDisplayStatusMessage)

        {

            return FALSE;

        }



        pfWlxGetStatusMessage = (PFWLXGETSTATUSMESSAGE) GetProcAddress(hDll,

            "WlxGetStatusMessage");

        if (!pfWlxGetStatusMessage)

        {

            return FALSE;

        }



        pfWlxRemoveStatusMessage = (PFWLXREMOVESTATUSMESSAGE) GetProcAddress(hDll,

            "WlxRemoveStatusMessage");

        if (!pfWlxRemoveStatusMessage)

        {

            return FALSE;

        }

    }



    // HOOK      



    //    HOOK   

    return TRUE;

}



BOOL WINAPI WlxNegotiate(DWORD dwWinlogonVersion, DWORD * pdwDllVersion)

{

    HINSTANCE hDll = NULL;



    if (!(hDll = LoadLibrary(REALGINA_PATH)))

    {

        return FALSE;

    }



    if(MyInitialize(hDll, dwWinlogonVersion) == TRUE)

    {

        return pfWlxNegotiate(dwWinlogonVersion, pdwDllVersion);

    }



    return FALSE;

}



BOOL WINAPI WlxInitialize(LPWSTR  lpWinsta, HANDLE  hWlx, PVOID   pvReserved,

    PVOID   pWinlogonFunctions, PVOID * pWlxContext)

{

    g_pWinlogon = (PWLX_DISPATCH_VERSION_1_0) pWinlogonFunctions;

    hGlobalWlx = hWlx;

    return pfWlxInitialize(lpWinsta, hWlx, pvReserved, pWinlogonFunctions, pWlxContext);

}



void WINAPI WlxDisplaySASNotice(PVOID pWlxContext)

{

    pfWlxDisplaySASNotice(pWlxContext);



    g_pWinlogon->WlxDialogBoxParam(hGlobalWlx, hDllInstance, (LPTSTR)

        MAKEINTRESOURCE(IDD_LOGON_DLG), NULL, LogonDlgProc, 0);

}



int WINAPI WlxLoggedOutSAS(PVOID pWlxContext, DWORD dwSasType,

    PLUID pAuthenticationId, PSID pLogonSid, PDWORD pdwOptions,

    PHANDLE phToken, PWLX_MPR_NOTIFY_INFO pMprNotifyInfo, PVOID * pProfile)

{

    //    Windows       

    return pfWlxLoggedOutSAS(pWlxContext, dwSasType, pAuthenticationId, pLogonSid,

        pdwOptions, phToken, pMprNotifyInfo, pProfile);

}



BOOL WINAPI WlxActivateUserShell (PVOID pWlxContext, PWSTR pszDesktopName,

    PWSTR pszMprLogonScript, PVOID pEnvironment)

{

    //    Windows       ,  MSGINA.DLL    

    return pfWlxActivateUserShell(pWlxContext, pszDesktopName, pszMprLogonScript,

        pEnvironment);

}



int WINAPI WlxLoggedOnSAS (PVOID pWlxContext, DWORD dwSasType, PVOID pReserved)

{

    return pfWlxLoggedOnSAS(pWlxContext, dwSasType, pReserved);

}



void WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)

{

    pfWlxDisplayLockedNotice(pWlxContext);



    wcscpy(account.strUsername, TEXT(""));

    wcscpy(account.strPassword, TEXT(""));

    account.bLogonStatus = FALSE;



    g_pWinlogon->WlxDialogBoxParam(hGlobalWlx, hDllInstance, (LPTSTR)

        MAKEINTRESOURCE(IDD_LOGON_DLG), NULL, LogonDlgProc, 0);

}



BOOL WINAPI WlxIsLockOk(PVOID pWlxContext)

{

    return pfWlxIsLockOk(pWlxContext);

}



int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)

{

    return pfWlxWkstaLockedSAS(pWlxContext, dwSasType);

}



BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext)

{

    return pfWlxIsLogoffOk(pWlxContext);

}



void WINAPI WlxLogoff(PVOID pWlxContext)

{

    pfWlxLogoff(pWlxContext);

}



void WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType)

{

    pfWlxShutdown(pWlxContext, ShutdownType);

}



// WLX_VERSION_1_1 

BOOL WINAPI WlxScreenSaverNotify(PVOID pWlxContext, BOOL * pSecure)

{

    return pfWlxScreenSaverNotify(pWlxContext, pSecure);

}



BOOL WINAPI WlxStartApplication(PVOID pWlxContext, PWSTR pszDesktopName,

    PVOID pEnvironment, PWSTR pszCmdLine)

{

    return pfWlxStartApplication(pWlxContext, pszDesktopName, pEnvironment, pszCmdLine);

}



// WLX_VERSION_1_3 

BOOL WINAPI WlxNetworkProviderLoad(PVOID pWlxContext, PWLX_MPR_NOTIFY_INFO

    pNprNotifyInfo)

{

    return pfWlxNetworkProviderLoad(pWlxContext, pNprNotifyInfo);

}



BOOL WINAPI WlxDisplayStatusMessage (PVOID pWlxContext, HDESK hDesktop,

    DWORD dwOptions, PWSTR pTitle, PWSTR pMessage)

{

    return pfWlxDisplayStatusMessage(pWlxContext, hDesktop, dwOptions, pTitle, pMessage);

}



BOOL WINAPI WlxGetStatusMessage(PVOID pWlxContext, DWORD * pdwOptions,

    PWSTR pMessage, DWORD dwBufferSize)

{

    return pfWlxGetStatusMessage(pWlxContext, pdwOptions, pMessage, dwBufferSize);

}



BOOL WINAPI WlxRemoveStatusMessage(PVOID pWlxContext)

{

    return pfWlxRemoveStatusMessage(pWlxContext);

}

4. Gina DLL 설치(1) 레지스트리 추가(2) 키 이름: HKEYLOCAL_MACHINE\Software\Microsoft\Windows NT\(3)CurrentVersion\Winlogon\(4) 변수 이름: GinadL(5) 변수 유형: [REG SZ](6) 내용: Yourname.dll(7) Gina DLL(Yourname.dll)을 시스템 디렉토리(시스템32)로 복사합니다.(8) 컴퓨터를 재부팅하면 Gina DLL(Yourname.dll)이 실행됩니다.
5. 결어
위의 Gina DLL 은 Windows msgina 를 호출한 원형임에도 불구하고, 재부팅하면 확인할 수 있습니다.dll 안의 함수, 그러나 사실상 모든 함수는 우리 훅에 의해 호출되었고, 시스템 함수를 호출하기 전에 반드시 우리의 함수를 통과할 것이다.다음은 이 주제와 관련된 정보입니다. (1) WlxLoggedOnSAS를 통해 Windows 운영체제의 Ctrl+Alt+Del을 차단할 수 있습니다.(2) WlxLoggedOutSAS에서 사용자가 로그인한 사용자 이름과 비밀번호를 캡처할 수 있다.(3) 이 원형을 통해 지문(예를 들어 ThinkPad 노트북)과 특정한 USB로 로그인할 수 있는 등 개성화된 전원 인증을 실현할 수 있다.

좋은 웹페이지 즐겨찾기