Windows 钩子

来源:互联网 发布:酸涩 知乎 编辑:程序博客网 时间:2024/05/28 15:46
Ⅰ. Windows 钩子
示例程序:HookSpy 和 HookInjEx
Windows 钩子的主要作用就是监视某个线程的消息流动。一般可分为:
1. 局部钩子,只监视你自己进程中某个线程的消息流动。
2. 远程钩子,又可以分为:
a. 特定线程的,监视别的进程中某个线程的消息;
b. 系统级的,监视整个系统中正在运行的所有线程的消息。
如果被挂钩(监视)的线程属于别的进程(情况2a 和2b),你的钩子过程(hook
procedure)必须放在一个动态连接库(DLL)中。系统把这包含了钩子过程的
DLL 映射到被挂钩的线程的地址空间。Windows 会映射整个 DLL 而不仅仅是你的
钩子过程。这就是为什么windows 钩子可以用来向其他线程的地址空间注入代码
的原因了。
在这里我不想深入讨论钩子的问题(请看MSDN 中对SetWindowsHookEx 的说明),
让我再告诉你两个文档中找不到的诀窍,可能会有用:
1. 当SetWindowHookEx 调用成功后,系统会自动映射这个DLL 到被挂钩的线程,
但并不是立即映射。因为所有的Windows 钩子都是基于消息的,直到一个适当的
事件发生后这个DLL 才被映射。比如:
如果你安装了一个监视所有未排队的( nonqueued ) 的消息的钩子
(WH_CALLWNDPROC),只有一个消息发送到被挂钩线程(的某个窗口)后这个DLL
才被映射。也就是说, 如果在消息发送到被挂钩线程之前调用了
UnhookWindowsHookEx 那么这个DLL 就永远不会被映射到该线程( 虽然
SetWindowsHookEx 调用成功了)。为了强制映射,可以在调用SetWindowsHookEx
后立即发送一个适当的消息到那个线程。
同理,调用UnhookWindowsHookEx 之后,只有特定的事件发生后DLL 才真正地从
被挂钩线程卸载。
2. 当你安装了钩子后,系统的性能会受到影响(特别是系统级的钩子)。然而
原创粉丝点击