Windows2000平台下混合编程屏蔽键盘事件

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

关键词

Windows2000, VC++, C++Bulider,  Visual Basic, HOOK, DLL

 

引言

在一些应用场合,比如基于Windows2000(以下简称Win2K)下开发工控软件需要,为了增强系统安全性,需要对键盘事件进行监控、屏蔽。满足控制系统安全性要求。作为一个Win2K后台监控软件的编写,需要注意如下要点:HOOK(键盘挂钩函数)DLLMsgINA.dllShell_NotifyIcon(托盘函数)。为了提高软件编写效率,可以采用混合编程方式,即采用VC++/ C++Bulider 6.0编写DLL文件,采用Visual Basic编写客户端程序。

 

1           HOOKDLL简介

1)        HOOK

HOOK是一种反调函数。是Windows系统为应用程序提供用于监控系统各种事件消息的类中断程序。在系统消息机制里挂上用户自定义消息处理钩子(HOOK),达到对消息的过滤。Windows系统本身提供数个HOOK函数,为实现在Win2K/NT平台下的键盘屏蔽,要采用低级键盘HOOK,WH_KEYBOARD_LL。此HOOK函数可以屏蔽Ctrl+EscAlt+Tab、和Alt+Esc等系统功能键,在WINNT SP3后的操作系统中都是支持的。设置HOOK需要用到SetWindowsHookEx()函数,在程序退出后,必须用UnhookWindowsHookEx()函数卸载掉HOOK

 

2)        DLLMsgina.dll

DLL(动态链结库)Microsoft Windows最重要组成之一。大多数与Windows相关程序,不是程式模块组模式,就是动态链结库模式。为实现对所有键盘事件的监控,必须将HOOK函数放在DLL文件中。

Windows本身就是由许多的DLL组成的,它所有的库模块也都设计成DLL。在Win2K在,为了屏蔽CtrlAltDel组合键,必须了解Msgina.dll。在Win2K系统中,微软采用WinlogonGINA-Graphical Identification and Authentication提供交互式登录支持。登录成功后,按下CtrlAltDel组合键,系统将通过Winlogon调用Msgina.dll内部函数WlxLoggedOnSAS。所以要屏蔽CtrlAltDel组合键,则可以写一个新的GINA.dll,其中提供接口调用Msgina.dll,从而实现屏蔽。

 

3)      Shell_NotifyIcon

客户端程序应该运行在后台,所以可以将其最小化在系统托盘中。采用Shell_NotifyIcon API函数用来添加、删除、更改系统托盘区(taskbar status area)的图标。

 

2           程序实现

在本文中,采用VC++6.开发系统GINA DLL, C++Bulider 6.0开发低层HOOK DLL,VB6.0开发客户端程序,实现混合编程。

 

1)        自定义GINA编写

因为自定义GINA编写资料较多,本文只简要介绍。自定义GINA可以采用VC++6.0开发。下面给出Windows2000 Msgina内部函数表。表中函数将在自定义GINA中导入。

 

函数名

说明

WlxActivateUserShell

激活用户外壳程序

WlxDisPlayLockedNotice

允许GINA dll显示锁定信息

WlxDisPlaySASNotice

当没有用户登录时,winlogon调用此函数

WlxDisPlayStatusMessage

Winlogon用一个状态信息调用此函数进行显示

WlxGetConsoleSwitchCredentials

Winlogon调用此函数读取当前登录用户的信任信息,并透明的将它们传到目标会话

WlxGetStatusMessage

Winlogon调用此函数获取当前状态信息

WlxIntialize

针对指定的窗口位置进行GINA dll初始化

WlxIsLockOk

验证工作站正常锁定

WlxIslogoffOk

验证注销正常

WlxLoggedOnSAS

用户已登录并且工作站没有被加锁,若此时接收到SAS事件,则Winlogon调用此函数

WlxLoggedOutSAS

没有用户登录,若此时接收到SAS事件,则Winlogon调用此函数

WlxLogoff

请求注销操作时通知GINA dll

WlxNegotiate

表示当前的winlogon版本是否能使用GINA dll

WlxNetworkProviderLoad

在加载网络服务提供程序收集了身份和认证信息后,Winlogon调用此函数

WlxRemoveStatusMessage

Winlogon调用此函数告诉GINA dll停止显示状态信息

WlxScreensaverNotify

允许GINA与屏幕保护操作交互

WlxShutdown

在关闭之前Winlogon调用此函数,允许GINA实现任何关闭任务,例如从读卡器中退出智能卡

WlxStartApplication

当系统需要在用户的上下文中启动应用程序时调用此函数

WlxWkstalockedSAS

当工作站被锁定,如果接收到一个SAS,则Winlogon调用此函数

 

我们需要注意的是WlxLoggedOnSAS函数。屏蔽CtrlAltDel组合键代码将在调用该函数时添加。我们采用读取注册表键值来判断是否屏蔽,而该键值将在客户端程序中被操作。

 

// 当系统处于登陆成功,没有锁定的状态下

// Winlogon接收到SAS事件,于是调用该函数

int WINAPI WlxLoggedOnSAS(PVOID pWlxContext, DWORD dwSasType, PVOID pReserved)

{

         HKEY hKey;

         DWORD dwType=REG_DWORD; //定义读取数据类型:双字节

         char content[4];   //所查询注册表键值的内容

         DWORD dwLength=4;

         //打开注册表键

         if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE/FCSKBLock/KBConfig",

0,KEY_READ,&hKey)

==ERROR_SUCCESS)

         {       //读取CtrlAltDel键值

                   if(RegQueryValueEx(hKey,"CtrlAltDel",NULL,&dwType,(unsigned char *)content,&dwLength)

==ERROR_SUCCESS)

                   {

                            if(* content==1)

                                     return WLX_SAS_ACTION_NONE;//直接返回桌面程序,实现屏蔽

                   }

         }

         return theApp.MyWlxLoggedOnSAS(pWlxContext,dwSasType,pReserved ) ;

}

 

开发完成的自定义GINA.dll要放到Wintsystem32文件夹中。并修改注册表:

键项名

HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsNTCurrentVersionWinlogon

子键名

myGina(任意名称均可)

子键类型

[REG_SZ]

子键值 </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值