vc安装hook

钩子的创建

钩子安装函数:
HHOOK SetWindowsHookEx(
  int idHook,        // hook type                      钩子的类型
  HOOKPROC lpfn,     // hook procedure                 钩子的过程函数
  HINSTANCE hMod,    // handle to application instance 动态链接库的句柄
  DWORD dwThreadId   // thread identifier              线程ID
);
第一个参数用来指定安装的钩子类型 如果你要屏蔽鼠标消息 指定WH_MOUSE 屏蔽案件消息 WH_KEYBOARD
第二个参数指向相应的钩子过程
第三个参数由第四个参数决定 如果你是要设置其他进程的线程的钩子 或是全局钩子的话 那么这里就是动态链接库的模块句柄,否则为空 要得到DLL的句柄可以 通过DllMain的第一个参数 或GetModuleHandle("Hook")得到
第四个参数指定要安装的HOOK的线程ID 0表示所有线程ID 得到本线程ID GetCurrentThreadId
返回值:如果调用成功 返回HHOOK句柄 否则返回NULL

钩子过程
返回1表示处理了操作系统将不会在将消息递下去给应用程序做响应
否则 应调用CallNextHookEx将消息给下一个在等待的钩子处理 并且将其作为返回值返回.
LRESULT CallNextHookEx(
  HHOOK hhk,      // handle to current hook
  int nCode,      // hook code passed to hook procedure
  WPARAM wParam,  // value passed to hook procedure
  LPARAM lParam   // value passed to hook procedure
);

动态链接库实现真正的共享
其实在某个进程 要对动态链接库的某个数据页面 进行写的操作时,在里面有种机制叫写入拷贝.
就是说  如果进程A想要对DLL中的某个数据1写时,首先DLL会新建一个数据2页面并对那个数据1进行复制.然后当进程A真正的要写进值时,写入的就是数据2.当进程B要读取时,读取的还是数据1,它也要写入时就另说.

为了解决上面那个问题.
1.首先建立节.
示例 如果要将HWND g_hWnd共享:
#pragma data_seg("MySec") //括号后内是节名 ,一般的都是 前面带了.的 我们可以自行加或不加
HWND g_hWnd=NULL;         //必须初始化
#pragma data_seg()

2.将节设置为共享的节
设置为共享节有两方法#pragma comment(linker,"/section:MySec,RWS")  //括号内的linker,"/section:当固定写法吧,最后的第三个参数RWS代表着READ WRITE SHARED
还有就是搞个模块文件
HOOK.DEF/
LIBRARY Hook
EXPORTS
SetHook  @2           
SEGMENTS
MySec READ WRITE SHARED
上面的@2表示将导出的函数 序号设为2

全局钩子的实现:
1.先写DLL文件 里面实现钩子过程 和 安装钩子
//HOOK.DLL/
#include <windows.h>

HHOOK g_hMouse=NULL;
HHOOK g_hKeyboard=NULL;

#pragma data_seg("MySec")
HWND g_hWnd=NULL;
#pragma data_seg()

//#pragma comment(linker,"/section:MySec,RWS")
/*HINSTANCE g_hInst;

BOOL WINAPI DllMain(
  HINSTANCE hinstDLL,  // handle to the DLL module
  DWORD fdwReason,     // reason for calling function
  LPVOID lpvReserved   // reserved
)
{
 g_hInst=hinstDLL;
}*/

LRESULT CALLBACK MouseProc(
  int nCode,      // hook code
  WPARAM wParam,  // message identifier
  LPARAM lParam   // mouse coordinates
)
{
 return 1;
}

LRESULT CALLBACK KeyboardProc(
  int code,       // hook code
  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information
)
{
 if(VK_F2==wParam)
 {
  SendMessage(g_hWnd,WM_CLOSE,0,0);
  UnhookWindowsHookEx(g_hMouse);
  UnhookWindowsHookEx(g_hKeyboard);
 }
 return 1;
}

void SetHook(HWND hwnd)
{
 g_hWnd=hwnd;
 g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);
 g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);
}
//HOOK.DEF///
LIBRARY Hook
EXPORTS
SetHook  @2
SEGMENTS
MySec READ WRITE SHARED

2.在客户端中调用就是了.不多写加载DLL了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值