关于局部键盘钩子和全局键盘钩子哪个先调用

发布时间:2018年1月27日 作者:未知 查看次数:1129

有篇文章《如何让你的程序避开全局键盘钩子的监视》网上很多,说是在程序中安装局部键盘钩子可以避开全局键盘钩子的监视,我有点怀疑。经测试,这样无论部键盘钩子是先启动还是后启动,都是无效的,都会是全局键盘钩子先执行。我也想这想法是好的,但局部的想控制全局的?曾经看过著名的CIH病毒代码,那代码的钩子,无论你的钩子(系统的,局部的它还看不起,当然不是指键盘钩子)是先是后挂载,它都会保持它自身的钩子在最前(有新钩子挂载,它会先卸载自身钩子,再重新挂载)。


===============================

全文如下:

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

http://blog.okbase.net/BlueSky/archive/3839.html

一直以来有个疑问,就是如果别人在你的电脑上安装了键盘钩子来监视你的键盘按键动作,我的程序怎么才能避开这些全局键盘钩子(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.先启动我的程序,安装局部键盘钩子,再启动另一个程序,安装系统键盘钩子.在我的程序中系统键盘钩子无效.




版权所有!www.sieye.cn
E.Mail:sieye@sohu.com QQ:66697110