天下网吧 >> 网吧天地 >> 网吧技术 >> 网吧软件 >> 正文

巧妙获得系统权限 制作超级屏幕锁

2006-9-22chinaok蒲应文
    摘要:微软的Windows系统从98到2000实现了核的变化,在NT结构的内核操作系统中,要实现系统热键的屏蔽,不是简单的使用几个API函数就能完成的,而必须使用钩子函数。对于“CTRL+ALT+DEL”这个特殊的热键,必须先获取系统权限后才能有效的实现消息的处理。本文通过获取系统权限,使用钩子函数实现了任意键及组合键的屏蔽,具有Win2000中“锁定计算机”的功能。
  
【编程分析】
   
一、钩子概述

   
    钩子的本质是一段用来处理系统消息的程序,通过系统调用,把它挂入系统。钩子的种类有很多,每种钩子可以截获并处理相应的消息。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,即钩子函数先得到控制权。这时钩子函数就可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。对每种类型的钩子由系统来维护一个钩子链,最近挂入的钩子放在链的开始,而最先挂入的钩子放在最后,也就是后加入的先获得控制权。
   
    要实现Win32的系统钩子,必须调用API函数SetWindowsHookEx来安装这个钩子函数,这个函数的原型是:SetWindowsHookEx(idHook,lpfn,hMod,dwThreadId);其中,第一个参数是钩子的类型;第二个参数是钩子函数的地址;第三个参数是包含钩子函数的模块句柄;第四个参数指定监视的线程。如果指定确定的线程,即为线程专用钩子;如果指定为空,即为全局钩子,全局钩子函数必须包含在DLL(动态链接库)中,而线程专用钩子还可以包含在可执行文件中。得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个API函数CallNextHookEx来传递它。钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的传递。
   
二、Win、Tab、Esc等键的屏蔽
   
    NT结构的系统在安全性上做了特殊的处理,要实现对键盘的封锁,必须使用钩子函数,下面的程序中定义了一个钩子回调函数,可实现消息的处理。首先要定义一个Hook类型和Record类型,在钩子回调函数中,根据消息的类型实现对某些键的屏蔽,编程方法和核心代码如下:
  
1、变量定义

   const
   WH_KEYBOARD_LL=13;//自定义HOOK类型
   type
    KbHookStru=record
    vkCode:DWORD;//虚拟键码
   ……
  
2、钩子回调函数

   Function KeyboardHookProc(nCode:Integer;WParam:WPARAM;LParam:LPARAM):LRESULT;stdcall;
   //nCode参数是Hook的标志,一般只关心小于0时,WParam参数表示消息的类型,即消息要传递给的窗口句柄
   ……
    if nCode=HC_ACTION then
    begin
    result:= 0;
    //直接屏蔽F4键和ESC键
    if hkStruct.vkCode=VK_F4 then result:=1;
    if hkStruct.vkCode=VK_ESCAPE then result:=1;
    //根据消息类型屏蔽指定键
   ……

3、锁定WIN等热键

   Function EnableKeyboardHook:Boolean;stdcall;export;
   begin
    //无钩子则设置钩子
    if hHk = 0 then
    Begin
    //第三个参数为当前实例的ID
    hHk:=SetWindowsHookEx(WH_KEYBOARD_LL,@KeyboardHookProc,hInstance,0);
    Result:=True;
    end else
    Result:=False;
   end;
   
三、CTRL+ALT+DEL的屏幕
   
    上面通过钩子函数实现了任意键的屏蔽,但是用上面的方法屏蔽CTRL、ALT、DEL三个键后“CTRL+ALT+DEL”组合键仍然有效,这是NT系统在安全管理中的特殊性,可以说,NT系统将“CTRL+ALT+DEL”组合键视为一个特殊键,专门用来进入“任务管理器”。NT系统在登录时,是通过WinLogon.exe程序(系统登录管理器)实现的,它用于处理系统的登录和登录过程,在用户按下“CTRL+ALT+DEL”时就能激活该程序。
   
    要屏蔽“CTRL+ALT+DEL”组合键,必须让程序进入系统进程,这样才能实现对“CTRL+ALT+DEL”组合键的控制。本文把完成“CTRL+ALT+DEL”组合键屏蔽的钩子功能通过一个动态库实现,在程序运行阶段,把动态库临时登录到WinLogon.exe进程中,当程序运行结束时,再把登录的进程注销,从而实现消息的拦截。

1、创建动态库文件
   
    为了让程序在运行时不会因动态库的丢失而出现错误,本文把动态库的数据通过16进制编辑软件提取出来,存放在程序的数组中,在程序运行时,临时创建动态库,并登录到系统,当程序退出时候,注销登录,并删除动态库文件。动态库的部分数据如图1,创建动态库的方法如下:首先用CreateFile函数创建DLL文件,然后用WriteFile函数将动态库的数据写入到DLL文件。

图1 部分16进制数据

  

本文来源:chinaok 作者:蒲应文

声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。文章是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢。 Email:support@txwb.com,系统开号,技术支持,服务联系微信:_WX_1_本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧·网吧天下
  • 本周热门
  • 本月热门
  • 阅读排行