首页
社区
课程
招聘
[求助]Hook的疑问:(:
发表于: 2007-11-11 19:03 9428

[求助]Hook的疑问:(:

2007-11-11 19:03
9428
比如说我想在CS里面点F2键,激活我的钩子,在当前进程里下一个全局钩子,钩子类型就是屏蔽鼠标左键单击。
注意:
  1,比如我点了F2,这个钩子的范围就在当前进程!!如果说我点了Tab+Alt,切换出来,不影响其他进程,不屏蔽鼠标左键。也就是说不是对所有线成下钩子。
  2.这个钩子需要Dll吗?如果需要,说一说具体的步骤,特别是重要的步骤。
                                                                                    
        

                                                                                                                                                                                          希望大家踊跃发言。
                                                                                                                                                                                                                谢谢。

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
没人看。我闷。
2007-11-11 19:07
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
f2用lowlevelkeyboardhook
那个监视进程切换用RegisterShellHookWindow
2007-11-11 19:18
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
f2是什么意思?

lowlevelkeyboardhook这个是低级的键盘钩子,RegisterShellHookWindow这个什么用?
貌视不需要dll么?
2007-11-11 19:24
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
f2键。。。。

RegisterShellHookWindow注册一个wh_shell钩子(严格来说不算)

这样做不需要dll可以监视到当前窗口的切换。

然后发生窗口切换后就GetForegroundWindow 判断到底还屏蔽鼠标与否
2007-11-11 20:57
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
我觉的用DLL就是要用全局钩子了,如果不用的话。
只能算是局部钩子。
2007-11-12 08:47
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
#include "windows.h"
#include "winuser.h"
HHOOK M_hwnd=NULL;
HHOOK K_hwnd=NULL;
HWND G_hwnd=NULL;

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
)
{
	switch(wParam)
	{
	case  VK_F2:
		      M_hwnd=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("CSHOOK"),0);
		      break;
	case VK_F4:
	//	MessageBox(0, "It worked!", 
     //            "This messagebox brought to you using J/Direct", 0);
			  UnhookWindowsHookEx(M_hwnd);
			  
			  //return 0;
			  break;
            
  }
   return CallNextHookEx(K_hwnd,code,wParam,lParam);
}
void SetHook(HWND hwnd)
{
	G_hwnd=hwnd;
    K_hwnd=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("CSHOOK"),0);
}

这是一个dll的代码
我想在键盘钩子里被相应鼠标钩子的加载与卸载。
我点了f2后可以加载。
但是我点了f4确没有被卸载。仍然不好使~
只有来到这里求大虾帮忙。
2007-11-12 11:25
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
代码到底哪里错了呢?
2007-11-12 11:26
0
雪    币: 709
活跃值: (2590)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
9
#pragma data_seg ("Shared")
...
#pragma data_seg ()

#pragma comment (linker,"/section:Shared,rws")


DllMain也没有。。。
2007-11-12 11:37
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
10
你没有判断按键的状态,
按下F2键,SetWindowsHookEx执行两次,而第二次是失败的
所以F2后的M_hwnd=NULL
所以关闭的时候就相当于UnhookWindowsHookEx(NULL);
通过lParam的最高位来判断按键状态
Specifies the transition state. The value is 0 if the key is being pressed and 1 if it is being released.

还有就是3楼所提到的问题
另外,把m_hwnd放到共享段
2007-11-12 13:02
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
11
这里先提醒一下,请不要重复发贴!
2007-11-12 13:14
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
LRESULT CALLBACK KeyboardProc(
  int code,       // hook code
  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information
)
{
	if (code = HC_ACTION )
	{
	switch(wParam)
	{
	case  VK_F2:
	//		MessageBox(0, "It worked!", 
    //             "aa", 0);
		   if((lParam & 0xA0000000)==1)
		{
		      M_hwnd=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("CSHOOK"),0);
		      break;
		}
	case VK_F4:
	//	MessageBox(0, "It worked!", 
    //             "This messagebox brought to you using J/Direct", 0);
			  
			  UnHook();
			  //return 0;
			  break;
            
	}
	}
   return CallNextHookEx(K_hwnd,code,wParam,lParam);
}

这是我的代码。怎么改呢?
郁闷死我 。
请斑竹帮忙~!
2007-11-12 15:24
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
斑竹大大。炉子。帮我修改一下吧。很迷惑我。
2007-11-12 15:27
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
14
只处理键盘按下情况
if ( lParam > 0 )
{
   switch ( wParam )
   {
      //……
   }
}
2007-11-12 23:24
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
15
谢谢你,我已经搞定了。
为了其他人也犯此错误。我写上代码
LRESULT CALLBACK KeyboardProc(
  int code,       // hook code
  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information
)
{
	if(code == HC_ACTION)
	{
	    switch (wParam)
	{
	   case VK_F2:
		   {
		if ((lParam & 0xC0000000 )==0)
		{
			M_hwnd=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("CSHOOK"),0);
        	MessageBox(NULL,"aaaa","aaaa",MB_OK);
		}
		break;
		case VK_F4:
			{
		if ((lParam & 0xC0000000 )==0)
		{
		UnhookWindowsHookEx(M_hwnd);
		MessageBox(NULL,"aaaa","aaaa",MB_OK);
		
		}
		break;
			}
		   }
		}
	}


另外在Release模式下编译主程序。_declspec(dllimport) void SetHook();报错
错误如下:
CSLOADDlg.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) void __cdecl SetHook(void)" (__imp_?SetHook@@YAXXZ)
Release/CSLOAD.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.
我不知道是怎么回事。请大大帮助。
2007-11-13 10:56
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
16
RegisterShellHookWindow'需要引入什么头文件?
2007-11-13 17:43
0
雪    币: 709
活跃值: (2590)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
17
这个需要别人回答你吗?

那MSDN是干什么的?

Declared in Winuser.h, include Windows.h
2007-11-13 20:33
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18
typedef BOOL (WINAPI *pRegSHW)(HWND);

HMODULE hUser32dll;
hUser32dll=LoadLibrary(L"user32.dll");
if(hUser32dll)
{
   pRegSHW= (pRegSHW)GetProcAddress(hUser32dll,"RegisterShellHookWindow"); 
}
2007-11-16 18:00
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
19
那这个又是做什么的?弄的象我不对似的.
2007-11-16 18:01
0
雪    币: 709
活跃值: (2590)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
20
这个是定义函数原型后,自己在user32.dll中取所要函数的地址。


用于动态获得函数地址~~~
2007-11-16 19:43
0
游客
登录 | 注册 方可回帖
返回