HOOK技术-满足我们程序的偷窥欲
在Windows中,虚拟内存技术使一个进程内的代码访问另一个进程内的代码变得不那么容易。当然,这个不容易带来了很强的健壮性。因为即使本进程由于内存改写错误,导致程序崩溃,但另一个进程依然相当安全。
今天讲的就是:打破进程的边界,让我们的代码到其它进程的老家去逛逛。
使用HOOK技术需要编写DLL,然后把DLL映射到别的进程的地址空间中。在DLL中,我们需要挂接钩子,以用来钩进程的消息,鼠标事件,键盘事件。
先来看一个挂接钩子的函数:
其中,iHook指定了钩子的种类,统计有13种:
WH_CALLWNDPROC 系统将消息发送到指定窗口之前的"钩子"
WH_CALLWNDPROCRET 消息已经在窗口中处理的"钩子"
WH_CBT 基于计算机培训的"钩子"
WH_DEBUG 差错"钩子"
WH_FOREGROUNDIDLE 前台空闲窗口"钩子"
WH_GETMESSAGE 接收消息投递的"钩子"
WH_JOURNALPLAYBACK 回放以前通过WH_JOURNALRECORD"钩子"记录的输入消息
WH_JOURNALRECORD 输入消息记录"钩子"
WH_KEYBOARD 键盘消息"钩子"
WH_MOUSE 鼠标消息"钩子"
WH_MSGFILTER 对话框、消息框、菜单或滚动条输入消息"钩子"
WH_SHELL 外壳"钩子"
WH_SYSMSGFILTER 系统消息"钩子"
参数lpfn指向钩子处理函数的指针。hMod标识了钩子处理函数所处模块的句柄。dwThreadId指定所需监视的线程Id,可以用GetCurrentThreadId()函数获得,如果该参数为0,则表示监视系统所有线程的钩子。
钩子安装完成后,如果被监视的行为发生,系统为调用钩子链表处的钩子处理函数进行处理。每一个钩子处理函数在进行相应的处理时都要考虑是否需要把事件传递给下一个钩子处理函数。如果要传递,就通过函数CallNestHookEx()来解决。尽管如此,在实际使用时还是强烈推荐无论是否需要事件传递而都在过程的最后调用一次CallNextHookEx( )函数,否则将会引起一些无法预知的系统行为或是系统锁定。
钩子使用完毕后,要记得释放钩子,释放钩子的函数如下:
BOOL UnhookWindowsHookEx(HHOOK hhk);
程序实例,待续。
今天讲的就是:打破进程的边界,让我们的代码到其它进程的老家去逛逛。
使用HOOK技术需要编写DLL,然后把DLL映射到别的进程的地址空间中。在DLL中,我们需要挂接钩子,以用来钩进程的消息,鼠标事件,键盘事件。
先来看一个挂接钩子的函数:
HHOOK SetWindowsHookEx(int idHook;
HOOKPROC lpfn;
HINSTANCE hMod;
DWORD dwThreadId);
HOOKPROC lpfn;
HINSTANCE hMod;
DWORD dwThreadId);
其中,iHook指定了钩子的种类,统计有13种:
WH_CALLWNDPROC 系统将消息发送到指定窗口之前的"钩子"
WH_CALLWNDPROCRET 消息已经在窗口中处理的"钩子"
WH_CBT 基于计算机培训的"钩子"
WH_DEBUG 差错"钩子"
WH_FOREGROUNDIDLE 前台空闲窗口"钩子"
WH_GETMESSAGE 接收消息投递的"钩子"
WH_JOURNALPLAYBACK 回放以前通过WH_JOURNALRECORD"钩子"记录的输入消息
WH_JOURNALRECORD 输入消息记录"钩子"
WH_KEYBOARD 键盘消息"钩子"
WH_MOUSE 鼠标消息"钩子"
WH_MSGFILTER 对话框、消息框、菜单或滚动条输入消息"钩子"
WH_SHELL 外壳"钩子"
WH_SYSMSGFILTER 系统消息"钩子"
参数lpfn指向钩子处理函数的指针。hMod标识了钩子处理函数所处模块的句柄。dwThreadId指定所需监视的线程Id,可以用GetCurrentThreadId()函数获得,如果该参数为0,则表示监视系统所有线程的钩子。
钩子安装完成后,如果被监视的行为发生,系统为调用钩子链表处的钩子处理函数进行处理。每一个钩子处理函数在进行相应的处理时都要考虑是否需要把事件传递给下一个钩子处理函数。如果要传递,就通过函数CallNestHookEx()来解决。尽管如此,在实际使用时还是强烈推荐无论是否需要事件传递而都在过程的最后调用一次CallNextHookEx( )函数,否则将会引起一些无法预知的系统行为或是系统锁定。
钩子使用完毕后,要记得释放钩子,释放钩子的函数如下:
BOOL UnhookWindowsHookEx(HHOOK hhk);
程序实例,待续。