《VC++深入详解》读书笔记-HOOK

来源:互联网 发布:淘宝能刷心悦会员 编辑:程序博客网 时间:2024/05/21 22:27

1.进程内钩子

LRESULT CALLBACK KeyboardProc( int code,WPARAM wParam, LPARAM lParam )

{

       if(VK_SPACE== wParam )

           return 1;

   else

              returnCallNextHookEx( g_hKeyboard,code,wParam, lParam );

}

        参数 wParam 是产生当前按键消息的虚拟代码,这是Windows 定义的与设备无关。Windows定义了一些虚拟代码来表示按键的脉冲信号,由键盘设备驱动程序负责解释。 空格键的虚拟代码是  VK_SPACE ,回车键代码是VK_RETURN。如果wParam是空格键虚拟代码,则返回1,表示已对空格键进行了处理;否则将按键消息传递给下一个钩子过程,如果没有下一个钩子过程了,消息将最终传递到程序窗口。CallNextHookEx第一个参数是当前钩子过程的句柄。


2.全局钩子

        安装钩子过程的代码必须放到动态链接库实现。SetWindowsHookEx函数第四个参数设置为0,第三个参数要求指定安装钩子过程所在的DLL模块的句柄。

获得这一句柄有两种方式。一种是为DLL程序提供一个DllMain函数,当第一次加载DLL时,系统会调用这个函数,并传递当前DLL模块的句柄。因此可在HookDll这一DLL中提供一个动态链接库入口函数:DllMain,并定义一个全局实例变量:g_hInst,然后在DllMain函数中保存系统传递过来的DLL模块句柄。

另一种方式,调用GetModuleHandle函数来得到指定的DLL模块句柄。

HMOUDLE GetModuleHandle ( LPCTSTRlpModuleName );

       参数是指向一个以NULL为终止符的字符串,该字符串指定了想要获取其模块句柄的模块名称,可以是一个.exe文件,也可以是一个.dll文件。

3.创建共享节

#pragma data_seg(“MySec”)

HWND g_hWnd=NULL;

#pragma data_seg()

 

#pragma comment(linker,”/section:MySec,RWS”)

 

在Hook.def文件中

LIBRARY HookDll

EXPORTS

SetHook   @2

SEGMENTS

MySec READ WRITE SHARED


原创粉丝点击