Windows 전원 켜기 로그인 인증 및 Gina DLL
11816 단어 windows
윈로곤을 초기화할 때 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로 로그인할 수 있는 등 개성화된 전원 인증을 실현할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제한된 크기의 디렉토리를 만드는 방법오늘 저는 장치에 공간이 없을 때 백업 중에 응용 프로그램이 어떻게 작동하는지 테스트(및 수정)하는 작업이 있습니다. 결과적으로 "남은 공간 없음"오류로 백업이 실패하면 새 파일이 없어야 합니다. 지금까지 문제를 재...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.