碧水蓝天

不登高山,不知云之高;不临深渊,不知地之厚也

导航

<2007年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

统计

公告

目前从事视频会议系统开发

留言簿(1)

随笔分类

随笔档案

文章分类

文章档案

视频会议相关

软件工程/软件设计

搜索

最新评论

阅读排行榜

评论排行榜

如何让你的程序避开全局键盘钩子的监视

        一直以来有个疑问,就是如果别人在你的电脑上安装了键盘钩子来监视你的键盘按键动作,我的程序怎么才能避开这些全局键盘钩子(system-wide hook)的监视.正好最近一段时间因为工作关系在研究钩子,顺便研究了一下这个问题,今天算是找到了一个解决办法.
解决办法:
在我的程序中安装一个局部键盘钩子(thread-specified hook),键盘钩子函数中不调用CallNextHookEx;
原理:
1.钩子链可以被破坏.同一类型的钩子会形成一个链,假如先被调用的钩子没有调用CallNextHookEx的话,后面的钩子将得不到调用.
2.对于某个特定的线程,如果既安装了线程钩子又安装了系统钩子,则线程钩子先于系统钩子被调用.
实验:
键盘钩子(WH_KEYBOARD)
我写了个简单的对话框程序,部分代码如下:
1.先声明钩子HHOOK gHook = NULL;
2.键盘钩子函数:
LRESULT  CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
 MessageBox(AfxGetMainWnd()->GetSafeHwnd(), "Thread hook", "keyboard", MB_OK);
 return 0;
 //return CallNextHookEx(gHook, nCode, wParam, lParam);
}
3.安装钩子:
 DWORD nThreadid = GetCurrentThreadId();
 gHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, AfxGetApp()->m_hInstance, nThreadid);
 if(gHook == NULL)
 {
      AfxMessageBox("Install Keyboard Hook Failed", MB_OK);
 }
4.卸载钩子
BOOL ret = UnhookWindowsHookEx(gHook);
实验方法及结果如下:
1.先启动另一个程序,安装系统键盘钩子,再启动我的程序,安装局部键盘钩子,实验结果表明系统钩子对我的程序无效.
2.先启动我的程序,安装局部键盘钩子,再启动另一个程序,安装系统键盘钩子.在我的程序中系统键盘钩子无效.

posted on 2005-12-09 10:33 碧水蓝天 阅读(6864) 评论(12)  编辑 收藏

评论

# 不知如何检测系统中是否安装了键盘钩子,希望哪位告之 2005-12-09 11:07 碧水蓝天

rt

# re: 如何让你的程序逃避全局键盘钩子的监视 2005-12-09 13:18 HateMath

路过,记下了.

# re: 如何让你的程序逃避全局键盘钩子的监视 2005-12-09 14:15 nipcdll

我试过了,无论是先安装系统钩子还是先安装这个钩子,都没有发挥作用,不知道是什么原因?
能不能把你的测试工程发到下面的邮箱,谢谢!
it3wxg407@ustc.edu

# re: 如何让你的程序避开全局键盘钩子的监视 2005-12-09 14:45 碧水蓝天

安装我的钩子,对其他程序不会有影响,系统钩子还是可以钩住其他的程序的。你可以试一下安装系统钩子和这个钩子后,把键盘放在你的这个装了局部钩子的程序上,然后按键,可以看到系统钩子对他没反应了。

# re: 如何让你的程序避开全局键盘钩子的监视 2006-06-29 17:08 小商品

写的好

# re: 如何让你的程序避开全局键盘钩子的监视 2007-04-21 17:20 水晶臭虫

感谢楼主的文章!简单易行!因为键盘钩子还差点去研究微软的detours开发包试图改变系统API的调用过程,实在是太没有必要了呵呵幸得发现了您的文章没有让我浪费时间做一件不恰当的事情。。呵呵感谢!

# re: 如何让你的程序避开全局键盘钩子的监视 2007-08-01 13:49 yzdiyu

那么如果人家也装个局部的钩子呢,不是就在你的钩子前面了吗。而且你这样只可以避免键盘,如果人家用消息的钩子呢。你还可以result:=0吗。

# re: 如何让你的程序避开全局键盘钩子的监视 2007-09-14 14:49 eboymcy

有道理。
不过这个躲不过WH_DEBUG钩子的监视。
也躲不过WH_KEYBOARD_LL的监视!

# re: 如何让你的程序避开全局键盘钩子的监视 2007-09-14 14:56 eboymcy


最近因工作关系,也在研究防木马键盘记录。
有时间沟通以下。
我的msn:eboymcy@hotmail.com
mail:eboymcy@163.com

# re: 如何让你的程序避开全局键盘钩子的监视 2007-09-19 17:14 碧水蓝天

不好意思,我的msn上不了.
现在为了安全起见,密码输入用软键盘的很多.

# re: 如何让你的程序避开全局键盘钩子的监视 2007-10-23 20:25 swagger

请教大侠一下,我装了十几个系统(多数是深度简化版,还有上海政府原版和windows xp原版),除了win2000,用冰刃查了发现explorer.exe,iexplorer.exe等都有wh_keyboard, wh_mouse等钩子,其实几乎所有的程序都感染了这种钩子,请问这是木马行为,还是正常?用oem的是没有这样的问题的,还有在一部机上装win2000,用冰刃查到没有一个信息钩子(即为0),最近又装了vista, 除了只有iexplorer.exe带有钩子外,其它程序都没有. 请解释一下, 这个问题困扰我很久了,还有你的程序可否做成一个执行的供下载? 谢谢!

# re: 如何让你的程序避开全局键盘钩子的监视 2008-11-09 16:31 mapqi

kankan

标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]