logo

English

이곳의 프로그래밍관련 정보와 소스는 마음대로 활용하셔도 좋습니다. 다만 쓰시기 전에 통보 정도는 해주시는 것이 예의 일것 같습니다. 질문이나 오류 수정은 siseong@gmail.com 으로 주세요. 감사합니다.

GINA(Graphical Identification aNd Authentication), SAS(Secure Attention Sequence)

by digipine posted Oct 29, 2017
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print


Winlogon.exe 에는 GINA DLL과 여러개의 Network Provider DLL이 연결 되어 있습니다.

Ctrl+Alt+Del 역시 GINA에서 담당하고 있습니다.
그래서 이걸 이용하면 2000에서 쉽게  ctrl+alt+del을 막을 수 있습니다.

여기서 mygina.dll을 하나 만듭니다. 윈도우즈를 속인다고 말해야 하나? 하지만, 정확히는 속이는 것은 아닙니다.
mygina.dll 역시 msgina를 내부적으로 호출합니다. 이 과정에서 약간의 조작이 필요하죠. ctrl+alt+del을 눌렀을 때...
msgina을 호출을 하지 않는 다면 어떨까요? 바로 이것을 이용한 것입니다.

윈도우즈 디랙토리 밑에 system32 myGina.dll을 복사 합니다.
그리고 레지스트리에 다음값을 추가하죠.

Key Name: \HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ Winlogon

Value Name: GinaDLL

Value Type: [REG_SZ]

Value: MyGina.dll (패스를 넣어 주시는 것이 정확할겁니다.
Name                 Type                          Data
GinaDLL            REG_SZ                  "c:\winnt\system32\mygina.dll"

그리고 재부팅하면 끝입니다. 그 담부터 Ctrl+Alt+Del 이 먹지 않을 겁니다. 복구 하려면....
myGina.dll을 제거 하던지.. 레지스트리 값을 제거하시던지 해야 겠죠.



mygina의 소스는 다음과 같습니다.
#include <windows.h>
#include <winwlx.h>

struct {
    HMODULE hDll;
    BOOL (WINAPI *WlxNegotiate)();
    BOOL (WINAPI *WlxInitialize)();
    VOID (WINAPI *WlxDisplaySASNotice)();
    int (WINAPI *WlxLoggedOutSAS)();
    BOOL (WINAPI *WlxActivateUserShell)();
    int (WINAPI *WlxLoggedOnSAS)();
    VOID (WINAPI *WlxDisplayLockedNotice)();
    int (WINAPI *WlxWkstaLockedSAS)();
    BOOL (WINAPI *WlxIsLockOk)();
    BOOL (WINAPI *WlxIsLogoffOk)();
    VOID (WINAPI *WlxLogoff)();
    VOID (WINAPI *WlxShutdown)();
    BOOL (WINAPI *WlxScreenSaverNotify)();
    BOOL (WINAPI *WlxStartApplication)();
    BOOL (WINAPI *WlxNetworkProviderLoad)();
} MsGina;

BOOL WINAPI WlxNegotiate(DWORD dwWinlogonVersion, PDWORD pdwDllVersion)
{
    MsGina.hDll = LoadLibrary("msgina.dll");
    if(MsGina.hDll == NULL) return FALSE;

    MsGina.WlxActivateUserShell = GetProcAddress(MsGina.hDll, "WlxActivateUserShell");
    MsGina.WlxDisplayLockedNotice = GetProcAddress(MsGina.hDll, "WlxDisplayLockedNotice");
    MsGina.WlxDisplaySASNotice = GetProcAddress(MsGina.hDll, "WlxDisplaySASNotice");
    MsGina.WlxInitialize = GetProcAddress(MsGina.hDll, "WlxInitialize");
    MsGina.WlxIsLockOk = GetProcAddress(MsGina.hDll, "WlxIsLockOk");
    MsGina.WlxIsLogoffOk = GetProcAddress(MsGina.hDll, "WlxIsLogoffOk");
    MsGina.WlxLoggedOnSAS = GetProcAddress(MsGina.hDll, "WlxLoggedOnSAS");
    MsGina.WlxLoggedOutSAS = GetProcAddress(MsGina.hDll, "WlxLoggedOutSAS");
    MsGina.WlxLogoff = GetProcAddress(MsGina.hDll, "WlxLogoff");
    MsGina.WlxNegotiate = GetProcAddress(MsGina.hDll, "WlxNegotiate");
    MsGina.WlxScreenSaverNotify = GetProcAddress(MsGina.hDll, "WlxScreenSaverNotify");
    MsGina.WlxShutdown = GetProcAddress(MsGina.hDll, "WlxShutdown");
    MsGina.WlxStartApplication = GetProcAddress(MsGina.hDll, "WlxStartApplication");
    MsGina.WlxWkstaLockedSAS = GetProcAddress(MsGina.hDll, "WlxWkstaLockedSAS");

    return MsGina.WlxNegotiate(dwWinlogonVersion, pdwDllVersion);
}

BOOL WINAPI WlxInitialize(
    LPWSTR lpWinsta,
    HANDLE hWlx,
    PVOID pvReserved,
    PVOID pWinlogonFunctions,
    PVOID *pWlxContext)
{
    return MsGina.WlxInitialize(
        lpWinsta,
        hWlx,
        pvReserved,
        pWinlogonFunctions,
        pWlxContext);
}

VOID WINAPI WlxDisplaySASNotice(PVOID pWlxContext)
{
    MsGina.WlxDisplaySASNotice(pWlxContext);
}

int WINAPI WlxLoggedOutSAS(
    PVOID pWlxContext,
    DWORD dwSasType,
    PLUID pAuthenticationId,
    PSID pLogonSid,
    PDWORD pdwOptions,
    PHANDLE phToken,
    PWLX_MPR_NOTIFY_INFO pNprNotifyInfo,
    PVOID *pProfile)
{
    return MsGina.WlxLoggedOutSAS(
        pWlxContext,
        dwSasType,
        pAuthenticationId,
        pLogonSid,
        pdwOptions,
        phToken,
        pNprNotifyInfo,
        pProfile);
}

BOOL WINAPI WlxActivateUserShell(
    PVOID pWlxContext,
    PWSTR pszDesktopName,
    PWSTR pszMprLogonScript,
    PVOID pEnvironment)
{
    return MsGina.WlxActivateUserShell(
        pWlxContext,
        pszDesktopName,
        pszMprLogonScript,
        pEnvironment);
}

int WINAPI WlxLoggedOnSAS(PVOID pWlxContext, DWORD dwSasType, PVOID pReserved)
{
    HANDLE hMutex;

    if(dwSasType == WLX_SAS_TYPE_CTRL_ALT_DEL) {
        hMutex = OpenMutex(MUTANT_QUERY_STATE, FALSE, "mygina mutex");
        if(hMutex != NULL) {
            CloseHandle(hMutex);
            return WLX_SAS_ACTION_NONE;
        }
    }

    return MsGina.WlxLoggedOnSAS(pWlxContext, dwSasType, pReserved);
}

VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)
{
    MsGina.WlxDisplayLockedNotice(pWlxContext);
}

int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)
{
    return MsGina.WlxWkstaLockedSAS(pWlxContext, dwSasType);
}

BOOL WINAPI WlxIsLockOk(PVOID pWlxContext)
{
    return MsGina.WlxIsLockOk(pWlxContext);
}

BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext)
{
    return MsGina.WlxIsLogoffOk(pWlxContext);
}

VOID WINAPI WlxLogoff(PVOID pWlxContext)
{
    MsGina.WlxLogoff(pWlxContext);
}

VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType)
{
    MsGina.WlxShutdown(pWlxContext, ShutdownType);
}

BOOL WINAPI WlxScreenSaverNotify(PVOID pWlxContext, BOOL *pSecure)
{
    return MsGina.WlxScreenSaverNotify(pWlxContext, pSecure);
}

BOOL WINAPI WlxStartApplication(
    PVOID pWlxContext,
    PWSTR pszDesktopName,
    PVOID pEnvironment,
    PWSTR pszCmdLine)
{
    return MsGina.WlxStartApplication(pWlxContext, pszDesktopName, pEnvironment, pszCmdLine);
}

BOOL WINAPI WlxNetworkProviderLoad(PVOID pWlxContext, PWLX_MPR_NOTIFY_INFO pNprNotifyInfo)
{
    return MsGina.WlxNetworkProviderLoad(pWlxContext, pNprNotifyInfo);
}








-------------------------------------------------------



프로그램에서 ctrl+alt+del을 막았다 풀었다 하려구...
제가 바꾼 부분이 있었군요.
mygina.c에 보시면 다음과 같은 코드가 있습니다.

int WINAPI WlxLoggedOnSAS(PVOID pWlxContext, DWORD dwSasType, PVOID pReserved)
{
    HANDLE hMutex;

    if(dwSasType == WLX_SAS_TYPE_CTRL_ALT_DEL) {
        hMutex = OpenMutex(MUTANT_QUERY_STATE, FALSE, "mygina mutex");
        if(hMutex != NULL) {
            CloseHandle(hMutex);
            return WLX_SAS_ACTION_NONE;
        }
    }

    return MsGina.WlxLoggedOnSAS(pWlxContext, dwSasType, pReserved);
}

mygina mutex 라는 뮤텍스가 있으면 막고 없으면 풀고 하는 부분이거든요.

그러니깐.. 제어하려는 프로그램에서 ctrl+alt+del을 막으려면...

HANDLE hMutex
hMutex = CreateMutex(NULL, TRUE, "mygina mutex");
코드를 넣으셔야 합니다.

아니면.
int WINAPI WlxLoggedOnSAS(PVOID pWlxContext, DWORD dwSasType, PVOID pReserved)
{
    HANDLE hMutex;

    if(dwSasType == WLX_SAS_TYPE_CTRL_ALT_DEL) {
        return WLX_SAS_ACTION_NONE;
    }

    return MsGina.WlxLoggedOnSAS(pWlxContext, dwSasType, pReserved);
}

이렇게 바꾸시면 무조건 막겠죠....

괜히 수고를 끼쳐 드렸군요.^^
그럼 즐프 하시구요.





-------------------------------------------------------------



그래도 안되시면..


아랫부분을 mygina.def  파일로 하나 만드시고 프로젝트에 추가 하시기 바랍니다.

EXPORTS
    WlxActivateUserShell
    WlxDisplayLockedNotice
    WlxDisplaySASNotice
    WlxInitialize
    WlxIsLockOk
    WlxIsLogoffOk
    WlxLoggedOnSAS
    WlxLoggedOutSAS
    WlxLogoff
    WlxNegotiate
    WlxScreenSaverNotify
    WlxShutdown
    WlxStartApplication
    WlxWkstaLockedSAS

 
TAG •

List of Articles
No. Subject Author Date Views
» GINA(Graphical Identification aNd Authentication), SAS(Secure Attention Sequence) digipine 2017.10.29 1258
4 The .Net Developer's Guide to Directory Services Programming digipine 2017.10.29 7168
3 Customizing GINA, Part 2 digipine 2017.10.28 96711
2 Customizing GINA, Part 1 digipine 2017.10.28 21759
1 [MFC] Dialog에서 부모 윈도우 알아내기 digipine 2017.10.28 923
Board Pagination Prev 1 2 3 Next
/ 3