首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

Windows NT/2000 環境下攔截屏蔽 Ctrl+Alt+Del 組合鍵技術深度解析

     編輯:關於VC++

前言

在 Windows 9x 環境下,可使用 SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, NULL, 0) 屏蔽 Ctrl+Alt+Del,但在 NT/2000 環境下該方法失效,甚至連低層鍵盤 Hook(WH_KEYBOARD_LL)也無法攔截。本文透過替換 GINA DLL 技術,完美實現 NT/2000 下屏蔽 Ctrl+Alt+Del 功能。

核心原理

在 NT/2000 中,互動式登入支援由 WinLogon 呼叫 GINA DLL 實現。GINA DLL 提供互動式介面,為使用者登入提供認證請求。WinLogon 初始化時向系統註冊攔截 Ctrl+Alt+Del 訊息,導致其他程式無法取得該訊息。

WinLogon 與 GINA DLL 互動,預設為 MSGINA.DLL(位於 System32 目錄)。微軟提供介面讓開發者自行編寫 GINA DLL 取代 MSGINA.DLL。

WinLogon 初始化建立三個桌面

  1. WinLogon 桌面:顯示 Windows 安全性介面、登入介面等(按下 Ctrl+Alt+Del 切換至此)
  2. 應用程式桌面:日常使用的桌面(含「我的電腦」等)
  3. 螢幕保護桌面:螢幕保護程式顯示介面

使用者登入後按下 Ctrl+Alt+Del,WinLogon 回呼 GINA DLL 的輸出函式 WlxLoggedOnSAS,此時處於 WinLogon 桌面。只需直接切換至應用程式桌面,系統就不會顯示「Windows 安全性」介面,等同於使用者按下 Ctrl+Alt+Del 後無任何反應。切換桌面時會出現螢幕閃爍。

程式實作

GINA DLL 必須輸出的函式(WinLogon 會呼叫)

WlxActivateUserShell      WlxDisplayLockedNotice    WlxDisplaySASNotice
WlxDisplayStatusMessage   WlxGetStatusMessage       WlxInitialize
WlxIsLockOk               WlxIsLogoffOk             WlxLoggedOnSAS
WlxLoggedOutSAS           WlxLogoff                 WlxNegotiate
WlxNetworkProviderLoad    WlxRemoveStatusMessage    WlxScreenSaverNotify
WlxShutdown               WlxStartApplication       WlxWkstaLockedSAS

簡化開發策略:動態載入 MSGINA.DLL 函式

為簡化編程,從 MSGINA.DLL 動態取得上述函式,在自訂 DLL(以下稱 NoReboot.DLL)中直接呼叫 MSGINA.DLL 函式。核心處理 WlxLoggedOnSAS 函式:

int WINAPI WlxLoggedOnSAS(
    PVOID pWlxContext,
    DWORD dwSasType,
    PVOID pReserved)
{
    HANDLE hMutex;
    WriteInfo("WlxLoggedOnSAS \r\n");  // 記錄資訊

    if (dwSasType == WLX_SAS_TYPE_CTRL_ALT_DEL)  // 屏蔽 Ctrl+Alt+Del
    {
        // 使用 Mutex 控制是否屏蔽(注意:需用 Unicode)
        hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, L"_ac952_z_cn_CTRL_ALT_DEL");
        if (hMutex)
        {
            CloseHandle(hMutex);
            WriteInfo("disable CTRL+ALT+DEL \r\n");
            return WLX_SAS_ACTION_NONE;  // 切換至應用程式桌面,屏蔽 Ctrl+Alt+Del
        }
        else
            WriteInfo("not disable CTRL+ALT+DEL \r\n");
    }

    return prcWlxLoggedOnSAS(  // 呼叫從 MSGINA.DLL 取得的原始函式
        pWlxContext,
        dwSasType,
        pReserved);
}

在主程式中呼叫 CreateMutex(NULL, FALSE, "_ac952_z_cn_CTRL_ALT_DEL") 即可啟用屏蔽功能。

安裝與注意事項

關鍵技術細節

  • GINA DLL 使用 Unicode 字元集
  • 所有字串常數需加 L 前綴(如 L"_ac952_z_cn_CTRL_ALT_DEL")

GINA DLL 安裝步驟

  1. 登錄機碼:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon
  2. 值名稱:GinaDLL
  3. 值類型:REG_SZ
  4. 值資料:您的 GINA DLL 檔名,如 "NoReboot.DLL"
  1. 將 NoReboot.dll 複製至系統目錄(system32)
  2. 重新啟動電腦,GINA DLL 即生效

緊急恢復方案

若導致無法進入系統:

  • 進入 DOS 環境,將 msgina.dll 複製覆蓋為 NoReboot.dll
  • 或進入安全模式,刪除登錄機碼 GinaDLL

安全性與風險評估

風險項目影響程度緩解措施
系統無法啟動高預先建立恢復磁碟、熟悉安全模式修復流程
安全性降低中僅在特定受控環境(如資訊亭、考試系統)部署
相容性問題中充分測試目標 OS 版本(NT 4.0/2000/XP 差異)
反惡意軟體誤判高數位簽章、白名單機制、企業環境群組原則部署

適用場景與現代替代方案

傳統適用場景:公開資訊亭、考試系統、工業控制終端、數位看板等需防止使用者存取系統功能的專用設備。

現代替代方案(建議優先考慮):

  • Windows Kiosk 模式 / 指派存取權(Windows 10/11 內建)
  • 群組原則:User Configuration → Administrative Templates → System → Ctrl+Alt+Del Options
  • 登錄設定:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System 設定 DisableTaskMgr、DisableChangePassword 等
  • 第三方 Kiosk 軟體:功能更完整、管理更容易

結語

GINA DLL 替換技術雖能在 NT/2000 實現屏蔽 Ctrl+Alt+Del,但屬核心系統層級修改,風險極高。現代 Windows 版本(Vista 以降)已棄用 GINA 架構改用 Credential Providers,此技術僅具歷史參考價值。實務上強烈建議採用官方支援的 Kiosk 模式或群組原則方案,確保系統穩定性與安全性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved