Windows7、10的热键屏蔽
最近有需求 在使用本软件的时候 防止一些操作,需要屏蔽系统的快捷键,于是简单整理了下实现方式
一、 hook技术的使用
hook技术:Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,
还可以强制结束消息的传递。简单来说,就是把系统的程序拉出来变成我们自己执行代码片段。
要实现钩子函数,有两个步骤:
1. 利用系统内部提供的接口,通过实现该接口,然后注入进系统(特定场景下使用)
2.动态代理(使用所有场景)
通过使用Hook技术可以加载低级键盘钩子来截获大部分的系统热键,并屏蔽它。这个方法比较简单,但有个缺陷,那就是对Ctrl+Alt+Del,Win+L没用。
原因:Winlogon初始化的时候,在系统中注册了Ctrl+Alt+Del Secure Attention Sequence(SAS)热键,并且在WinSta0 Windows 系统中创建三个桌面。SAS热键的注册使得Winlogon成为第一个处理CTRL+ALT+DEL的进程,所以保证了没有其他应用程序能够处理这个热键。
简单来说,就是这个热键的级别太高,不会经过我们的钩子链。所以接下我们的讨论重点在于如何屏蔽Ctrl+Alt+Del,Win+L。主要是以下方式(两种方式都需要管理员权限):
1、修改注册表
缺点:界面还是存在,只是关闭了打开任务管理器,切换用户等选项;
优点:可以定制我们的锁定界面,一次修改即可,除非恢复注册表,不然一直生效;
2、直接挂起winlogon.exe
缺点:只能通过重新恢复winlogon.exe来恢复热键,在重启机器之后还需要再次运行挂起程序;
优点:可以屏蔽所有快捷键,并且不会有锁定界面
二、修改注册表内容
首先思考我们屏蔽ctrl+alt+del的目的:为了不让用户可以杀死我们的进程,从而直接得到软件内部数据。
所以我们通过修改注册表也可以达到屏蔽Ctrl+Alt+DelL的效果。
具体我们要修改的项如下:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]
"DisableLockWorkstation"=dword:00000001
"DisableTaskMgr"=dword:00000001
"DisableChangePassword"=dword:00000001
"NoConfigPage"=dword:00000000
"NoDevMgrPage"=dword:00000000
"DisableSwitchUserOption"=dword:00000001
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoLogoff"=dword:00000001
效果:
这是修改之前的:
这是修改之后的:
正常情况下,policies子键都存在,如果失败,有两种可能:
1,没用使用管理员权限运行程序
2,没有这个子键,需要自行创建Policies。
三、挂起winlogon.exe进程
首先我们需要知道为什么要挂起winlogon以及为什么挂起winlogon可以达到我们要的屏蔽效果:
1,Winlogon 是负责处理安全相关的用户交互界面的组件。Winlogon的工作包括加载其他用户身份安全组件、提供图形化的登录界面,以及创建用户会话。
Winlogon在启动时还注册一个系统级别的安全注意序列(默认为Ctrl+Alt+Del)热键,以在在用户键入这个序列的时候切换到安全桌面显示系统安全界面。
2,所以当我们挂起winlogon时,系统就无法监听ctrl+alt+del,这样,就可以达到屏蔽的效果
由于winlogon时系统安全级别的进程,要挂起他不仅需要我们取得管理员权限,还要将我们的进程升级到debug级别。
在将我们的进程提升到debug级别之后,我们需要做的事就是根据winlogon.exe这个进程名找到对应的进程PID也即是进程句柄,然后利用这个句柄去挂起winlogon.exe和恢复winlogon.exe。
方案总结
关于屏蔽window7以及window10热键的方案,我们主要以hook为主,去选择性的屏蔽普通热键,再加上修改注册表或者挂起winlogon的方式去屏蔽系统级别的热键,从而达到保证用户权限对应软件操作的限制。