5-8万年薪顶级嵌入式,京沪深就业地 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  硬件/系统

在NT/2000中怎么禁用Ctrl+Alt+Delete?(不能用gina,键盘驱动)

楼主jiangsheng(蒋晟.Net[MVP])2002-10-21 19:12:54 在 VC/MFC / 硬件/系统 提问

远程控制软件需要不重新启动而动态禁用/启用Ctrl+Alt+Delete 问题点数:300、回复次数:164Top

1 楼slwqw(四大名捕之追杀令)回复于 2002-10-21 19:33:26 得分 300

目前最流行的做法就是动态Hook   GINA里边的函数WlxLoggedOnSAS,然后返回WLX_SAS_ACTION_NONE以达到目的,如果不能使用GINA,不知道还能有什么妙法!  
   
  关注!Top

2 楼nevergrief(孤独骑士)回复于 2002-10-21 19:35:24 得分 0

好吓人的问题,居然还不能用gina,建议你还是想办法去要微软的内部资料吧。否则,实在太难了。  
   
  帮你UpTop

3 楼nevergrief(孤独骑士)回复于 2002-10-21 19:38:12 得分 0

哈哈哈,拔掉键盘行不行??没用使用gina,键盘驱动。  
   
  想个办法,禁用键盘的那个PS口(好像是这个名称),行不行??Top

4 楼slwqw(四大名捕之追杀令)回复于 2002-10-21 19:41:36 得分 0

还有,能不能说一下你的目的,是不是为了防止别人关闭你的程序?如果是这样,那就算屏蔽Ctrl   +   Alt   +   Del也没有用!使用任何一个进程管理器都可以关闭你的程序!并非一定要使用2000里边的进程管理器!  
   
  目前在2000下面防止程序被别人关闭的方法似乎就只有两种:  
   
  1、Hook   NtQuerySystemInformatoin。  
  2、使用远程注入技术把程序挂接到别的进程。  
   
  不过实现起来都比较麻烦。Top

5 楼suplxun(大刘)回复于 2002-10-21 20:53:12 得分 0

为什么不考虑屏蔽Ctrl   +   Alt   +   Del键(可以只屏蔽其中一个键)Top

6 楼zhuwenzheng(卧薪尝胆)回复于 2002-10-22 10:49:52 得分 0

旁听Top

7 楼slwqw(四大名捕之追杀令)回复于 2002-10-22 12:10:03 得分 0

贴主怎么不露面了?:)Top

8 楼mostneed(黙黙)回复于 2002-10-22 12:14:05 得分 0

此类问题实在是太多,查查以前的帖子吧。Top

9 楼JennyVenus()回复于 2002-10-22 12:16:17 得分 0

把键盘的驱动改了Top

10 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-10-22 12:27:26 得分 0

不使用gina的原因是其他应用程序可能也替换gina(甚至微软自己的补丁也会),而且可能和未来版本的系统补丁有兼容性问题  
  参见MSDN知识库  
  Q195027   STOP   0xC000021A   in   Winlogon   Caused   by   PCAnywhere    
  Q229033   Programs   That   Replace   Msgina.dll   May   Cause   "STOP   0x0000001E"   Error   Message    
  Q192298   Third   Party   GINAs   May   Fail   with   Service   Pack   4   Causing   STOP   0x21A   in   WINLOGON    
  Q164486   Winlogon   May   Fail   if   the   Third-Party   Gina.dll   File   is   Missing   or   Corrupted    
  Q180854   Access   Violation   in   Winlogon   with   Third-Party   Gina.dll    
   
  组策略中的HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System   \DisableTaskMgr策略在2000下似乎不能动态启用/禁用  
   
  to   nevergrief   :注意我不是要禁用键盘,是要动态禁用/启用Ctrl+Alt+Delete组合键,其他的键可能可以使用(视设置而定)  
   
  to   BCB_FANS:我要防止用户使用任务管理器。当然我的程序也不能被关闭,谢谢你的信息  
  to   suplxun:系统组合键输入的时候不会发送键盘消息。Top

11 楼panch(江湖小子)回复于 2002-10-22 12:32:49 得分 0

用HOOK不就完了Top

12 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-10-22 12:33:21 得分 0

to   jennyvenus:请看标题是什么Top

13 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-10-22 12:33:55 得分 0

to   panch:这个组合键不能被HOOKTop

14 楼nevergrief(孤独骑士)回复于 2002-10-22 13:29:24 得分 0

to   jiangsheng(蒋晟.Net)   大哥  
  前面都是我在看玩笑。也怪你自己没有说清楚前因后果,其实这个问题早就有人搞定了呀!(因为屏蔽三键很难,而防止用户使用任务管理器又是另外一回事)  
  http://www.vckbase.com/code/listcode.asp?mclsid=13&sclsid=1309  
   
  我都试过了,没有问题,动态控制防止用户使用任务管理器。并且你右键点击底下任务栏,那个任务管理器的菜单都是灰的。  
   
  应该说搞定没有问题了吧!!!Top

15 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-10-22 13:56:01 得分 0

这个代码早就看过了,参见MSDN杂志,2002年第9期   C++   Q&A  
  http://msdn.microsoft.com/msdnmag/issues/02/09/CQA/default.aspx  
  在我的2000上不能正常工作Top

16 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-10-22 13:57:03 得分 0

这个代码早就看过了,在我的2000上不能禁用任务管理器。  
  参见MSDN杂志,2002年第9期   C++   Q&A  
  http://msdn.microsoft.com/msdnmag/issues/02/09/CQA/default.aspx  
  Top

17 楼slwqw(四大名捕之追杀令)回复于 2002-10-22 13:57:57 得分 0

To   :   nevergrief(孤独骑士)    
   
  嘿嘿,你试一试Ctrl   +   Shift   +   Esc组合键,看看什么出来了?这个组合键的级别估计跟Ctrl   +   Alt   +   Del一样高,可能使用xx_LL低级沟子也沟不住(因为没有编写过,不知道是否能沟得住)。Top

18 楼slwqw(四大名捕之追杀令)回复于 2002-10-22 14:32:19 得分 0

搞定!!!既不编写GINA也不编写DRIVER。  
   
  详细讨论看这个帖子。  
   
  http://www.driverdevelop.com/forum/html_22833.html?1035268121Top

19 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-10-22 15:36:52 得分 0

好像是用类似病毒的方法……会不会被杀毒软件杀掉?Top

20 楼slwqw(四大名捕之追杀令)回复于 2002-10-22 16:20:15 得分 0

老大啊,我上面已经说过了,我这种方法只能禁止用户使用Ctrl   +   Alt   +   Del和Ctrl   +   Shift   +   Esc组合键。  
   
  如果用户想真正关闭你的程序,他可以使用别的进程管理器来关闭。所以要想被关闭看来只好Hook   NTDDLL.DLL里边的NtQuerySystemInformation了,虽然远程注入技术也很热门,不过我看了大多数的例子,好象都只是执行一小段代码,真正把一个巨大的EXE注入没有见过。  
   
  关于API   Hook,网上资料就更多了,MS的Detours库有全部的源代码。Top

21 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-10-22 16:52:41 得分 0

NtQuerySystemInformation好像是未公开的API?  
  先Hook了再说  
  Top

22 楼slwqw(四大名捕之追杀令)回复于 2002-10-22 17:09:30 得分 0

理论倒是知道了,但是真正实现就比较麻烦了,最近又太忙,郁闷ing...,我尽可能快点搞定吧!请耐心等待...Top

23 楼xuefl66(xuefl66)回复于 2002-10-22 22:27:08 得分 0

关注中。。。Top

24 楼nevergrief(孤独骑士)回复于 2002-10-23 10:01:22 得分 0

嘿嘿,老大,毛主席说的:没有调查就没有发言权!  
  您想禁止Ctrl+Alt+Del三键的目的不就是为了禁止任务管理器吗?  
  所以只要能禁止任务管理器,不禁止三键又有什么关系?  
  老大,拜托你好好试试,可以吗?  
  我说的那个没有问题,连那个Ctrl   +   Shift   +   Esc一起禁止了。  
  也就是说,以下完全符合你的要求!!!  
  你再不动手试试,我要生气了!!!!!!!  
  真不知是你着急还是我着急。  
  http://www.vckbase.com/code/listcode.asp?mclsid=13&sclsid=1309  
   
  另外,Ctrl   +   Shift   +   Esc没甚么,xx_ll一样能勾住,不信你自己试试。  
  我源代码都写好了。请下载:  
  ftp://pub:pub@211.157.101.157/Hook和hotKey.rar  
  ftp://pub:pub@211.157.101.157/Hook和hotKey源码.rar  
   
  另外,我的环境是win2k   pro,   vs6Top

25 楼nevergrief(孤独骑士)回复于 2002-10-23 10:06:37 得分 0

To   :   BCB_FANS(四大名捕之追杀令)    
   
  >>嘿嘿,你试一试Ctrl   +   Shift   +   Esc组合键,看看什么出来了?这个组合键的级别估计跟Ctrl   +   Alt   +   Del一样高,可能使用xx_LL低级沟子也沟不住(因为没有编写过,不知道是否能沟得住)。  
   
  嘿嘿,你这几句话里,充满了"估计","可能","没编过","不知道","试一试"  
  也不知到底是谁应该"试一试"???  
  Top

26 楼nevergrief(孤独骑士)回复于 2002-10-23 10:15:37 得分 0

to   jiangsheng(蒋晟.Net)    
   
  老大,我想不通为什么你的机子上不能禁用任务管理器???  
  我这里真的没有什么问题。  
  你下载试试吧(编译好的可执行文件),拜托了!!!  
  简直看着我都着急。  
   
  ftp://pub:pub@211.157.101.157/1.rarTop

27 楼slwqw(四大名捕之追杀令)回复于 2002-10-23 11:28:08 得分 0

1、http://www.vckbase.com/code/listcode.asp?mclsid=13&sclsid=1309  
   
        拜托,老兄,看清楚一点,人家说的是“Windows   XP”。“此代码示范在Windows   XP中如何实现屏蔽CTRL+ALT+DEL组合键序列...”。不要以为2000跟XP是一个样的!!!  
   
  2、ftp://pub:pub@211.157.101.157/Hook和hotKey.rar  
        ftp://pub:pub@211.157.101.157/Hook和hotKey源码.rar        
         
        是能沟住了,但是是采用替换GINA的方法实现的,”GinaDLL   ->   NoReboot.DLL”。楼主已经事先声明了,不能使用GINA,老兄没有看到吗?????????  
         
  3、ftp://pub:pub@211.157.101.157/1.rar  
         
        是不是就是这个程序http://www.vckbase.com/code/listcode.asp?mclsid=13&sclsid=1309的EXE文件?任务管理器倒是不能使用了,不过是通过修改注册实现的,而不是通过程序实现的!!!  
         
        Regmon.log  
        ....  
        TrapKeys.exe:292 SetValue HKCU\...\Policies\System\DisableTaskMgr SUCCESS 0x1  
        TrapKeys.exe:292 DeleteValueKey HKCU\...\Policies\System\DisableTaskMgr SUCCESS  
        ......  
   
  =======================  
   
  不过我倒是希望你看一下我的方案,怎样在2000下面真正屏蔽Ctrl   +   Alt   +   Del(如果愿意,也可以屏蔽Ctrl   +   Shift   +   Del)        
  http://www.driverdevelop.com/forum/html_22833.html?1035268121  
   
  =======================  
   
  我的平台:在Windows   2000   Professional中文版   +   SP3中文版  
  Top

28 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-10-23 11:50:13 得分 0

to   BCB_FANS(四大名捕之追杀令)    
  你的程序也不能锁掉Ctrl+Alt+Delete?我试了好几台计算机都不行  
  都是中文Win2KProSp3Top

29 楼slwqw(四大名捕之追杀令)回复于 2002-10-23 14:17:42 得分 0

1、有没有把RemoteDll.Dll拷贝到\Winnt\System32目录下面?  
   
  2、如果真的不行,请楼主自己监视输出文件  
   
  //SAS窗口的窗口过程  
  LRESULT   CALLBACK   SASWindowProc(HWND   hwnd,UINT   uMsg,WPARAM   wParam,LPARAM   lParam)  
  {  
      //请把这些消息输出到文件中,看看按Ctrl   +   Alt   +   Del时触发什么消息  
      MsgList->Add("Msg:   Wnd   =   "   +   IntToHex((int)hwnd,8)   +   "   Msg   =   "   +   IntToHex((int)uMsg,8));  
   
      //屏蔽Ctrl   +   Alt   +   Del  
      .........    
   
      return   CallWindowProc(FOldProc,hwnd,uMsg,wParam,lParam);  
  }  
  //---------------------------------------------------------------------------  
  ===================  
   
  有几位朋友跟我要了那份代码,他们都没有向我反映不能Hook的情况。  
  Top

30 楼nevergrief(孤独骑士)回复于 2002-10-23 15:02:09 得分 0

to   BCB_FANS(四大名捕之追杀令)    
  1、http://www.vckbase.com/document/viewdoc.asp?id=424  
  xp与2000当然有区别,但是这个程序在我的两台机子都没有问题!!!!  
  而且两个机子一个装了2kpro,一个是server,都没有问题。  
   
  2、ftp://pub:pub@211.157.101.157/Hook和hotKey.rar  
        ftp://pub:pub@211.157.101.157/Hook和hotKey源码.rar        
  我虽然用了Gina,但是屏蔽Ctrl   +   Shift   +   Esc组合键,并不需要Gina,不信你把源代码里的  
  HANDLE   hMutex   =   CreateMutex(NULL,   FALSE,   "_ac952_z_cn_CTRL_ALT_DEL");  
  屏蔽掉试试,我已经试了。  
  确实不需要Gina,就可以屏蔽但是屏蔽Ctrl   +   Shift   +   Esc组合键!!!!  
  (但是按ctrl_alt_del后,依然可以使用任务管理器功能)  
  你没有仔细看源码,也不能怪你!  
   
  3、ftp://pub:pub@211.157.101.157/1.rar  
  是不是通过注册表我倒没注意,因为我没看源码。  
  不过我觉得,只要能解决问题,为什么不让用注册表????  
   
   
  争来争去,我头都大了,我本来就是个菜鸟。只是刚好几个例子都做过,所以才来说了几句。以前还请教过你们两位呢!  
   
  要么今天晚上约个时间,大家一起试试吧!  
  小弟QQ:76628305  
  MSN:nevergrief@hotmail.com  
  网易泡泡:   nevergrief@163.com   (今天申请的,很好用,还可以免费发短信).http://popo.163.com/  
   
  或者去某个聊天室也行。  
  Top

31 楼slwqw(四大名捕之追杀令)回复于 2002-10-23 15:56:15 得分 0

我们不是争来争去,只是希望找到一种统一的方法而已。  
   
  ==============  
   
  现在我们不必讨论了!!!楼主的主要目的就是为了防止程序被关闭,无论是禁止Ctrl   +   Alt   +   Del还是禁止任务管理器,都无法达到目的,如果用户真正想关闭称许1,他可以找另外一个进程管理器来关闭。  
   
  现在的目的就是Hook掉NtQuerySystemInformation。只要成功了,楼主目的就算是达到了!Top

32 楼nevergrief(孤独骑士)回复于 2002-10-23 16:17:15 得分 0

ftp://pub:pub@211.157.101.157/1.rar  
  不过我觉得,只要能解决问题,为什么不让用注册表????  
   
  唉,想不通想不通想不通想不通想不通!  
  -----------------------------------------  
  那个xx_LL能勾住Ctrl   +   Shift   +   Esc组合键。。。Top

33 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-10-23 16:33:44 得分 0

目的1   程序运行中不允许从外部关闭  
  目的2   某任务执行中不允许从外部关闭、注销和重新启动计算机  
  Top

34 楼nevergrief(孤独骑士)回复于 2002-10-23 18:04:45 得分 0

我已经死心了。Top

35 楼alphapiao(奉旨灌水钦差)回复于 2002-10-24 08:40:56 得分 0

关注,UP中。Top

36 楼mengxihe(濛溪河)回复于 2002-10-24 09:54:14 得分 0

搬个凳子来,好好学习学习~Top

37 楼kingzai(stevenzhu)回复于 2002-10-24 15:22:48 得分 0

第一个问题应该可以用hook   API的方法解决.  
  hook   该进程的OpenProcess,TerminateProcess函数可以使它程序运行中不允许从外部关闭,hook   Api的代码可以参考codeguru   "hijack".我没有试过hook   OpenProcess,但在网上确实看到有人已经做过.  
  Top

38 楼slwqw(四大名捕之追杀令)回复于 2002-10-24 17:48:35 得分 0

1、关于Ctrl   +   Alt   +   Del  
   
  完全可以  
  我在   Win2K   Pro   SP1   SvrSP1   AdvSvr   SP2   三个版本下都试了可以,  
  就是不能   UnHook,   不起作用,我在论坛上已提出问题了!  
  谢谢!  
   
  >   郭征,您好!  
  >    
  >   不好意思,有人反应在2000不能截获Ctrl   +   Alt   +   Del,所以向老兄问一下情况,到底能不能截获?请务必回信,谢谢!  
  >    
  >   BCB_FANS(四大名捕之追杀令)   14:18  
  >    
  >   在   2002-10-23   11:04:00   您写道:  
  >   >谢谢,太感谢了!  
  >   >无名小卒!  
  >   >  
  >   >>   郭征,您好!  
  >   >>    
  >   >>   老兄是哪一位?我怎么没有一点印象:)  
  >   >>    
  >   >>   把RunPkg.Zip里边的RemoteDll.DLL拷贝到\Winnt\System32目录下面,就可以运行了Prject1.exe进行测试了。  
  >   >>    
  >   >>   BCB_FANS(四大名捕之追杀令)   2002-10-22   16:52  
  >   >>    
  >   >>    
  >    
  >                                           致  
  >   礼!  
  >    
  >                           slwqw  
  >                           slwqw@163.com  
  >    
  >    
  >    
  >    
   
  2、关于Hook   NtQuerySystemInformation,使用MS的Detour库已经搞定,可以在所有的进程管理器中隐藏自己,已经发了邮件,注意查收。  
   
  3、某任务执行中不允许从外部关闭、注销和重新启动计算机  
   
  不关闭可以,但是注销、重启吗?除非把2000的任务栏屏蔽了,不然怎么能阻止用户执行操作“开始->关机->注销   Administrator”呢?Top

39 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-10-24 20:55:23 得分 0

任务栏已经搞定了,Hook之后Ctrl+Alt+Delete也可以屏蔽了,但是但是好像UnHook没有起作用  
  明天去法庭,没时间看Hook   NtQuerySystemInformation的了,谢谢你的代码Top

40 楼nevergrief(孤独骑士)回复于 2002-10-25 13:35:56 得分 0

哦,去法庭干什么?Top

41 楼nevergrief(孤独骑士)回复于 2002-10-25 13:36:29 得分 0

还有,老大,问题解决了把答案贴出来啊。Top

42 楼tonnyue(伊然)回复于 2002-10-26 20:58:40 得分 0

关注Top

43 楼kwiner(ak.net)回复于 2002-10-26 21:07:36 得分 0

要想屏蔽任务管理器还不简单  
   
  枚举所有运行中的窗口,发现窗口标题是“Windows   任务管理器"  
   
  就向它发送关闭消息,我编写的相关程序就是采用这种方法Top

44 楼atm2001(松鼠)回复于 2002-10-26 22:17:24 得分 0

用远程线程  
  把Winlogo.exe进程的键盘消息api挂了。。。如果是Ctrl+Alt+Del的消息就不给源函数。。。呵呵。。。Top

45 楼xuefl66(xuefl66)回复于 2002-10-29 08:15:55 得分 0

see  
  see!!!Top

46 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-10-30 09:55:15 得分 0

如何清除注入的代码?Top

47 楼slwqw(四大名捕之追杀令)回复于 2002-10-30 10:13:48 得分 0

根据“郭征”地测试,是程序跟“瑞星”冲突了,导致程序不能正常远程卸载RemoteDLL.Dll,所以Unhook之后Ctrl   +   Alt   +   Del仍然起作用!只是令人感到奇怪地是,我这里也运行了瑞星,但是还是可以正常卸载!所以这个问题无法进行测试.......  
   
  瑞星实时监控会不会是把程序当成“病毒”了?  
   
  楼主能不能自己进行测试一下?Top

48 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-10-30 14:55:23 得分 0

我这里运行的是Norton   Antivirus?  
  Hook   NtQuerySystemInformation已经成功隐藏进程。Top

49 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-10-30 15:11:11 得分 0

启动任务管理器的时候出现内存不能为Read错误?Top

50 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-01 11:34:32 得分 0

Hook   NtQuerySystemInformation已经成功隐藏进程(但是只在我的计算机上成功过一次,在其他计算机上会造成任务管理器崩溃)Top

51 楼wj59(wj59)回复于 2002-11-01 13:37:17 得分 0

UP吧Top

52 楼slwqw(四大名捕之追杀令)回复于 2002-11-02 16:02:56 得分 0

1、我分别使用“瑞星2002增强版”,“瑞星2003”,“金山毒霸2003”,“Norton   AntiVirus   2002”进行了测试,发现还是能正常卸载,我实在想不出哪里有问题。不过我还是做了一个带有调试功能的版本,重新发给你测试一下,看看错误代码是什么!然后再告诉我!  
   
  2、关于Hook   NtQuerySystemInformation。我上一次的版本是使用MS的Detours编写的,它实际上是在目标函数的前5个字节插入JMP指令跳转到自己的函数以得到控制权。关于这种方法的缺点,Jetfrey   Richter在他的书《Windows核心编程》里边已经给出了详细的解释,他同时也给出另外一种方法,就是更改模块的引入函数地址表(IAT)。现在我以他的代码为基础重写了Hook部分,如果还是有问题,那我也没辙了!        
   
  上面的代码都已经通过邮件发出,请注意查收!  
  Top

53 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-02 19:29:37 得分 0

收到了……你改了什么?现在两个都可以用了(虽然不知道为什么两个都可以用了)  
  我回了一封email。Top

54 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-02 19:52:24 得分 0

用新的project1.exe测试旧的dll的时候报告加注卸载线程成功,卸载失败Top

55 楼slwqw(四大名捕之追杀令)回复于 2002-11-02 22:01:05 得分 0

1、关于Ctrl   +   Alt   +   Del,我真看不出新版本跟旧版本有什么不同,我发了新版本源代码给你,你自己看看这两个版本有什么不同。  
   
  2、关于Hook   NtQuerySystemInformatoin,倒是有两个不同:  
   
  (1)旧版本的实现代码跟新版本完全不一样,一个是在函数前面插入JMP指令,一个是更改模块的引入函数地址表。  
   
  (2)旧版本没有在自定义的函数中添加结构化异常处理,但是新版本添加了。  
   
  ============  
   
  新版本Ctrl   +   Alt   +   Del源代码已经发出,注意查收!Top

56 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-02 22:31:50 得分 0

收到,谢谢  
  下周上XP测试一下……Top

57 楼smhpnuaa(天将降大任于斯人也!)回复于 2002-11-04 16:04:35 得分 0

gina挺好的,要想不被替换,可以在gina退出的时候再写一次注册表!  
   
  禁止任务管理器只需要写注册表啊。Top

58 楼kathywp(树欲静而风不止)回复于 2002-11-04 16:26:25 得分 0

大家搞笑呢吧,呵呵!  
  告诉大家一个简单的方法:  
   
  if("ctrl+alt+delete")   return   false;  
   
  不就行了  
   
  忘处理大小写了,嘿嘿!  
   
   
  (注:孤独骑士是对的)Top

59 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-04 18:33:34 得分 0

to   smhpnuaa(天将降大任于斯人也!)   替换系统文件始终是不安全的,理由已经说过了,在这里再说一遍  
  不使用gina的原因是其他应用程序可能也替换gina(甚至微软自己的补丁也会),而且可能和未来版本的系统补丁有兼容性问题  
  to   BCB_FANS(四大名捕之追杀令)    
  可能是VC数据类型和BCB不同,你的代码不能成功移植到VC?Top

60 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-04 18:58:48 得分 0

最后一步建立远程线程时WinLogon出错Top

61 楼slwqw(四大名捕之追杀令)回复于 2002-11-04 19:03:22 得分 0

我来转换!!!Top

62 楼d992901(沉思)回复于 2002-11-04 20:13:09 得分 0

老大们,把源程序也给我一份把,我现在也在作关于ctrl+alt+del的项目,要求按下后弹出对话框,输入密码可用,我想用钩子钩住啊,但是我不会!!给我一份源码把,我好好研究一下。谢谢啦!!  
  我的邮箱   d992901@sina.comTop

63 楼slwqw(四大名捕之追杀令)回复于 2002-11-04 23:26:43 得分 0

转换完了,我也差不多被VC弄疯了!!!95%的时间都花在怎样使用类CString上面:(  
   
  1、建立一个“A   simple   Dll   Project”类型的DLL。  
   
  2、在Dll.Cpp中输入   CString   Str,  
         
  (1)编译错误:  
   
  #include   "stdafx.h"  
   
  Dll.cpp(7)   :   error   C2146:   syntax   error   :   missing   ';'   before   identifier   'Str'  
  Dll.cpp(7)   :   error   C2501:   'CString'   :   missing   storage-class   or   type   specifiers  
  Dll.cpp(7)   :   fatal   error   C1004:   unexpected   end   of   file   found  
   
  (2)改为  
   
  //#include   "stdafx.h"  
  #include   <afx.h>  
   
  继续错:  
   
  atal   error   C1010:   unexpected   end   of   file   while   looking   for   precompiled   header   directive  
  Error   executing   cl.exe.  
   
   
  (3)同时包括  
   
  #include   "stdafx.h"  
  #include   <afx.h>  
   
  还是错:  
   
  afxv_w32.h(14)   :   fatal   error   C1189:   #error   :     WINDOWS.H   already   included.     MFC   apps   must   not   #include   <windows.h>  
  Error   executing   cl.exe.  
   
   
  靠!服了!!!最后不得不使用STL里边的string类,楼主说一说这种错误到底是怎么回事?  
  Top

64 楼slwqw(四大名捕之追杀令)回复于 2002-11-04 23:30:52 得分 0

To   :   d992901(三胖子)    
   
  我的代码只能屏蔽,至于怎样显示自己的对话框,我也不知道!  
   
  不过间接的方法倒是有一个,就是接收到消息时,向主窗口发送消息,然后主窗口再显示对话框!理论上可以,但是不敢肯定一定行得通!Top

65 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-05 17:30:20 得分 0

要使用CString的话,建立DLL的时候选择MFC支持就可以了。#include   <afx.h>不是必要的  
  今天又去法院了,明天开始测试……Top

66 楼slwqw(四大名捕之追杀令)回复于 2002-11-05 23:30:29 得分 0

致命的BUG!!!!!  
   
  原来变量IsHook分别在Hook和Unhook里边设置其值,现在发现这个值必须移到HookFunc和UnhookFunc里边设置,否则程序一跳到自己的GetProcAddresss之后就返回了,达不到目的!  
   
  DLL_EXP_IMP   int   _cdecl   Hook(DWORD   dwSelfProcessID_P)  
  {                                                      
  .......  
      IsHook   =   true;  
  .......  
  }  
  //---------------------------------------------------------------------------  
  DLL_EXP_IMP   int   _cdecl   Unhook()  
  {  
  .......  
      IsHook   =   false;  
  .......  
  }                        
  //---------------------------------------------------------------------------  
   
  移到下面的函数里边设置:  
   
  int   __fastcall   HookFunc()  
  {  
      IsHook   =   true;  
  .....      
  }  
  //---------------------------------------------------------------------------  
  int   __fastcall   UnhookFunc()  
  {  
      IsHook   =   false;  
  ...........      
  }  
  //---------------------------------------------------------------------------  
  Top

67 楼RomanticProgrammer() 兰企鹅||南极俺最帅 ()回复于 2002-11-05 23:44:25 得分 0

我来学习.....BCB版的高人BCB_FANS在这里啊...Top

68 楼RomanticProgrammer() 兰企鹅||南极俺最帅 ()回复于 2002-11-05 23:45:14 得分 0

看了这个帖子,才知道自己有多菜啊....根本看不懂啊...自卑ingTop

69 楼Li_Dinosaur(朋友)回复于 2002-11-06 10:39:13 得分 0

up;)Top

70 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-06 14:02:31 得分 0

测试失败……错误依旧……  
  发回代码ing……Top

71 楼slwqw(四大名捕之追杀令)回复于 2002-11-06 20:43:21 得分 0

楼主怎么这么粗心啊?  
   
  卸载失败的原因是什么?Top

72 楼zhenxizhou(东门行)回复于 2002-11-06 20:49:23 得分 0

gzTop

73 楼microran2000(什么时候才能看到星星?)回复于 2002-11-06 21:11:40 得分 0

 
  http://www.vchelp.net/vchelp/zsrc/dists.asp?type_id=25&class_id=1&cata_id=2&article_id=458  
   
  禁止Win32平台的任务切换    
   
   
  Windows   提供的多任务机制使得用户可以自由地在多个应用程序间自由切换,每一个应用程序作为一个进程都拥有独立的进程地址空间。各个程序之间互不影响,特别是在windows   NT   环境下,一个应用程序的挂起,一般不会影响其它程序的运行,操作系统可以很轻松地把挂起的进程杀死,从而使系统得到正常响应。然而这种机制同时也会助长了用户同时运行多个程序,开多个窗口,从而使系统不堪重负,反应迟缓,这对于普通的个人用机不会有什么影响,但对于工业实时控制计算机而言,情况就大不一样。由于Windows   NT   并不是一个实时的操作系统,一个程序的运行尽管不会直接影响其它程序,但是如果它对系统资源如CPU、内存占用过多,就会直接影响其它程序的快速响应,比如完全格式化一个质量不好的软盘、浏览次品光盘、刻录光盘、复制大文件等等。因此对于运行重要程序的计算机而言,重要程序应该独占系统资源,禁止任务切换,以便提高系统的实时性和可靠性,以防意外事件发生。另外对于文献检索的公共机房,机房工作人员一般也不希望检索人员来回切换程序。    
   
  1).   在Win9x环境下,应用程序可以通过不同的参数调用SystemParametersInfo函数,实现允   许和禁止任务切换。方法如下:    
   
  UINT   nPreviousState;  
   
  //   Disables   task   switching  
  SystemParametersInfo   (SPI_SETSCREENSAVERRUNNING,   TRUE,   &nPreviousState,   0);  
   
  //   Enables   task   switching  
  SystemParametersInfo   (SPI_SETSCREENSAVERRUNNING,   FALSE,   &nPreviousState,   0);    
   
  只是应用程序退出前,必须恢复允许任务切换状态。  
   
  2).   对于Windows   NT   4.0   Service   Pack   3机器更高版本,包括Windows   2000和Whister   (windows   XP),应用程序可以通过安装低级键盘钩子(WH_KEYBOARD_LL)实现禁止任务切换。在windows   9x/Me环境下不起作用。    
   
  #define   _WIN32_WINNT   0x0400  
   
  #include    
   
  HHOOK   hhkLowLevelKybd;  
   
  LRESULT   CALLBACK   LowLevelKeyboardProc(int   nCode,    
   
  WPARAM   wParam,   LPARAM   lParam)    
   
  {KBDLLHOOKSTRUCT   *pkbhs   =   (KBDLLHOOKSTRUCT   *)   lParam;  
   
  BOOL   bControlKeyDown   =   0;  
   
  switch   (nCode)  
   
   
  case   HC_ACTION:  
   
   
  //   Check   to   see   if   the   CTRL   key   is   pressed  
   
  bControlKeyDown   =   GetAsyncKeyState   (VK_CONTROL)   >>   ((sizeof(SHORT)   *   8)   -   1);  
   
  //   Disable   CTRL+ESC  
   
  if   (pkbhs->vkCode   ==   VK_ESCAPE   &&   bControlKeyDown)  
   
  return   1;  
   
  //   Disable   ALT+TAB  
   
  if   (pkbhs->vkCode   ==   VK_TAB   &&   pkbhs->flags   &   LLKHF_ALTDOWN)  
   
  return   1;  
   
  //   Disable   ALT+ESC  
   
  if   (pkbhs->vkCode   ==   VK_ESCAPE   &&   pkbhs->flags   &   LLKHF_ALTDOWN)  
   
  return   1;  
   
  break;  
   
   
  default:  
   
  break;  
   
   
  return   CallNextHookEx   (hhkLowLevelKybd,   nCode,   wParam,   lParam);  
   
  }  
   
  int   WINAPI   WinMain(HINSTANCE   hinstExe,   HINSTANCE,   PTSTR   pszCmdLine,   int)    
   
  {  
   
  //   Install   the   low-level   keyboard   &   mouse   hooks  
   
  hhkLowLevelKybd   =   SetWindowsHookEx(WH_KEYBOARD_LL,    
   
  LowLevelKeyboardProc,   hinstExe,   0);  
   
  //   Keep   this   app   running   until   we're   told   to   stop  
   
  MessageBox(NULL,    
   
  TEXT("Alt+Esc,   Ctrl+Esc,   and   Alt+Tab   are   now   disabled.")  
   
  TEXT("Click   "Ok"   to   terminate   this   application   and   re-enable   these   keys."),  
   
  TEXT("Disable   Low-Level   Keys"),   MB_OK);  
   
  UnhookWindowsHookEx(hhkLowLevelKybd);  
   
  return(0);  
   
  }  
   
  3).在NT环境下还有一种方法,通过枚举窗口,禁止除当前窗口以外所有窗口,程序退出前,恢复这些窗口为允许状态,这种方法同时适用于Windows9X和Windows   NT所有版本,只是无法禁止Ctrl+ESC键。    
   
  //   DisableTaskSwitch.cpp   :   Defines   the   entry   point   for   the   application.  
   
  //  
   
   
  #define   _WIN32_WINNT   0x0400  
   
  #include    
   
   
  typedef   struct   _DLONG    
   
  {  
   
  LONG   wParam;  
   
  LONG   lParam;  
   
  }DLONG;  
   
  BOOL   CALLBACK   EnumWindowsProc(HWND   hwnd,   LPARAM   lParam);  
   
   
  LRESULT   CALLBACK   WndProc(HWND,   UINT,   WPARAM,   LPARAM);  
   
   
  int   APIENTRY   WinMain(HINSTANCE   hInstance,  
   
  HINSTANCE   hPrevInstance,  
   
  LPSTR   lpCmdLine,  
   
  int   nCmdShow)  
   
   
  {  
   
  MSG   msg;  
   
  WNDCLASSEX   wcex;  
   
   
  wcex.cbSize   =   sizeof(WNDCLASSEX);    
   
   
  wcex.style   =   CS_HREDRAW   |   CS_VREDRAW;  
   
  wcex.lpfnWndProc   =   (WNDPROC)WndProc;  
   
  wcex.hInstance   =   hInstance;  
   
  wcex.hCursor   =   LoadCursor(NULL,   IDC_ARROW);  
   
  wcex.hbrBackground   =   (HBRUSH)(COLOR_WINDOW+1);  
   
  wcex.lpszClassName   =   "szClassDisableTaskSwitch";  
   
  RegisterClassEx(&wcex);  
   
  HWND   hWnd;  
   
  hWnd   =   CreateWindow("szClassDisableTaskSwitch",   "Disable   Task   Switch",   WS_OVERLA  
  PPEDWINDOW,  
   
  CW_USEDEFAULT,   0,   CW_USEDEFAULT,   0,   NULL,   NULL,   hInstance,   NULL);  
   
   
  if   (!hWnd)  
   
   
  return   FALSE;  
   
   
   
  BOOL   old;  
   
  DLONG   dlong;  
   
   
  dlong.wParam   =   (WPARAM)hWnd;  
   
  dlong.lParam   =   (LPARAM)FALSE;  
   
   
  EnumWindows(EnumWindowsProc   ,   (LONG)&dlong);  
   
   
  //Deceive   the   OS   by   communicating   that   the   application   is   a   screen   //saver.  
   
  //This   disables   the   ALT   +   TAB   /ESC   keys.  
   
  SystemParametersInfo(SPI_SCREENSAVERRUNNING,TRUE,&old,0);  
   
   
  ShowWindow(hWnd,   nCmdShow);  
   
  UpdateWindow(hWnd);  
   
  while   (GetMessage(&msg,   NULL,   0,   0))    
   
   
   
  TranslateMessage(&msg);  
   
  DispatchMessage(&msg);  
   
   
   
   
  return   msg.wParam;  
   
  }  
   
  LRESULT   CALLBACK   WndProc(HWND   hWnd,   UINT   message,   WPARAM   wParam,   LPARAM   lParam)  
   
   
  {switch   (message)   {  
   
  case   WM_SYSCOMMAND:  
  if(wParam   ==SC_MINIMIZE)return   0;  
  return   DefWindowProc(hWnd,   message,   wParam,   lParam);  
  break;  
   
   
   
  case   WM_DESTROY:  
   
  DLONG   dlong;  
   
  BOOL   Old;  
   
  dlong.lParam   =   (LPARAM)TRUE;  
   
  dlong.wParam   =   (WPARAM)hWnd;  
   
  EnumWindows(EnumWindowsProc,(LONG)&dlong);  
   
  SystemParametersInfo(SPI_SCREENSAVERRUNNING,FALSE,&Old,0);  
   
  PostQuitMessage(0);  
   
   
  break;  
   
  default:  
   
  return   DefWindowProc(hWnd,   message,   wParam,   lParam);  
   
  }  
   
   
  return   0;  
   
  }  
   
   
  BOOL   CALLBACK   EnumWindowsProc(HWND   hwnd,   LPARAM   lParam)  
   
  {  
   
  DLONG   *pDlong   =   (DLONG   *)   lParam;  
   
  BOOL   bEnable   =   (BOOL)pDlong->lParam;  
   
  if(hwnd   !=   (HWND)pDlong->wParam)  
   
  EnableWindow(hwnd,bEnable);  
   
  return   TRUE;  
   
   
  }  
   
  Top

74 楼microran2000(什么时候才能看到星星?)回复于 2002-11-06 21:16:54 得分 0

把Del的键的键和其它键的键冒交换一下,或者打开键盘把线路板与DEL链接的线与其它键重新焊接。  
        本法只适用于本机,对于别人的机器,大部分人的做法是逼急了找个系统启动盘格式化,这三个键是非用不可。Top

75 楼clin2y(林子)回复于 2002-11-07 11:22:18 得分 0

这个帖子真的很好,以前我问个一样的问题:(怎样进入我的程序后就屏蔽CTRL+ALT+DEL,退出我的程序后就恢复CTRL+ALT+DELETE),现在依然没有解决。只能通过替换gina来实现,这样好象必须修改注册表然后重新启动机器才生效.还有这样不安全,结果我安装W2Ksp3时我的机器出现了致命的错误,启动不起来了,从此我的爱机就在也不行了,重新安装过程中都死机,进入CMOS甚至都死机.没有办法买了一块新主板换上一切正常了.不知是不是这个gina引起的.  
  请求   jiangsheng(蒋晟.Net   )   和   BCB_FANS(四大名捕之追杀令   )你们俩帮帮我,把你们最新的讨论结果给我发到邮箱好吗?c   谢谢cailintai@sohu.com  
   
   
  Top

76 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-07 17:09:38 得分 0

>楼主怎么这么粗心啊?  
  >卸载失败的原因是什么?  
  调用CreateRemoteThread之后Winlogon.exe出错,然后计算机自动关机……  
  Top

77 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-07 17:12:40 得分 0

microran2000()    
  请看清楚题目  
    clin2y(林子)    
  现在的代码还是不甚稳定  
  Top

78 楼slwqw(四大名捕之追杀令)回复于 2002-11-07 17:51:20 得分 0

唉,老大怎么每一次都是惜字如金啊?  
   
  Hook和Unhook时,都要建立远程线程,到底是Hook时死机还是Unhook时死机?  
   
  因为我这里没有问题,只能根据你的测试结果来判断了,你提供的信息越详细,就越好判断!Top

79 楼cbc(逍遥子)回复于 2002-11-07 18:42:16 得分 0

学习Top

80 楼JennyVenus()回复于 2002-11-07 19:13:50 得分 0

好长时间没到这里了  
  to   楼主  
  改写键盘驱动可不是非要用vc呀,你可以用别的Top

81 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-07 20:17:50 得分 0

//InjectFunc  
  HANDLE   hRemoteThread;  
  hRemoteThread   =   CreateRemoteThread(hRemoteProcess,0,0,(DWORD(__stdcall   *)(VOID*))pRemoteThread,(INJECTLIBINFO*)pRemoteParam,0,&dwWriten);  
  这里Top

82 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-07 20:19:48 得分 0

我改写的代码在你的PC上也没问题?Top

83 楼smhpnuaa(天将降大任于斯人也!)回复于 2002-11-07 21:13:14 得分 0

up!Top

84 楼smhpnuaa(天将降大任于斯人也!)回复于 2002-11-07 21:14:06 得分 0

海尔公司的一个产品中已经实现了。Top

85 楼slwqw(四大名捕之追杀令)回复于 2002-11-07 21:44:10 得分 0

靠,真是见鬼了!我也就是直接编译你发来的文件,运行,一切正常!  
   
  按理说插入出问题,那只有可能是pfnLoadLibrary或者pInfo为NULL,可是pfnLoadLibrary和pInfo怎么会为NULL呢?代码中已经加了检测,如果为NULL,程序根本就运行不到那一步,又怎么会出问题?  
   
  现在我真恨不得直接到你那里去调试..:)Top

86 楼microran2000(什么时候才能看到星星?)回复于 2002-11-08 08:32:06 得分 0

 
   
  其实WDM键盘驱动,是不需要重新启动机器的,DDK中专门提供了一个instdrv的源程序,可以实现动态加载和卸载WDM驱动程序。  
  驱动程序级的HOOK比Ring3层的API   HOOK更有趣。  
   
   
  帮上面的服务改写为你需要的服务NtQuerySystemInformation   即可。instdrv通过服务的安装和卸载可以实现驱动程序的动态加载和卸载。  
   
  本来有一个很好的网站,www.sysinternals.com,这个网站提供了大量经典的源程序,水准比codeguru   codetools要高的多,很遗憾,最近几个月却无情的关闭了。比如它提供了无需远程客户端,直接在远程计算机上运行代码的源程序。  
        如果你因为担心键盘驱动需要重新启动计算机而放弃WDM的话,大可不必。拦截WIN   32   SDK   API是一种比较简单的办法,但是拦截Windows   NT服务(或者说是驱动)也应该行的通。只是前者经过多年相对比较成熟。  
  其实ring3层的应用程序解决不了的问题,往往会采用API   HOOK和钩子函数。  
  如果仍然解决不了,那就只有回归到ring0层的驱动程序了。因为在ring0可以运行权限不加限制的特权指令,当然也很容易把系统搞垮。  
        不过我最关心的是COM   API的拦截,基于COM的应用程序普天盖地,然而成功拦截COM接口方法的方案的确不多,尽管Detours提供的PPT文档简单提到了一些,但是应用起来很不理想。Windows核心编程对COM   接口方法拦截只字不提。然而COM接口方法的拦截前景可谓一片光明。比如你可以在IE中拦截Wscript.Shell、scripting.FileSystemObject还有就是MediaPlayer   DirectX的接口。  
  Top

87 楼microran2000(什么时候才能看到星星?)回复于 2002-11-08 08:33:10 得分 0

#define   FILE_DEVICE_HOOKSYS     0x00008300  
  #define   DRIVER_DEVICE_NAME       L"hooksys"  
  #include   "ntddk.h"  
  #include   "stdarg.h"  
  #include   "stdio.h"  
  #include   "hooksys.h"  
  #define   FILE_DEVICE_HOOKSYS     0x00008300  
  #define   DRIVER_DEVICE_NAME       L"hooksys"  
  #include   "..\..\include\undocnt.h"  
   
  typedef   NTSTATUS   (*NTCREATEFILE)(  
                          PHANDLE   FileHandle,  
                          ACCESS_MASK   DesiredAccess,  
                          POBJECT_ATTRIBUTES   ObjectAttributes,  
                          PIO_STATUS_BLOCK   IoStatusBlock,  
                          PLARGE_INTEGER   AllocationSize   OPTIONAL,  
                          ULONG   FileAttributes,  
                          ULONG   ShareAccess,  
                          ULONG   CreateDisposition,  
                          ULONG   CreateOptions,  
                          PVOID   EaBuffer   OPTIONAL,  
                          ULONG   EaLength  
  );  
   
  #define   SYSTEMSERVICE(_function)     KeServiceDescriptorTable.ServiceTableBase[   *(PULONG)((PUCHAR)_function+1)]  
  NTCREATEFILE   OldNtCreateFile;  
   
  NTSTATUS   NewNtCreateFile(  
                                          PHANDLE   FileHandle,  
                                          ACCESS_MASK   DesiredAccess,  
                                          POBJECT_ATTRIBUTES   ObjectAttributes,  
                                          PIO_STATUS_BLOCK   IoStatusBlock,  
                                          PLARGE_INTEGER   AllocationSize   OPTIONAL,  
                                          ULONG   FileAttributes,  
                                          ULONG   ShareAccess,  
                                          ULONG   CreateDisposition,  
                                          ULONG   CreateOptions,  
                                          PVOID   EaBuffer   OPTIONAL,  
                                          ULONG   EaLength)  
  {  
                  int   rc;  
                  char   ParentDirectory[1024];  
                  PUNICODE_STRING   Parent=NULL;  
   
                  ParentDirectory[0]='\0';  
                  if   (ObjectAttributes->RootDirectory!=0)   {  
                                  PVOID   Object;  
   
                                  Parent=(PUNICODE_STRING)ParentDirectory;  
                                  rc=ObReferenceObjectByHandle(ObjectAttributes->RootDirectory,  
                                                                                            0,  
                                                                                            0,  
                                                                                            KernelMode,  
                                                                                            &Object,  
                                                                                            NULL);  
                                  if   (rc==STATUS_SUCCESS)   {  
                                                  extern   NTSTATUS   ObQueryNameString(void   *,   void   *,   int   size,  
                                                                                                                      int   *);  
                                                  int   BytesReturned;  
   
                                                  rc=ObQueryNameString(Object,  
                                                                                      ParentDirectory,  
                                                                                      sizeof(ParentDirectory),  
                                                                                      &BytesReturned);  
                                                  ObDereferenceObject(Object);  
   
                                                  if   (rc!=STATUS_SUCCESS)  
                                                                  RtlInitUnicodeString(Parent,   L"Unknown\\");  
                                  }   else   {  
                                                                  RtlInitUnicodeString(Parent,   L"Unknown\\");  
                                  }  
                  }  
   
                  DbgPrint("NtCreateFile   :   Filename   =   %S%S%S\n",   Parent?Parent->Buffer:L"",  
                                                  Parent?L"\\":L"",   ObjectAttributes->ObjectName->Buffer);  
                  rc=((NTCREATEFILE)(OldNtCreateFile))   (  
                                                  FileHandle,  
                                                  DesiredAccess,  
                                                  ObjectAttributes,  
                                                  IoStatusBlock,  
                                                  AllocationSize,  
                                                  FileAttributes,  
                                                  ShareAccess,  
                                                  CreateDisposition,  
                                                  CreateOptions,  
                                                  EaBuffer,  
                                                  EaLength);  
                  DbgPrint("NtCreateFile   :   rc   =   %x\n",   rc);  
                  return   rc;  
  }  
   
  NTSTATUS   HookServices()  
  {  
                  OldNtCreateFile=(NTCREATEFILE)(SYSTEMSERVICE(ZwCreateFile));  
                  _asm   cli  
                  (NTCREATEFILE)(SYSTEMSERVICE(ZwCreateFile))=NewNtCreateFile;  
                  _asm   sti  
                  return   STATUS_SUCCESS;  
  }  
   
  void   UnHookServices()  
  {  
                  _asm   cli  
                  (NTCREATEFILE)(SYSTEMSERVICE(ZwCreateFile))=OldNtCreateFile;  
                  _asm   sti  
                  return;  
  }  
   
   
  NTSTATUS  
  DriverEntry(  
          IN   PDRIVER_OBJECT     DriverObject,  
          IN   PUNICODE_STRING   RegistryPath  
          )  
  {  
                  MYDRIVERENTRY(DRIVER_DEVICE_NAME,  
                                                  FILE_DEVICE_HOOKSYS,  
                                                  HookServices());  
                  return   ntStatus;  
  }  
   
  NTSTATUS  
  DriverDispatch(  
          IN   PDEVICE_OBJECT   DeviceObject,  
          IN   PIRP                       Irp  
          )  
  {  
          Irp->IoStatus.Status             =   STATUS_SUCCESS;  
          IoCompleteRequest   (Irp,  
                                                IO_NO_INCREMENT  
                                                );  
          return   Irp->IoStatus.Status;  
  }  
   
   
  VOID  
  DriverUnload(  
          IN   PDRIVER_OBJECT   DriverObject  
          )  
  {  
          WCHAR                                     deviceLinkBuffer[]     =   L"\\DosDevices\\"DRIVER_DEVICE_NAME;  
          UNICODE_STRING                   deviceLinkUnicodeString;  
   
          UnHookServices();  
   
          RtlInitUnicodeString   (&deviceLinkUnicodeString,  
                                                      deviceLinkBuffer  
                                                      );  
   
          IoDeleteSymbolicLink   (&deviceLinkUnicodeString);  
          IoDeleteDevice   (DriverObject->DeviceObject);  
  }  
  Top

88 楼microran2000(什么时候才能看到星星?)回复于 2002-11-08 08:36:52 得分 0

NTSTATUS   NTAPI  
  NtQuerySystemInformation   (SYSTEMINFOCLASS   sic,  
                                                      PVOID                       pData,  
                                                      DWORD                       dSize,  
                                                      PDWORD                     pdSize);  
  NTSTATUS   NTAPI  
  NtSetSystemInformation   (SYSTEMINFOCLASS   sic,  
                                                  PVOID                       pData,  
                                                  DWORD                       dSize);  
   
  Example   2:    
  NtQuerySystemInformation   (18)   -->   64   bytes   at   0x007B0020  
  Offset|   00   01   02   03   04   05   06   07   :   08   09   0A   0B   0C   0D   0E   0F   |   01234567   :   89ABCDEF  
  00000   |   00   00   00   00   00   8B   00   00   :   66   0B   00   00   66   0B   00   00   |   .......   :   f...f...  
  00010   |   26   00   28   00   38=00=7B=00   :   5C   00   3F   00   3F   00   5C   00   |   &.(.8.{.   :   \.?.?.\.  
  00020   |   44   00   3A   00   5C   00   70   00   :   61   00   67   00   65   00   66   00   |   D.:.\.p.   :   a.g.e.f.  
  00030   |   69   00   6C   00   65   00   2E   00   :   73   00   79   00   73   00   00   00   |   i.l.e...   :   s.y.s...  
  Example   3:    
  NtQuerySystemInformation   (18)   -->   64   bytes  
  Offset|   00   01   02   03   04   05   06   07   :   08   09   0A   0B   0C   0D   0E   0F   |   01234567   :   89ABCDEF  
  ------|-------------------------:-------------------------|----------:---------  
  00000   |   00   00   00   00   00   8B   00   00   :   66   0B   00   00   66   0B   00   00   |   .......   :   f...f...  
  00010   |   26   00   28   00   18=00=00=00   :   5C   00   3F   00   3F   00   5C   00   |   &.(.....   :   \.?.?.\.  
  00020   |   44   00   3A   00   5C   00   70   00   :   61   00   67   00   65   00   66   00   |   D.:.\.p.   :   a.g.e.f.  
  00030   |   69   00   6C   00   65   00   2E   00   :   73   00   79   00   73   00   00   00   |   i.l.e...   :   s.y.s...  
  Example   4:    
  NtQuerySystemInformation:  
  77f67d2c   b87c000000               mov           eax,0x7c  
  77f67d31   8d542404                   lea           edx,[esp+0x4]  
  77f67d35   cd2e                           int           2e  
  77f67d37   c21000                       ret           0x10  
  NtSetSystemInformation:  
  77f68034   b8ae000000               mov           eax,0xae  
  77f68039   8d542404                   lea           edx,[esp+0x4]  
  77f6803d   cd2e                           int           2e  
  77f6803f   c20c00                       ret           0xc  
  Listing   One  
  NTSTATUS   WINAPI   QuerySystemInformation   (SYSTEMINFOCLASS   sic,  
                                                                                  PPVOID                     ppData,  
                                                                                  PDWORD                     pdData)  
          {  
          PVOID         pData;  
          DWORD         dData,   n;  
          NTSTATUS   ns   =   STATUS_INVALID_PARAMETER;  
          dData   =   0;  
          if   (ppData   !=   NULL)  
                  {  
                  n   =   0;  
                  while   ((pData   =   LocalAlloc   (LMEM_FIXED,   dData   +=   0x10000))  
                                !=   NULL)  
                          {  
                          ns   =   NtQuerySystemInformation   (sic,   pData,   dData,   &n);  
                          if   (ns   !=   STATUS_SUCCESS)   n   =   0;  
                          if   (ns   !=   STATUS_INFO_LENGTH_MISMATCH)   break;  
                          LocalFree   (pData);  
                          }  
                  dData   =   n;  
                  if   (pData   !=   NULL)  
                          {  
                          if   (ns   !=   STATUS_SUCCESS)  
                                  {  
                                  LocalFree   (pData);  
                                  pData   =   NULL;  
                                  dData   =   0;  
                                  }  
                          }  
                  else  
                          {  
                          ns   =   STATUS_NO_MEMORY;  
                          }  
                  *ppData   =   pData;  
                  }  
          if   (pdData   !=   NULL)   *pdData   =   dData;  
          return   ns;  
          }  
   
   
  Listing   Two  
  //   05:   SystemProcessInformation  
  //           see   ExpGetProcessInformation()  
  //           see   also   ExpCopyProcessInfo(),   ExpCopyThreadInfo()  
  typedef   struct   _SYSTEM_THREAD  
          {  
          QWORD                 qKernelTime;               //   100   nsec   units  
          QWORD                 qUserTime;                   //   100   nsec   units  
          QWORD                 qCreateTime;               //   relative   to   01-01-1601  
          DWORD                 d18;  
          PVOID                 pStartAddress;  
          CLIENT_ID         Cid;                               //   process/thread   ids  
          DWORD                 dPriority;  
          DWORD                 dBasePriority;  
          DWORD                 dContextSwitches;  
          DWORD                 dThreadState;             //   2=running,   5=waiting  
          KWAIT_REASON   WaitReason;  
          DWORD                 dReserved01;  
          }  
          SYSTEM_THREAD;  
  //   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -  
  typedef   struct   _SYSTEM_PROCESS_INFORMATION  
          {  
          DWORD                     dNext;                       //   relative   offset  
          DWORD                     dThreadCount;  
          DWORD                     dReserved01;  
          DWORD                     dReserved02;  
          DWORD                     dReserved03;  
          DWORD                     dReserved04;  
          DWORD                     dReserved05;  
          DWORD                     dReserved06;  
          QWORD                     qCreateTime;           //   relative   to   01-01-1601  
   
          QWORD                     qUserTime;               //   100   nsec   units  
          QWORD                     qKernelTime;           //   100   nsec   units  
          UNICODE_STRING   usName;  
          KPRIORITY             BasePriority;  
          DWORD                     dUniqueProcessId;  
          DWORD                     dInheritedFromUniqueProcessId;  
          DWORD                     dHandleCount;  
          DWORD                     dReserved07;  
          DWORD                     dReserved08;  
          VM_COUNTERS         VmCounters;  
          DWORD                     dCommitCharge;       //   bytes  
          SYSTEM_THREAD     ast   [];  
          }  
          SYSTEM_PROCESS_INFORMATION;Top

89 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-08 10:17:20 得分 0

microran2000()     感谢你的参与,我想的是HOOK键盘不用这么麻烦,你的方法对我HOOK显示驱动倒是有帮助  
  Top

90 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-08 10:27:36 得分 0

BCB_FANS(四大名捕之追杀令)  
  的确都不为NULL,但是就是出问题……  
  在TrapKey程序中选择Disable   Ctrl+Alt+Delete的时候出错,已经把出问题的图发给你了,Top

91 楼slwqw(四大名捕之追杀令)回复于 2002-11-08 13:47:36 得分 0

不好意思,我昨晚测试不够仔细!  
   
  我一打开到你的项目,就切换到“TrapKeys   -   Win32   Release”了,所以一切正常!看到你发的图片之后,试着切换到“TrapKeys   -   Win32   Debug”,果然Winlogon.Exe出问题了,2000也当机了:)  
   
  关于VC中Debug状态和Release状态运行结果的不同,我早已耳闻!今日终于还是让我碰上了,靠!  
   
  不过我觉得最主要的是Release版本工作正常就可以了,为什么在Debug状态就出问题,以我现在的VC水平可能无法得知了。  
   
  =============  
   
  Bug报告:  
   
  TrapKeys程序的“Disable   Taskbar”功能在某些特殊情况会实效!!!   选中这个功能之后,你按以下Win键,看看什么出来了,嘿嘿...  
  Top

92 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-08 15:59:02 得分 0

我没锁这些键……其实要锁也能锁住的Top

93 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-08 16:08:51 得分 0

用Release+Debug信息的版本倒是正常运行,但是也不能锁Ctrl+Alt+Delete了Top

94 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-08 16:10:40 得分 0

unload错误:找不到指定的模块?Top

95 楼hzwanglw(Ringwraiths)回复于 2002-11-08 16:13:42 得分 0

gzTop

96 楼slwqw(四大名捕之追杀令)回复于 2002-11-08 17:22:05 得分 0

找不到指定的模块?那就是路径设置有问题了,一步一步地跟踪看看结果是什么就可以了。  
   
  我这里一切正常。邪门!!!Top

97 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-11-08 18:11:38 得分 0

发现问题  
  1   复制字符串的时候不能用CopyMemory,而应该用lstrcpy  
  2   复制字符串的时候应该复制字符串长度+1个字符Top

98 楼slwqw(四大名捕之追杀令)回复于 2002-11-08 18:50:24 得分 0

试着在CopyMemory前面添加  
   
  ZeroMemory(InjectLibInfo.DllName,sizeof(InjectLibInfo.DllName));  
   
  看看.  
  Top

99 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-08 19:10:27 得分 0

ZeroMemory加了还有问题  
  现在怀疑是DLL有问题,检查ing……Top

100 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-08 19:14:09 得分 0

检查无用……Top

101 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-08 19:15:59 得分 0

现在的问题是无论是否正常运行,remote.dll都没有加载(没进dllmain)Top

102 楼slwqw(四大名捕之追杀令)回复于 2002-11-08 19:27:47 得分 0

1、没进DLlMain,那就是装载DLL的远程线程运行失败,我发了一个带调试功能的Hook.Cpp给你,看看在哪个地方装载DLL失败。  
   
  2、建议统一使用LoadLibraryA和FreeLibraryA和GetModuleHanleA来试试。  
   
  已经发了邮件.....Top

103 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-08 19:34:38 得分 0

发现一个问题  
  在WindowsNT4   Terminal   Server   4.0   Edition/2000   Server/XP/Windows   .Net   Server上,如果安装了终端服务,则每个登录用户会有自己的Winlogon进程和桌面(包括控制台进程),也就是说,需要判别哪一个Winlogon进程是自己的Winlogon进程  
  不幸的是,所有Winlogon进程拥有者名称都是SYSTEM,只能根据终端服务的会话ID来判断是否是当前用户,可使用ProcessIdToSessionId函数Top

104 楼slwqw(四大名捕之追杀令)回复于 2002-11-08 19:39:35 得分 0

我这里是单机,对这种终端不熟悉,老大能不能说得再详细一点?Top

105 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-08 19:51:54 得分 0

http://www.microsoft.com/china/technet/windows2000/dguide/chapt-16.asp  
  终端服务(Terminal   Services   )  
  KB关键字kbTermServ    
  可以通过调用WTSQuerySessionInformation的时候传递WTSSessionId来获得当前会话ID  
  Top

106 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-08 19:58:04 得分 0

BCB_FANS(四大名捕之追杀令),nevergrief(孤独骑士),   microran2000()   进来领分  
  http://expert.csdn.net/Expert/topic/1160/1160965.xml  
  继续继续……Top

107 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-08 20:00:44 得分 0

装载失败:原因:拒绝访问  
  ??Top

108 楼slwqw(四大名捕之追杀令)回复于 2002-11-08 20:22:24 得分 0

邪了!!!LoadLibrary竟然返回这个错误值!把代码贴出来,我实在想不出哪里有问题了:(  
   
  ======================  
   
  //远程线程,用来装载DLL  
  static   DWORD   WINAPI   ThreadFuncAttach(INJECTLIBINFO   *pInfo)  
  {  
      HINSTANCE   hDll;  
   
      pInfo->dwReturnValue   =   0;  
       
      hDll   =   (HINSTANCE)pInfo->pfnLoadLibrary(pInfo->DllName);  
   
      if(hDll   ==   NULL)  
          pInfo->dwReturnValue   =   pInfo->pfnGetLastError();  
   
      return((DWORD)hDll);  
  }  
  Top

109 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-08 20:37:34 得分 0

正在编写2000终端版本  
  已知问题:在Windows2000ServerSP3上从一个UNC路径(以\\开头的路径)运行的时候会报告拒绝访问错误Top

110 楼slwqw(四大名捕之追杀令)回复于 2002-11-08 20:43:58 得分 0

这段代码怎么会得到以“\\”开头的路径?  
   
  ======================  
   
  const   char*   const   RemoteDllName   =   "RemoteDll.Dll";  
  TCHAR   szEXEPath[_MAX_PATH];  
  GetModuleFileName(NULL,szEXEPath,_MAX_PATH);  
   
  ::PathRemoveFileSpec(szEXEPath);  
  ::PathAppend(szEXEPath,RemoteDllName);  
   
  CTaskKeyMgr::strRemoteDllName=szEXEPath;  
  。。。。。。。。。。。。Top

111 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-08 20:49:36 得分 0

我的整个工程都在服务器上,所以出现了这个问题  
  刚才说错了,只要Exe文件在网络上就会出现拒绝访问错误,映射网络驱动器之后也有同样的错误。  
  Top

112 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-08 21:00:46 得分 0

Getting   Process   Information   with   WTS   APIshttp://msdn.microsoft.com/msdnmag/issues/02/06/debug/default.aspxTop

113 楼slwqw(四大名捕之追杀令)回复于 2002-11-08 21:05:38 得分 0

我的整个工程都在服务器上,所以出现了这个问题  
  刚才说错了,只要Exe文件在网络上就会出现拒绝访问错误,映射网络驱动器之后也有同样的错误。  
   
  ===========  
   
  我越来越不明白你在说什么了!单机环境跟网络环境大大地不同,看来我无法再帮忙了。Top

114 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-08 21:27:25 得分 0

简单的说,我把工程从服务器复制到本机,编译,运行就没问题了……真是!@#%^@#!&^  
   
  Top

115 楼slwqw(四大名捕之追杀令)回复于 2002-11-08 21:40:19 得分 0

看了这个帖子  
  http://msdn.microsoft.com/msdnmag/issues/02/06/debug/default.asp  
   
  想不到XP还有这么一个功能,看来得装一下XP了!  
   
  ===============  
   
  问题是你的程序要在什么样的环境下运行?是不是在一台台独立的电脑上运行,还是在网络环境下运行?如果是网络环境,那程序具体是怎么运行的?我确实不清楚!Top

116 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-08 21:59:59 得分 0

运行环境是本地硬盘  
  估计原因是Winlogon进程没有足够权限去访问一个有密码保护的网络资源(它和资源管理器分属不同的用户,所以权限和缓冲的密码不同)  
  正在测试……Top

117 楼slwqw(四大名捕之追杀令)回复于 2002-11-08 22:14:44 得分 0

我更迷糊了...既然是本地硬盘,Exe和DLL都在本地硬盘上,Winlogon为什么要去访问网络资源?Top

118 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-08 22:17:36 得分 0

测试成功  
  BCB_FANS(四大名捕之追杀令)  
  很多人提出了公开源代码的要求,你觉得这个代码是否可以帖到codeguru/codeproject之类的公开代码网站?  
  已知问题:该程序必须在一个系统(SYSTEM)用户不输入密码就可以访问的位置,不能在一个密码保护的位置上运行(因为Winlogon程序是系统用户运行的)  
  正在去掉调试信息对话框Top

119 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-08 22:20:30 得分 0

刚才的问题是我访问服务器的资源需要输入密码。和Explorer用户名相同的应用程序(Visual   C++和我的程序)可以通过Explorer缓存的密码来访问服务器,但是WinLogon和Explorer使用了不同的用户名,所以我的程序可以访问到的资源,WinLogon不能访问。这就是我的程序LoadLibrary成功而WinLogonLoadLibrary失败的原因Top

120 楼slwqw2(亚洲之鹰)回复于 2002-11-08 22:53:27 得分 0

靠,CSDN,为什么不能回复超过30次???  
   
  ========================================  
   
  测试成功  
  BCB_FANS(四大名捕之追杀令)  
  很多人提出了公开源代码的要求  
   
  ==============  
   
  当然可以,只是最好要充分测试一下,免得以后又让人家忙:)  
   
  不过版权部分,除了姓名和网上呢称不变之外,其它的你能不能翻译成英文?我的E文不太好,看看可以,翻译就不行了:(  
   
   
  ============  
   
  这个帐号是我的马夹:)Top

121 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-08 23:13:58 得分 0

大家都是马甲:(  
  现存问题:Debug方式运行会S机Top

122 楼slwqw2(亚洲之鹰)回复于 2002-11-08 23:33:57 得分 0

这个问题在VC中普遍存在,具体原因不详:(Top

123 楼slwqw2(亚洲之鹰)回复于 2002-11-09 11:03:40 得分 0

发现BUG,已经发更正文件。注意查收!Top

124 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-09 12:22:38 得分 0

其实可以用VC里面的TCHAR解决问题的,不必另外开缓冲区  
  正在发送修改过的Unicode版本……  
  Top

125 楼slwqw2(亚洲之鹰)回复于 2002-11-09 13:17:07 得分 0

老大发送了没有?我现在还没有收到啊!1个小时了。Top

126 楼slwqw2(亚洲之鹰)回复于 2002-11-09 14:15:30 得分 0

使用TCHAR不成功!  
   
  我定义了UNICODE之后,提示:找不到指定的模块。  
   
  ===============  
   
   
  #define   UNICODE  
   
  #ifdef   UNICODE  
  LPCSTR     LoadLibraryFuncStr   =   "LoadLibraryW";  
  Top

127 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-09 15:56:21 得分 0

好像不行,#define   UNICODE应该在所有工程的stdafx.h里面定义才可以(也就是说,所有的模块都必须有unicode版本)  
  这个工作量好像太大,只用ansi版本好了Top

128 楼slwqw2(亚洲之鹰)回复于 2002-11-09 16:05:12 得分 0

那看来只好使用ANSI版本了。Top

129 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2002-11-09 18:54:46 得分 0

插嘴问一下,成功了吗?Top

130 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-11 10:43:16 得分 0

http://www.csdn.net/Develop/read_article.asp?id=15645  
  BCB_FANS(四大名捕之追杀令)   来写Hook   NtQuerySystemInformation的文档吧  
   
  已知问题  
  尚无Unicode版本    
  VirtualAllocEx分配的内存没有用VirtualFreeEx释放    
  在Debug方式下运行会造成Winlogon出错(出错后请不要确认或取消那个出错对话框,然后保存打开的所有文档,关闭所有程序,通过正常的途径关机,否则Windows会立刻关机)  
  在Windows   2000   Pro   SP3,IE6SP1,VC6SP5下编译通过Top

131 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-11 10:43:52 得分 0

BCB_FANS(四大名捕之追杀令)   来这里http://expert.csdn.net/Expert/topic/1160/1160965.xmlTop

132 楼slwqw2(亚洲之鹰)回复于 2002-11-11 11:46:39 得分 0

来写Hook   NtQuerySystemInformation的文档吧  
   
  ======  
   
  怎么写啊?所有的代码都是从《Windows核心编程》里边拷贝的。如果想知道原理,只有去看《Windows核心编程》了。Top

133 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-11 12:03:36 得分 0

由于使用了替换系统窗口过程的方法,所以多个实例同时运行可能出现问题……要按次序启动和退出(第一个启动的要最后一个退出)Top

134 楼slwqw2(亚洲之鹰)回复于 2002-11-11 14:04:32 得分 0

的确有这种事。因为第二个程序替换时,返回的旧的窗口过程实际上就是第一个程序里边的窗口过程,如果第一个程序先退出了,它里边的窗口过程就会失效,第二个程序可能就会出问题。  
   
  =====  
   
  BCB_FANS(四大名捕之追杀令)   来这里http://expert.csdn.net/Expert/topic/1160/1160965.xml  
   
  老大,你叫我去这个帖子,干吗不给我分啊?是不是给错了?:)Top

135 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-11 14:18:09 得分 0

的确是给错了……幸好这里还有300……Top

136 楼rivershan(阿门)回复于 2002-11-12 12:45:00 得分 0

哦~  
  原来在硬件里~  
  我说怎么没看到呢~Top

137 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-12 17:36:52 得分 0

考虑用DLL中的共享数据段解决多实例问题……但是其他程序同时也替换系统窗口过程的话就没办法检测了Top

138 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-12 17:39:43 得分 0

觉得这里太乱的话,可以看看文档  
  http://www.csdn.net/Develop/read_article.asp?id=15645  
  有没有人研究动态Hook   GINA函数的?Top

139 楼slwqw2(亚洲之鹰)回复于 2002-11-12 20:59:06 得分 0

我手头就有动态Hook   GINA函数的代码,采用的技术就是替换WlxLoggedOnSAS的前5个字节,插入一条JMP指定,指向自己的函数。  
   
  说一说过程(献丑了:))  
   
  缺省情况下,SAS窗口接收到Ctrl   +   Alt   +   Del消息之后,切换到Winlogon桌面,然后调用GINA里边的WlxLoggedOnSAS函数,缺省情况下,这个函数显示安全对话框。如果用户选“注销”,WlxLoggedOnSAS返回WLX_SAS_ACTION_LOGOFF,以表明用户想注销,接着Winlogon进程将调用GIAN的WlxLogoff函数进行注销操作;   如果用户选“关机”、“更改密码”、“任务管理器”等操作,Winlogon也将做其它一些相关的操作。但是如果用户按“取消”按钮,这个函数将直接返回WLX_SAS_ACTION_NONE,表明用户不想做任何事,则Winlonon进程也不做任何事,直接返回Default桌面。上面的Hook技术就是采用替换前5个字节的方法,跳到自己的函数,然后直接返回WLX_SAS_ACTION_NONE,Winlogon也就直接返回Default桌面了:)。这种方法的毛病就是明显地看到桌面在闪烁。而且这种Hook技术固有的缺点并没有得到克服,同样随时有可能出现Exception,具体原因《Windows核心编程》已经说了。Top

140 楼superaf(阿斐)回复于 2002-11-13 16:24:05 得分 0

精彩,我以前问过,但没有人搭理,好好学学。。。  
   
  发表源代码的地方,别忘了贴出来啊,  
   
  给你们鼓个气,加油,要是真的能做成unicode版本就好了,便于移植。Top

141 楼BCBFANSXP(狼嗥九月血满天,小楼细雨梦惊魂)回复于 2002-11-13 17:41:33 得分 0

新马甲报道:)Top

142 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-13 17:54:00 得分 0

根据这个工作原理来看,可行的另外一种方案是WH_CALLWNDPROC   Hook,然后判断热键是否是Ctrl+Alt+Delete,不过可能效率太低  
  发现unicode版本的问题……字符串的长度有误  
   
   
  考虑用DLL中的共享数据段+Hook   SetWindowLong解决多次替换窗口过程的问题Top

143 楼microsoftwin(流星雨点)回复于 2002-11-13 21:04:53 得分 0

该死的微软,写什么Windows嘛!!!害得大伙这么伤脑筋!!!我很同情大家!!!有好的程序请发到我的信箱!!microsoftwin3000@sina.com!!!谢谢!!!Top

144 楼BCBFANSXP(狼嗥九月血满天,小楼细雨梦惊魂)回复于 2002-11-14 13:04:03 得分 0

考虑用DLL中的共享数据段+Hook   SetWindowLong解决多次替换窗口过程的问题  
   
  =======  
   
  有道理,设置一个共享变量,比如   bool   HasInstallHook   =   false;  
   
  在调用SetWindowLong之前,先判断这个标志,如果已经为true,则直接返回,不进行替换。Top

145 楼nbgyf(梅花峰)回复于 2002-11-14 14:27:41 得分 0

HOOK早有耳闻,却未用过,学习之;  
   
  老大们,干码非要用VC写WDM不行吗?  
   
  UPTop

146 楼BCBFANSXP(狼嗥九月血满天,小楼细雨梦惊魂)回复于 2002-11-14 16:00:22 得分 0

我不会WDM   :(Top

147 楼wltsui(-无招胜有招-)回复于 2002-11-14 16:04:35 得分 0

gzTop

148 楼nbgyf(梅花峰)回复于 2002-11-14 18:32:07 得分 0

哎,才疏学浅呀!!!!!!  
   
  向各位老大学习;  
   
  写WDM太痛苦了,还是要HOOK;  
   
  Top

149 楼nbgyf(梅花峰)回复于 2002-11-14 18:36:25 得分 0

本人临时抱佛脚学了一会hook;  
   
  发现有篇文章写的蛮好;  
   
  转载部分,不知对各位是否有用;  
   
  ------------------------------------------------------  
  作者:张运潮  
   
   
              底层键盘钩子存在于用户敲击键盘和系统处理之间,而普通键盘钩子则存在于系统产生WM_KEY***消息之后。很清楚,普通键盘钩子只能截获WM_KEY***消息,而不能对系统键进行操作。但是底层键盘钩子有一个致命的弱点,就是如果调用它的进程或线程出现死循环,则系统将不能处理任何键盘操作。为了解决这个问题,微软在注册表中给出了一个底层键盘钩子处理的限制时间,如果超出了这个时间,系统将进入正常处理。  
   
  下面是实现底层键盘钩子的部分源代码:    
   
  LRESULT   CALLBACK   LowLevelKeyboardProc(int   nCode,WPARAM   wParam,   LPARAM   lParam)      
  {    
    BOOL   fEatKeystroke   =   FALSE;    
     If   (nCode   ==   HC_ACTION)   {    
      switch   (wParam)   {    
      case   WM_KEYDOWN:      
      case   WM_SYSKEYDOWN:    
      case   WM_KEYUP:      
      case   WM_SYSKEYUP:      
       PKBDLLHOOKSTRUCT   p   =      
  (PKBDLLHOOKSTRUCT)   lParam;    
       fEatKeystroke   =((p->vkCode   ==      
  VK_TAB)   &&   ((p->flags   &   LLKHF_ALTDOWN)      
  !=   0))   ||((p->vkCode   ==   VK_ESCAPE)   &&   ((p->flags   &   LLKHF_ALTDOWN)   !=   0))   ||((p->vkCode   ==   VK_ESCAPE)   &&      
  ((GetKeyState(VK_CONTROL)   &   0x8000)   !=   0));    
       break;    
  }    
     }    
  return(fEatKeystroke   ?   1   :   CallNextHookEx(NULL,   nCode,   wParam,   lParam));    
    }    
      int   WINAPI   WinMain(HINSTANCE   hinstExe,   HIN    
  STANCE,   PTSTR   pszCmdLine,   int)      
  {    
    //安装底层键盘钩子    
  HHOOK   hhkLowLevelKybd   =   SetWindow    
  sHookEx(WH_KEYBOARD_LL,   LowLevelKeyboardProc,      
  hinstExe,   0);    
    MessageBox(NULL,TEXT(“Alt+Esc,   Ctrl+Esc,   and   Alt+Tab   are   now   disabled.\n”),TEXT(“Click   \“Ok\”   to   terminate   this   application   and   re-enable   these   keys.”),TEXT(“Disable   Low-Level   Keys”),   MB_OK);    
    UnhookWindowsHookEx(hhkLowLevelKybd);    
    return(0);    
    }    
  Top

150 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-15 10:15:28 得分 0

在示例代码中屏蔽Ctrl+Alt+Delete之外的系统热键就是用的这种方法。Top

151 楼nbgyf(梅花峰)回复于 2002-11-15 11:59:25 得分 0

难道,这个示例代码不能屏蔽Ctrl+Alt+Delete?  
   
  我试了,可以呀?  
   
  奇怪  
   
  UPTop

152 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-11-15 12:24:56 得分 0

LowLevelKeyboardProc   Function  
   
  The   LowLevelKeyboardProc   hook   procedure   is   an   application-defined   or   library-defined   callback   function   used   with   the   SetWindowsHookEx   function.   The   system   calls   this   function   every   time   a   new   keyboard   input   event   is   about   to   be   posted   into   a   thread   input   queue.   The   keyboard   input   can   come   from   the   local   keyboard   driver   or   from   calls   to   the   keybd_event   function.   If   the   input   comes   from   a   call   to   keybd_event,   the   input   was   "injected".   However,   the   WH_KEYBOARD_LL   hook   is   not   injected   into   another   process.   Instead,   the   context   switches   back   to   the   process   that   installed   the   hook   and   it   is   called   in   its   original   context.   Then   the   context   switches   back   to   the   application   that   generated   the   event.    
   
  The   HOOKPROC   type   defines   a   pointer   to   this   callback   function.   LowLevelKeyboardProc   is   a   placeholder   for   the   application-defined   or   library-defined   function   name.  
   
   
  Syntax  
   
  LRESULT   CALLBACK   LowLevelKeyboardProc(                     int   nCode,  
          WPARAM   wParam,  
          LPARAM   lParam  
  );  
  Parameters  
   
  wParam  
  [in]   Specifies   the   identifier   of   the   keyboard   message.   This   parameter   can   be   one   of   the   following   messages:   WM_KEYDOWN,   WM_KEYUP,   WM_SYSKEYDOWN,   or   WM_SYSKEYUP.    
   
  你确认你测试过?Ctrl+Alt+Delete产生WM_HOTKEY消息,而不是WH_KEYBOARD_LL能够Hook的WM_KEYDOWN,   WM_KEYUP,   WM_SYSKEYDOWN,   或者WM_SYSKEYUP   。Top

153 楼nbgyf(梅花峰)回复于 2002-11-15 14:55:03 得分 0

呵呵;  
   
  是不能屏蔽Ctrl+Alt+Delete它;  
   
  SorryTop

154 楼finix(*_*)回复于 2002-12-17 12:39:03 得分 0

mark(this);Top

155 楼sjzxyg(小小鸟)回复于 2002-12-17 13:05:26 得分 0

做个标记,有空再看Top

156 楼cbc(逍遥子)回复于 2002-12-17 13:20:09 得分 0

xuexi,做个记号Top

157 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2002-12-18 12:42:40 得分 0

目前的改进:  
  分配空间时分配4K的倍数可能提高稳定性  
  使用SetProp和GetProp在SAS窗口上设置引用计数,解决多次替换窗口过程的问题(DLL共享代码段在终端服务器上会出现问题……只有第一个用户的Winlogon进程被Hook)Top

158 楼NowCan(城市浪人)回复于 2002-12-22 17:38:18 得分 0

太厉害了~!Top

159 楼kernelspirit(核心精神)回复于 2002-12-23 11:30:29 得分 0

收藏Top

160 楼realjustin(莫论国事,违者杀头3)回复于 2003-01-06 22:57:01 得分 0

源码下不下来,谁又能否发给我一份?  
  谢谢!  
  litz@paic.com.cnTop

161 楼jiangshengMKII(蒋晟.Net的马甲)回复于 2003-01-08 18:21:36 得分 0

src:  
  http://freehost19.websamba.com/skyflier/caq0209.rar  
  bin:  
  http://freehost19.websamba.com/skyflier/disablectrlaltdelete.zipTop

162 楼kylix2001(皮卡丘)回复于 2003-01-15 14:00:19 得分 0

五体投地!收藏:)Top

163 楼illuhui(瘦猴)回复于 2003-01-25 12:29:15 得分 0

哇,真的是五体投地!小弟刚弄了一个,在2000下结合HOOK和GINA,没其他的办法:)那个NtQuerySystemInformatoin函数,唉,不懂!Top

164 楼Analyst()回复于 2003-02-04 22:27:26 得分 0

阅Top

相关问题

  • 能否用VB禁用Ctrl+Alt+Del ???
  • 如何在windows启动时,禁用CTRL+ALT+DEL。
  • 请问如何在 WinNT 下禁用Ctrl+Alt+Del
  • 着急:如何禁用ctrl+ALT+DEL组合键?
  • 2000,xp,2003系统如何禁用ctrl+alt+del键?
  • 有谁知道如何禁用以下组合键ALT+F4、ALT+TAB、CTRL+ESC、CTRL+ALT+DEL怎么实现
  • 如何在Win2000中禁用Ctrl+Alt+Delete等热键?(在线等待!)
  • 如何在win98下使用API函数,禁用win键和三键热启(Ctrl+Alt+Del),急救!
  • 请教,如何通过修改注册表使Ctrl+Alt+Del三键热启以及Win键禁用
  • 在winxp中怎么样从注册表中禁用ctrl+alt+del,ctrl+esc,还有那个开始菜单快捷键???

关键词

  • .net
  • c++
  • sp1
  • win2k
  • win32
  • windows2000
  • 屏蔽
  • 函数
  • 键盘
  • 代码

得分解答快速导航

  • 帖主:jiangsheng
  • slwqw

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
x 提问