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
25 RegEnumKeyEx 함수 사용법 digipine 2017.10.29 755
24 [WINCE] Process, Thread API 함수 사용법 digipine 2017.10.29 960
23 [WINCE] 메모리카드 상태 감시 digipine 2017.10.29 327
22 [WINCE] IAT Hooking 방법과 소스 코드 digipine 2017.10.29 659
21 [WINCE] 키보드 및 마우스 메시지 후킹하기 digipine 2017.10.29 809
20 [C#] C#에서 C++ DLL의 Call by Referance out 인수 사용하는 방법 digipine 2017.10.29 1077
19 [C#] Convert char[] to string digipine 2017.10.29 301
18 VS2005 ConvertBSTRToString 에서 LNK2019 에러 대처법 digipine 2017.10.29 192
17 VS2003 이상에서 iostream 구현의 문제점 digipine 2017.10.29 256
16 DLL과 EXE간의 데이타 공유하기 digipine 2017.10.29 837
15 Serialize를 이용한 객체 복사하기 (Copy constructor) digipine 2017.10.29 499
14 세마포어의 개념과 사용법 digipine 2017.10.29 765
13 VC++ 에서 대소문자 변경하는 함수 digipine 2017.10.29 311
12 VC++(MFC)에서 MDB 생성 / 압축 / 연동관리자 digipine 2017.10.29 2656
11 CreateSemaphore Semaphore Manager digipine 2017.10.29 447
10 Mutex, Critical Section Class 만들기 digipine 2017.10.29 392
9 Windows API 멀티 쓰레드 구현법 digipine 2017.10.29 694
8 RPC에 대하여... (3) : RPC 작동을 위한 테스트 방법 digipine 2017.10.29 543
7 RPC에 대하여... (2) : RPC 가 사용하는 포트를 바꿔보자 digipine 2017.10.29 1118
6 RPC에 대하여... (1) : RPC 가 사용하는 TCP/IP 포트는 ? digipine 2017.10.29 1296
Board Pagination Prev 1 2 3 Next
/ 3