setwindowshookex 在win7下设立全局钩子,求解决,顶者有分

setwindowshookex 在win7下设置全局钩子,求解决,顶者有分。
本帖最后由 lin98666lin 于 2014-08-08 17:02:36 编辑
准备做远程协助功能,下载了realvnc的源码,其中有 wm_hooks.dll,该处的源码 使用了全局hook,但是并没有效果。

将主要代码发布进来:
1.全局宏小结
#pragma data_seg(".WM_Hooks_Shared")
DWORD hook_owner = 0;
DWORD hook_target = 0;
HHOOK hook_CallWndProc = 0;
HHOOK hook_CallWndProcRet = 0;
HHOOK hook_GetMessage = 0;
HHOOK hook_DialogMessage = 0;
BOOL enable_cursor_shape = FALSE;
HCURSOR cursor = 0;
#ifdef _DEBUG_1
UINT diagnostic_min=1;
UINT diagnostic_max=0;
#endif
#pragma data_seg()


2.挂载钩子函数
hook_GetMessage = SetWindowsHookEx(WH_GETMESSAGE, HookGetMessage, dll_instance, 0);


3.钩子函数处理

LRESULT CALLBACK HookGetMessage(int nCode, WPARAM wParam, LPARAM lParam)
{

//***************************************************************************//

MSG* pMsg = (MSG*) lParam;
  if(pMsg->message==WM_PAINT||pMsg->message==WM_ERASEBKGND||pMsg->message==WM_NCPAINT)
  {
  pMsg = NULL;
  }
//***************************************************************************//

  if (nCode == HC_ACTION)
  {
    if (wParam & PM_REMOVE) 
{
      MSG* msg = (MSG*) lParam;
      ProcessWindowMessage(msg->message, msg->hwnd, msg->wParam, msg->lParam);
    }
  }
  return CallNextHookEx(hook_GetMessage, nCode, wParam, lParam);
}





上面双星线中间的代码为我加的代码,想看下 是否拦截了其他界面的wm_paint消息,结果让我失望啊。在 pMsg = NULL;的断点进不去,只有自己窗口激活的时候才能进去。事实证明 在win7下 全局钩子设置不成功,最后只挂在自己的进程中了。

关于这个问题,是否有人遇到过,通过什么方法可以解决。


我又陆续下载了几个全局钩子的例子,找了一些资料,都是用这个方法的,但是在win7上就是没效果的,只能截获当前进程的

------解决方案--------------------
没用过这个一起学习下!setwindowshookex 在win7下设立全局钩子,求解决,顶者有分
------解决方案--------------------
hook_GetMessage = SetWindowsHookEx(WH_GETMESSAGE, HookGetMessage, dll_instance, 0); 

这里不成功? 
下个断点看看, 返回正常不.

不成功就提升软件的权限, 提升权限的代码网上多的是
------解决方案--------------------
以管理员身份运行
以XP兼容模式运行
------解决方案--------------------
请先将调试器attach到其他process后再设断点。
------解决方案--------------------
勾子本来也只能挂在自己的进程里啊!
1 hook_GetMessage = SetWindowsHookEx(WH_GETMESSAGE, HookGetMessage, dll_instance, 0); 
dll_instance这个参数就是进程的句柄,你没有办法得到其它进程的句柄。

如果把你的程序挂到其它进程,你可以把你的程序写在一个dll中,再用一些后门的办法让进程把你的dll启动。如LoadLibrary这样存在漏洞的api。这样你就能得到那个程序的instance了。