如何在Windows2000中動態禁用/啟用Ctrl-Alt-Delete

在Windows2000中Ctrl-Alt-Delete組合鍵的處理如下:
Winlogon初始化的時候,在系統中注冊了CTRL ALT DEL Secure Attention Sequence(SAS)熱鍵,并且在WinSta0 Windows 系統中創建三個桌面 。SAS熱鍵的注冊使得Winlogon成為第一個處理CTRL ALT DEL的進程,所以保證了沒有其他應用程序能夠處理這個熱鍵 。
在 Windows;NT/Windows;2000/Windows;XP中,WinSta0 是表示物理屏幕、鼠標和鍵盤的Windows系統對象的名字 。Winlogon在WinSta0 Windows系統中創建了SAS窗口(窗口標題是"SAS Window")和如下三個桌面 。Winlogon 桌面 應用程序 桌面 屏幕保護 桌面當用戶按下Ctrl-Alt-Delete組合鍵時,Winlogon桌面上的SAS窗口收到它注冊的系統熱鍵消息(WM_HOTKEY) SAS Window窗口處理這個消息調用Graphical Identification and Authentication(GINA)動態連接庫中的相關函數要中斷Ctrl-Alt-Delete組合鍵的處理,可以有以下方式
從鍵盤驅動層捕獲Ctrl-Alt-Delete 替換Winlogon 替換GINA Hook Winlogon 上SAS窗口的窗口過程(需要當前登錄用戶有調試權限) Hook; GINA里邊的函數WlxLoggedOnSAS,然后返回WLX_SAS_ACTION_NONE(未研究)更多信息鑒于系統的更新可能造成我們替換的系統文件和其他系統文件不兼容(著名的DLL地獄),所以不推薦替換Winlogon.exe和GINA的方法 。這里我們討論Hook Winlogon 上的SAS窗口的窗口過程的方法 。因為SAS窗口和我們的程序內存地址空間不同,所以要寫一個動態連接庫,加載到SAS窗口的內存空間中 。下面是動態連接庫的源代碼 。//---------------------------------------------------------------------------
//作者 :韋覃武
//網上呢稱:BCB_FANS(四大名捕之追殺令)(此為CSDN和www.driverdevelop.com之帳號)
//E-Mail :slwqw@163.com
//日期 :2002-10-20
//
//功能 :在2000下屏蔽CtrlAltDel組合鍵 。(在Windows 2000 Professional SP3
// 中文版平臺下面測試通過)
//原理 :采用遠程線程注入技術,裝載一個DLL到Winlogon進程,然后截獲SAS窗口的窗
// 口過程,接管WM_HOTKEY消息,以達到屏蔽CtrlAltDel之目的 。
//開發語言:Borland CBuilder 5.0 Patch2
//技術比較:關于在2000下面如何屏蔽CtrlAltDel組合鍵,一種常被提到的解決方法就
// 是使用自己寫的GINA去替換MSGINA.DLL,然后在WlxLoggedOnSAS里邊直接返回
// WLX_SAS_ACTION_NONE 。嘿嘿,說到底這并不是真正地屏蔽了這個組合鍵,只是
// 直接返回WLX_SAS_ACTION_NONE時,Winlogon進程又自動從"Winlogon"桌面切換
// 回原來的"Default"桌面了,而不是顯示安全對話框,所以看起來被屏蔽了:),
// 使用那種方法明顯地看到桌面在閃爍!但是使用本文的方法時,你不會看到任
// 何閃爍!
//鳴謝 :www.driverdevelop.com上的icube和lu0 。
//版權 :轉載請注明原作者:)

//---------------------------------------------------------------------------

#include "stdafx.h"

#include

using namespace std;

//---------------------------------------------------------------------------

HWND hSASWnd;
FARPROC FOldProc;

LRESULT CALLBACK SASWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);

//---------------------------------------------------------------------------

HANDLE hThread = NULL;
DWord dwThreadId;

DWORD WINAPI ThreadFunc();

//---------------------------------------------------------------------------
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH :

hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&dwThreadId);
break;
case DLL_PROCESS_DETACH :
if(FOldProc != NULL)
{
SetWindowLong(hSASWnd,GWL_WNDPROC,long(FOldProc));

推薦閱讀