![XP系统中屏蔽ESC键序列的方法 XP系统中屏蔽ESC键序列的方法](/rjstyle/noimg/30.webp)
对于那些已经用过,几乎没有人不知道CTRL+ALT+DEL组合键,尤其是当使用频繁崩溃Windows9x、使用更高的频率。这个组合键是专门为系统safety.vc知识库的缘故是在线杂志第十一期。ac952_z_cn在他的个人专栏写一篇关于它的文章:如何屏蔽Ctrl + Alt + del ldquo和Windows NT下/ 2000.therefore,本文重点研究了如何屏蔽Ctrl+Alt+Del组合键在Windows XP中,即任务管理器,任务切换键(Alt + Tab),任务栏和开始菜单(按Ctrl + Esc,vk_lwin,vk_rwin)。这种方法也可以应用到Windows 2000环境下。
在Windows 9x /我的系统,屏蔽Ctrl+Alt+Del和各种任务的关键方法是通过以下方法实现:
布尔boldstate;
SystemParametersInfo(spi_setscreensaverrunning,真的,boldstate,0);
MS的人认为这种方法是业余的,所以它被修改在Windows NT / 2000 / xp.in这些较新版本的Windows用户使用winlogon和ginamdash;mdash图形;识别和认证,认证的图形的意义,很可怕的是不是真的。程序是Windows系统的一部分。它的交互式登录提供了支持,而吉娜是一个程序实施认证dllmdash;mdash;DLL msgina.dll.wlxinitialize,wlxactivateusershell当然是输出,,我不知道,等。前者完成自身的初始化,和后者激活用户的壳。Windows使用这个DLL的authenatate用户名+密码,但开发者可以在自己的吉娜替换msgina.dll。例如,认证机制,如智能卡、视网膜扫描仪,DNA检查,等等来代替输入的用户名+密码识别。下表列出了所有的功能,都与吉娜其中之一。是wlxloggedonsas,当按Ctrl + Alt + Del键是P表示,程序调用的函数。
(表1)吉娜函数列表函数的描述
wlxactivateusershell激活用户外壳
wlxdisplaylockednotice允许吉娜DLL显示锁定信息
wlxdisplaysasnotice当没有用户登陆时调用该函数,Winlogon
wlxdisplaystatusmessagewinlogon调用此函数与状态信息显示
wlxgetconsoleswitchcredentials Winlogon调用此函数读取当前登录用户的信任信息透明地传送给目标会议
WlxGetStatusMessage Winlogon调用这个函数来获取当前状态信息
吉娜wlxinitialize初始化DLL指定窗口的位置
正常的wlxislockok验证工作站锁定
wlxislogoffok验证是正常的
的wlxloggedonsas用户已经登陆和工作站没有锁定,如果SAS事件是在这个时候收到,程序调用这个函数
wlxloggedoutsas不订阅用户,如果SAS事件是在这个时候收到,程序调用这个函数
wlxlogoff通知吉娜DLL时,请求注销操作
wlxnegotiate指示当前程序版本可以使用吉娜DLL
wlxnetworkproviderload调用这个函数加载网络服务提供商收集身份认证信息后。
WlxRemoveStatusMessage Winlogon调用这个函数来告诉吉娜DLL停止显示状态信息
wlxscreensavernotify允许吉娜屏幕保护操作互动
Winlogon中调用这个函数之前,wlxshutdown关闭,让吉娜实施任何封闭的任务,如退出智能卡从读卡器
wlxstartapplication调用这个函数,当系统需要在用户的上下文中的应用
wlxwkstalockedsas当工作站被锁定,如果收到一个SAS,Winlogon调用这个函数
默认情况下,吉娜显示登录对话框,用户输入用户名和密码。所以如果我们想阻止Ctrl+Alt+Del,我们可以写一个新的mygina.dll,它提供的接口调用的函数wlxloggedonsas msgina.dll,从而达到按Ctrl + Alt + Del或写屏蔽。一个键盘驱动程序的实现。
这是真的,屏蔽Ctrl+Alt+Del是真的如上面提到的麻烦,有没有更好的办法来确定答案。所以忘了吉娜,开始使用操作系统完全可以解决这一问题的策略,方法是进入开始菜单中,选择跑在左窗格中查看用户配置管理模板系统| | |登录/登出,在右窗格中的策略是不难找到禁用任务管理器A.
组策略编辑器
通过设置此策略可以屏蔽Ctrl + Alt。如果要编写代码来完成此操作,则必须操作以下注册表键:
HKCU
软件
微软
Windows
currentversion
政策
系统 disabletaskmgr = DWORD值:1
设置完后,在Windows XP中,如果用户按Ctrl + Alt,它会弹出一个错误对话框,
注意这里假设是在控制面板的用户帐户,管理,选择登录和注销选项,设置使用欢迎屏幕,一个项目。
否则,XP将使用Windows的传统登录模式,并要求用户输入帐户名,而与传统行为相同的是。在注册表中的设置,只是disabletaskmgr屏蔽或固定的任务管理器按钮登录/注销对话框。可能有人会问,关于任务管理器的文件不清晰。你怎么知道disabletaskmgr用于禁用任务管理器让我告诉你,我发现当我用gpedit.gpedit是一个非常有用的工具,不仅可以用来编辑政策,但要用它来寻找策略。使用这个工具,你可以很容易地控制Windows的很多东西,从访问权限是否使用IE传统的外观,从是否在对话框或是否启动任务管理器Ctrl + Alt + del.in字显示的地方吧,它可以配置界面行为数百,所以它是一个工具,可以让系统管理员下降三英尺。一旦你找到了一个战略兴趣,有两种方法,知道了如何了解注册表的相应位置。首先是一个更粗鲁的方式:之前和之后策略被修改,注册表被导出到一个注册表文件,然后它们之间的区别是什么所有的策略都不超过四个注册表项:
指定用户
hkey_current_user 软件政策
hkey_current_user 软件微软 Windows currentversion 政策
指定的机器
hkey_local_machine 软件政策
hkey_local_machine 软件微软 Windows currentversion 政策
第二种方法是破坏信息的来源检查战略管理模板文件的描述(Adm)。以下是disabletaskmgr描述从system.adm文件Windows XP。(Windows 2000,描述略有不同。详情请参阅Windows 2000的资源开发工具包。
类别!cadoptions!
#如果版> = 4
解释!cadoptions_help!
# endif
控制台软件微软 Windows currentversion 政策系统
政策!disabletaskmgr!
#如果版> = 4
支持!supported_win2k!
# endif
解释!disabletaskmgr_help!
键名disabletaskmgr
最终的政策
;
更多的Ctrl + Alt + del在这里的政策…
;
结束类;Ctrl + + + del选项
hellip;hellip;
hellip;hellip;
disabletaskmgr_help = 防止用户启动任务管理器(任务管理器.exe)中。如果设置启用,用户尝试启动任务管理器,系统
将显示该消息,并说明策略禁止操作。任务管理器允许用户启动或终止程序,监视计算机性能,查看和监视计算机上的所有运行。
程序中的程序(包括系统服务)、搜索程序的执行文件名以及更改程序运行的优先级。
disabletaskmgr =删除任务管理器
以上是disabletaskmgr描述
它是描述中指定的注册表键名键名和键值对。用这种方法,你可以创建你的应用程序管理模板和政策,但编辑在编辑和浏览。ADM模板文件必须支持Unicode字符。如记事本或写字板等。此外,使用管理模板文件,系统管理员可以使用它来配置策略研究,为整个组织mdash;由此,我们可以看到,这个文件在系统中起着重要的作用。请参考平台SDK的模板管理文件格式的细节。强调最后一点是,disabletaskmgr只是禁用Ctrl+Alt+Del功能。让我们讨论如何捕捉关键序列。为了拦截Ctrl + Alt + Del键,有三种可供选择的方法:
1,写一个吉娜剂;介绍了这种方法,在以后的文章。事实上,ac952_z_cn的个人专栏:如何屏蔽Ctrl + Alt + del在Windows NT或2000;这是该方法的使用。
2。编写键盘驱动程序;示例程序所使用的方法。
3、不是任务管理器程序,以上使用你自己的程序。
请参考本文的示例代码,通过屏蔽实现的具体细节。
让我们解决屏蔽任务切换密钥序列的问题。这些关键序列包括ALT + TAB键、Ctrl + Esc键、Alt + Esc,vk_lwin / vk_rwin和任务栏窗口。早在3.1年,解决这个问题是通过wm_syskeydown.in Windows 9x时期达到的方式,本文对该问题的处理,在使用Windows NT 4时代spi_setscreensaverrunning.but(3 +),Windows 2000和Windows XP中,有不同的方式来处理这个问题。我们必须写一个低级键盘驱动挂钩。别害怕,因为它不是实现这个钩子很难。这篇文章将告诉你如何实现这个键盘钩子。一般来说,系统级钩必须DLL。以下是源代码片段(taskkeyhook .dll)一个这篇文章提供了键盘钩子:DLL:
头文件
对
/ / taskkeyhook。H
#定义dllimport __declspec(dllimport)
disabletaskkeys DllImport布尔(bool benable,布尔bbeep);
aretaskkeysdisabled DllImport bool();
实现文件
对
/ / taskkeyhook.cpp
#定义_win32_winnt 0x0500 / /该
#包括核心和标准件 / / MFC
#定义为dllexport __declspec(dllexport)
中
应用程序(DLL)对象
类:公共ctaskkeyhookdll CWinApp {
公共:
CTaskKeyHookDll(){ }
~ CTaskKeyHookDll(){ }
} MyDll;
与之相关的是:
下面的代码这个DLL的这个部分是在所有实例中共享的
必须是低电平键盘钩子挂钩系统。
#语用data_seg(。该)
hhook g_hhookkbdll = null; / /钩柄
布尔g_bbeep = false; / /按钮哔哔违法
#语用data_seg()
#语用评论(连接器/部分。MYDATA,RWS) / /告诉链接器:建立共享数据段
中
低级键盘钩子
关键:任务切换拦截/传输直接返回
LRESULT CALLBACK MyTaskKeyHookLL(int nCode,wParam WP,lParam LP)
{
该* PKH =(该*)LP;
如果(code = = hc_action){
布尔bctrlkeydown =
GetAsyncKeyState(vk_control)>(sizeof(短)* 8)- 1);
如果(PKH -> vkcode = = vk_escape(bctrlkeydown)| | / / Ctrl + Esc
制表符
(PKH -> vkcode = = vk_tab PKH >旗llkhf_altdown)| |
(PKH -> vkcode = = vk_escape PKH >旗llkhf_altdown)| |
(PKH -> vkcode = = vk_lwin PKH -> vkcode = = vk_rwin){ / / | |)开始菜单
如果(g_bbeep(WP = = wm_syskeydown | | WP = = wm_keydown))
MessageBeep(0); / /蜂鸣器
返回1; / / CallNextHookEx方法不转让,直接回
}
}
返回CallNextHookEx(g_hhookkbdll,nCode,WP,LP);
}
与之相关的是:
是否关键序列 / /屏蔽-任务;mdash;也就是说安装键盘钩子
注意:假设没有其他的钩子来做同样的事情。
aretaskkeysdisabled dllexport bool()
{
返回g_hhookkbdll!= null;
}
与之相关的是:
主要任务:安装/屏蔽低级键盘。
返回当前是否屏蔽标志(true false)
/ /
disabletaskkeys dllexport bool(bool bdisable,布尔bbeep)
{
如果(bdisable){
如果(!g_hhookkbdll){
g_hhookkbdll = SetWindowsHookEx(wh_keyboard_ll,
mytaskkeyhookll,mydll.m_hinstance,0);
}
} else if(g_hhookkbdll!= NULL){
UnhookWindowsHookEx(g_hhookkbdll);
g_hhookkbdll = null;
}
g_bbeep = bbeep;
返回aretaskkeysdisabled();
}
taskkeyhook输出两个功能:disabletaskkeys和aretaskkeysdisabled。前者安装wh_keyboard_ll钩;后者决定是否安装了钩。对付这种键盘钩子的方式拦截ALT + TAB键,按Ctrl + Alt + Esc,ESC和Windows键vk_lwin / vk_rwin。这两个键将稍后介绍。当钩触动这些键,它直接返回给调用者,而不是经过加工的方法CallNextHookEx。
LRESULT CALLBACK MyTaskKeyHookLL(…)
{
如果(* *键任务)
返回1;立即返回
返回CallNextHookEx(…);
}
大多数的taskkeyhook的实现是简单的。只有一个地方用了一个小窍门:用#语用data_seg名称包含整个数据的数据段,并使用#语用评论(链接…)告诉链接器使数据段的共享段。请参考源代码为细节。示例程序(trapkeys .exe),本文汇集了关于屏蔽键盘按键的功能。除此之外,它还有另一个禁用任务栏的功能。由于禁用了任务转换键,所以任务栏也必须是禁用的,否则禁用任务转换键是没有意义的:
HWND hWnd = FindWindow(shell_traywnd,null); / /查找任务栏
EnableWindow(HWND,false); / /禁用任务栏
图四是运行屏幕的示例程序:
图四trapkeys程序运行画面
以下是该trapkeys程序实现代码:
与之相关的是:
/ / trapkeys.cpp
/ /
#包括stdafx.h。H
#包括资源的。
#包括statlink。H
#包括taskkeymgr。H
中
主对话框
cmydialog:公共类CDialog {
公共:
cmydialog(CWnd *本= null):CDialog(idd_mydialog,本){ }
受保护的:
该m_hicon;
cstaticlink m_wndlink1;
cstaticlink m_wndlink2;
cstaticlink m_wndlink3;
virtual BOOL OnInitDialog();
用户界面命令更新处理
afx_msg无效ondisabletaskmgr();
afx_msg无效ondisabletaskkeys();
afx_msg无效ondisabletaskbar();
afx_msg无效onupdatedisabletaskmgr(CCmdUI * pcmdui);
afx_msg无效onupdatedisabletaskkeys(CCmdUI * pcmdui);
afx_msg无效onupdatedisabletaskbar(CCmdUI * pcmdui);
afx_msg一些onkickidle(wParam,LPARAM);
declare_message_map()
};
对
MFC对话框应用程序代码标准。
类:公共cmyapp CWinApp {
公共:
Virtual BOOL InitInstance(){
应用程序:初始化运行对话框
cmydialog DLG;
m_pmainwnd = DLG;
Dlg.DoModal();
返回false;
}
Virtual int ExitInstance(){
为了根据整个方面,什么时候退出程序,所有的残疾人恢复项目
CTaskKeyMgr::禁用(ctaskkeymgr::所有的假);
返回0;
}
}程序;
begin_message_map(cmydialog,CDialog)
on_command(idc_disable_taskkeys,OnDisableTaskKeys)
on_command(idc_disable_taskbar,OnDisableTaskbar)
on_command(idc_disable_taskmgr,OnDisableTaskMgr)
on_update_command_ui(idc_disable_taskkeys,OnUpdateDisableTaskKeys)
on_update_command_ui(idc_disable_taskbar,OnUpdateDisableTaskbar)
on_update_command_ui(idc_disable_taskmgr,OnUpdateDisableTaskMgr)
on_message(wm_kickidle,OnKickIdle)
end_message_map()
与之相关的是:
初始化对话框子类:超链接句柄加载图标
布尔cmydialog::OnInitDialog()
{
CDialog::OnInitDialog();
初始化超链接
m_wndlink1.subclassdlgitem(idc_email,这个);
m_wndlink2.subclassdlgitem(idc_vckbaseurl,这个);
m_wndlink3.subclassdlgitem(idc_vckbaselink,这个);
/ /自己设置对话框icon.mfc不设置对话框的应用
m_hicon = afxgetapp()-> LoadIcon(idr_mainframe);
操作SetIcon(m_hicon,true); / /电话图标
操作SetIcon(m_hicon,false); / /小图标
返回true;
}
对
命令:更新处理应该很容易编写这些东西。
无效cmydialog::OnDisableTaskKeys()
{
CTaskKeyMgr::::taskkeys禁用(ctaskkeymgr,
!CTaskKeyMgr::aretaskkeysdisabled(),true); / /蜂鸣器
}
无效::OnUpdateDisableTaskKeys(cmydialog CCmdUI * pcmdui)
{
pcmdui -> setcheck(ctaskkeymgr aretaskkeysdisabled(::));
}
无效cmydialog::OnDisableTaskbar()
{
CTaskKeyMgr::::(ctaskkeymgr禁用任务栏,
CTaskKeyMgr::istaskbardisabled());
}
无效::OnUpdateDisableTaskbar(cmydialog CCmdUI * pcmdui)
{
pcmdui -> setcheck(ctaskkeymgr istaskbardisabled(::));
}
无效cmydialog::OnDisableTaskMgr()
{
CTaskKeyMgr::::(ctaskkeymgr禁用任务管理器,
CTaskKeyMgr::istaskmgrdisabled());
}
无效::OnUpdateDisableTaskMgr(cmydialog CCmdUI * pcmdui)
{
pcmdui -> setcheck(ctaskkeymgr istaskmgrdisabled(::));
}
对
/ /为了on_update_command_ui正常工作,这是必要的。
/ /
一些cmydialog::OnKickIdle(wParam WP,lParam lCount)
{
UpdateDialogControls(这是真的);
返回0;
}
根据上面的方法,虽然禁用的任务栏已禁用,但仍然有一个尚未处理的器官。这是按Windows键还玩开始菜单,并很清楚,任务栏不检查它是否是直到vk_lwin处理功能。一般来说,如果一个窗口被屏蔽,它将不再办理本窗口——用户输入;mdash,即禁用。这个目标达到之后自然是叫EnableWindow(假),但代码处理vk_lwin / vk_rwin关键不会检查任务栏启用/禁用状态。在这方面,本文的方法仍然是使用键盘钩子。修改taskkeyhook实现增加Windows键捕获。因此按开始菜单键后会发生什么,我希望你不要错过其他按钮。如果任何读者发现钥匙不见了,请让它可以添加到键盘钩子联系我。为了简单起见,我将所有的残疾功能的类ctaskkeymgr。以下是这类攻击的实现文件的定义:
taskkeymgr
中的
/ / taskkeymgr。H
#编译一次
#包括taskkeyhook。H
中有:
使用这种键/禁用任务、任务管理器或任务栏。
与相应的标志 / /电话:ctaskmgrkeys:禁用:禁用(ctaskmgrkeys::所有);
类ctaskkeymgr {
公共:
enum {
taskmgr = 0x01 /禁用任务管理器(按Ctrl + Alt + Del)
taskkeys = 0x02 /禁用任务转换键(alt标签,等等)
任务栏= 0x04 /禁用任务栏
所有0xffff / / =禁用所有的事情我
};
static void禁用(DWORD dwitem,布尔bdisable,布尔bbeep = false);
静态布尔istaskmgrdisabled();
静态布尔istaskbardisabled();
静态布尔aretaskkeysdisabled(){
返回::aretaskkeysdisabled(DLL); / /电话
}
};
cpp实现
对
/ / taskkeymgr.cpp
/ /
#包括stdafx.h。H
#包括taskkeymgr。H
# HKCU hkey_current_user定义
禁用设备注册表项/任务管理策略
LPCTSTR key_disabletaskmgr =
软件 微软 Windows currentversion 政策 系统;
LPCTSTR val_disabletaskmgr =disabletaskmgr ;
中的
键/禁用任务
/ /
/ / dwFlags =禁用什么
/ / bdisable =禁用(真的),或使(假)
/ / bbeep =按违法关键是嗡嗡(关键任务)
无效ctaskkeymgr::禁用(DWORD dwFlags,布尔bdisable,布尔bbeep)
{
任务管理器(Ctrl + Alt + del)
如果(dwFlags taskmgr){
HKEY香港;
如果(HKCU,key_disabletaskmgr(RegOpenKey,HK)!= error_success)
RegCreateKey(HKCU,key_disabletaskmgr,HK);
如果(bdisable){ / /禁用任务管理器(禁用TM):制定政策= 1
DWORD值= 1;
RegSetValueEx(香港,val_disabletaskmgr,空,
REG_DWORD, (BYTE*) Val, sizeof (VAL));
}其他启用的任务管理器(启用TM)
regdeletevalue(HK,val_disabletaskmgr);
}
}
关键任务(alt选项卡等)
如果(Windows也taskkeys)
::DisableTaskKeys(bdisable,bbeep); / /安装键盘钩子
任务栏
如果(dwFlags任务栏){
HWND hWnd = FindWindow(shell_traywnd
EnableWindow(hWnd,!bdisable);
}
}
布尔ctaskkeymgr::istaskbardisabled()
{
HWND hWnd = FindWindow(shell_traywnd
返回IsWindow(hWnd)!iswindowenabled(hWnd):真的;
}
布尔ctaskkeymgr::istaskmgrdisabled()
{
HKEY香港;
如果(HKCU,key_disabletaskmgr(RegOpenKey,HK)!= error_success)
返回false
DWORD值= 0;
DWORD len = 4;
返回RegQueryValueEx(香港,val_disabletaskmgr,
零,零,(字节*)Val,Len)= = error_success val = = 1;
}
这个类中的函数都是静态的,而事实上ctaskkeymgr完全是一个命名空间,你可以使用它作为您想在自己的程序。例如,禁用任务转换键和任务栏,但不禁用Ctrl+Alt+Del:
CTaskKeyMgr::::taskkeys |禁用(ctaskkeymgr
CTaskKeyMgr::任务栏,真的);
此外,有几个功能,用于检查当前被禁用,甚至声响时,用户按下禁用键,hellip;hellip;保罗自己享受的源代码。