Q&A

  • Ctrl + Alt + Delete 키 제어 방법 문의드립니다.
안녕하세요.

왠만한 궁금점은 답변을 통하여 해결하였는데요...
이번에는 찾을 수가 없는 장벽에 막혔습니다.

제가 하고 싶은 것은...

98까지는 상관이 없지만 NT 이상에서 (특히 XP에서) Ctrl + Alt + Delete을 눌렀을 때에 작업관리자 창이 나오지 않도록 하고 싶습니다.

방법을 여기저기 찾아보니 DnCGina.dll을 시스템 폴더에 복사하고 레지스트리 셋팅으로 한다고 합니다.
그런데 이 dll파일을 직접 만들면 Ctrl + Alt + Delete을 눌렀을 때에 원하는 화면을 나오도록 할 수 있다고 하는데요...

저는 작업관리자 버튼이 비활성화된 화면을 보여주고 싶습니다.

방법이나 소스, 참고 사이트를 알고 계시면 도움 부탁드립니다.

고수님들의 답변을 기다리며 이만...
2  COMMENTS
  • Profile
    황해철 2005.06.15 01:35



    자답을 올립니다.

    제가 원했던 것은 Ctrl + Alt + Delete을 눌러 작업관리자가 나와 저의 프로세스를 죽이지 못하게 하는 것이었습니다.
    훅킹을 사용하지 않은 이유는 게임 가드라는것 때문에 훅킹을 사용하면 안되었던 것이고요...

    방법을 생각해 보니 몇가지가 있더군요.
    1. 작업관리자 창을 아예 실행하지 못하도록 막는다.
    => HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System
        여기에 DisableTaskMgr를 만들고 값을 1로 한다.
       이렇게 하면 작업관리자창을 선택하는 화면이 disable 됩니다.

    2. 키보드를 제어하는 driver를 만들어 Ctrl + Alt + Delete를 사용하지 못하도록 한다.
      
    3. Gina dll을 이용하여 Ctrl + Alt + Delete를 제어한다.
    소스는 아래와 같습니다. (다른 사이트에서 찾아 옮겼슴다.)

    Ctrl+Alt+Del 키 막기 (Win NT, 2K, Xp)

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

    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
    #include

    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);
    }

    이렇게 바꾸시면 무조건 막겠죠....
    # by lastinno | 2005-03-25 14:03 | 컴터 가지고 놀기 | 관련글 | 덧글(0)
    2005년 03월 22일
    컴퓨터 잠그기(LockWorkStation)


    WinExec("c:\\winnt\\system32\\rundll32.exe user32.dll,LockWorkStation",SW_SHOWNORMAL);
    # by lastinno | 2005-03-22 10:17 | 컴터 가지고 놀기 | 관련글 | 덧글(0)
  • Profile
    모영철 2005.05.21 21:05
    후킹으로 특정 프로그램이 실행되는걸 알수 있습니다.