屏蔽Ctrl+alt+del

在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   :[email protected]  
    
   //日期   :2002-10-20  
    
   //  
    
   //功能   :在2000下屏蔽Ctrl   +   Alt   +   Del组合键。(在Windows   2000   Professional   SP3  
    
   //   中文版平台下面测试通过)  
    
   //原理   :采用远程线程注入技术,装载一个DLL到Winlogon进程,然后截获SAS窗口的窗  
    
   //   口过程,接管WM_HOTKEY消息,以达到屏蔽Ctrl   +   Alt   +   Del之目的。  
    
   //开发语言:Borland   C++Builder   5.0   Patch2  
    
   //技术比较:关于在2000下面如何屏蔽Ctrl   +   Alt   +   Del组合键,一种常被提到的解决方法就  
    
   //   是使用自己写的GINA去替换MSGINA.DLL,然后在WlxLoggedOnSAS里边直接返回  
    
   //   WLX_SAS_ACTION_NONE。嘿嘿,说到底这并不是真正地屏蔽了这个组合键,只是  
    
   //   直接返回WLX_SAS_ACTION_NONE时,Winlogon进程又自动从"Winlogon"桌面切换  
    
   //   回原来的"Default"桌面了,而不是显示安全对话框,所以看起来被屏蔽了:),  
    
   //   使用那种方法明显地看到桌面在闪烁!但是使用本文的方法时,你不会看到任  
    
   //   何闪烁!  
    
   //鸣谢   :www.driverdevelop.com上的icube和lu0。  
    
   //版权   :转载请注明原作者:)  
    
   //---------------------------------------------------------------------------  
    
   #include   "stdafx.h"  
    
   #include   <string>  
    
   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));  
    
   }  
    
   CloseHandle(hThread);  
    
   break;  
    
   }  
    
   return   TRUE;  
    
   }  
    
   //---------------------------------------------------------------------------  
    
   DWORD   WINAPI   ThreadFunc()  
    
   {  
    
   HDESK   hDesk;  
    
   hDesk   =   OpenDesktop("Winlogon",0,false,MAXIMUM_ALLOWED);  
    
   FOldProc   =   NULL;  
    
   hSASWnd   =   NULL;  
    
   EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowsProc,0);  
    
   if(hSASWnd   !=   NULL)  
    
   {  
    
   FOldProc   =   (FARPROC)SetWindowLong(hSASWnd,GWL_WNDPROC,long(SASWindowProc));  
    
   }  
    
   CloseHandle(hDesk);  
    
   return   1;  
    
   }  
    
   //---------------------------------------------------------------------------  
    
   //查找"Winlogon"桌面的窗口  
    
   BOOL   CALLBACK   EnumWindowsProc(HWND   hwnd,LPARAM   lParam)  
    
   {  
    
   char   ClassBuf[128];  
    
   GetWindowText(hwnd,ClassBuf,sizeof(ClassBuf));  
    
   //我自己写了一个系统服务,然后在里边查询"Winlogon"桌面上的窗口,发现桌面上存在  
    
   //窗口"SAS   window"。  
    
   string   ClassName(ClassBuf);  
    
   if(ClassName.find("SAS   window")   !=   -1)  
    
   {  
    
   hSASWnd   =   hwnd;  
    
   return   false;  
    
   }  
    
   return   true;  
    
   }  
    
   //---------------------------------------------------------------------------  
    
   //SAS窗口的窗口过程  
    
   LRESULT   CALLBACK   SASWindowProc(HWND   hwnd,UINT   uMsg,WPARAM   wParam,LPARAM   lParam)  
    
   {  
    
   //屏蔽Ctrl   +   Alt   +   Del  
    
   if(uMsg   ==   WM_HOTKEY)  
    
   {  
    
   WORD   wKey   =   HIWORD(lParam);  
    
   WORD   wModifier   =   LOWORD(lParam);  
    
   bool   IsCtrlDown   =   ((wModifier   &   VK_CONTROL)   !=   0);  
    
   bool   IsAltDown   =   ((wModifier   &   VK_MENU)   !=   0);  
    
   bool   IsShiftDown   =   ((wModifier   &   VK_SHIFT)   !=   0);  
    
   //按下Ctrl   +   Alt   +   Del组合键  
    
   if(IsCtrlDown   &&   IsAltDown   &&   wKey   ==   VK_DELETE)  
    
   {  
    
   return   1;  
    
   }  
    
   //按下Ctrl   +   Shift   +   Esc组合键,这个组合键将显示任务管理器,可根据需要是否屏蔽。  
    
   else   if(IsCtrlDown   &&   IsShiftDown   &&   wKey   ==   VK_ESCAPE)  
    
   {  
    
   //   Do   nothing  
    
   }  
    
   }  
    
   return   CallWindowProc((WNDPROC)FOldProc,hwnd,uMsg,wParam,lParam);  
    
   }  
    
   //---------------------------------------------------------------------------  
    
   这样,如果Winlogon加载了这个动态连接库,那么就替换了SAS窗口的窗口过程。如果Winlogon卸载了这个动态连接库,则恢复了SAS窗口的窗口过程。  
    
   为了让Winlogon加载我们的动态连接库,首先要找到Winlogon进程,然后在进程中分配空间存放我们的代码,再通过创建远程线程赖执行我们的代码。下面是Hook部分的代码  
    
   //---------------------------------------------------------------------------  
    
   //作者   :韦覃武,jiangsheng  
    
   //网上呢称:BCB_FANS(四大名捕之追杀令)(此为CSDN和www.driverdevelop.com之帐号)jiangsheng(此为CSDN帐号)  
    
   //E-Mail   :[email protected]  
    
   //日期   :2002-10-20  
    
   //2002-11-5   jingsheng修改  
    
   //功能   :在2000下屏蔽Ctrl   +   Alt   +   Del组合键。(在Windows   2000   Professional   SP3  
    
   //   中文版平台下面测试通过)  
   //原理   :采用远程线程注入技术,装载一个DLL到Winlogon进程,然后截获SAS窗口的窗  
    
   //   口过程,接管WM_HOTKEY消息,以达到屏蔽Ctrl   +   Alt   +   Del之目的。  
    
   //开发语言:Borland   C++Builder   5.0   Patch2,Visual   C++   6.0   SP5  
    
   //技术比较:关于在2000下面如何屏蔽Ctrl   +   Alt   +   Del组合键,一种常被提到的解决方法就  
   //   是使用自己写的GINA去替换MSGINA.DLL,然后在WlxLoggedOnSAS里边直接返回  
   //   WLX_SAS_ACTION_NONE。嘿嘿,说到底这并不是真正地屏蔽了这个组合键,只是  
   //   直接返回WLX_SAS_ACTION_NONE时,Winlogon进程又自动从"Winlogon"桌面切换  
   //   回原来的"Default"桌面了,而不是显示安全对话框,所以看起来被屏蔽了:),  
   //   使用那种方法明显地看到桌面在闪烁!但是使用本文的方法时,你不会看到任  
   //   何闪烁!  
   //鸣谢   :www.driverdevelop.com上的icube和lu0。  
   //版权   :转载请注明原作者:)  
   //---------------------------------------------------------------------------

你可能感兴趣的:(windows,action,callback,Borland,hook,winapi)