首页
社区
课程
招聘
未解决 [求助]关于全局hook键盘钩子后出现的一个问题
发表于: 2019-3-19 08:15 3646

未解决 [求助]关于全局hook键盘钩子后出现的一个问题

2019-3-19 08:15
3646
#include "stdafx.h"

#define DEF_PROCESS_NAME "notepad.exe"
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);


HINSTANCE g_Hinstance = NULL;
HHOOK g_hHook = NULL;
HWND g_hWnd = NULL;

BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
		g_Hinstance = hModule;
		MessageBoxA(NULL, "加载成功", "加载成功", MB_OK);
		break;
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

#ifdef __cplusplus
extern"C" {
#endif
	__declspec(dllexport) void HookStart()
	{
		g_hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_Hinstance, 0);
	}
	__declspec(dllexport) void HookStop()
	{
		if (g_hHook)
		{
			UnhookWindowsHookEx(g_hHook);
			g_hHook = NULL;
		}
	}
#ifdef __cplusplus
}
#endif 

LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
	char szPath[MAX_PATH] = { 0 };
	char *p = NULL;

	if (nCode >= 0)
	{
		if (!(lParam & 0x8000000)) 
		{
			GetModuleFileNameA(NULL, szPath, MAX_PATH);
			
			p = strrchr(szPath, '\\');
		
			if (!_stricmp(p + 1, DEF_PROCESS_NAME))
			{
				return 1;
			}

		}
	}
	return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
最近在学逆向 看书看到了HOOK的部分照着书上代码编译了一下发现除了想要注入的程序以外其他程序一旦有键盘消息就会卡死 不知是怎么回事 代码如上

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2019-3-19 08:16 被Kazusa编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 635
活跃值: (1021)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
你是不是把32位的dll注到64位进程去了
2019-3-19 09:27
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
return 1; 修改为 return CallNextHookEx(g_hHook, nCode, wParam, lParam);
2019-3-19 17:30
0
雪    币: 203
活跃值: (1204)
能力值: ( LV9,RANK:195 )
在线值:
发帖
回帖
粉丝
4
楼上+1
API的问题,要仔细看MSDN,那玩意是高度缩略的,每一句都要看。
2019-3-19 17:47
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
palkiver 楼上+1 API的问题,要仔细看MSDN,那玩意是高度缩略的,每一句都要看。
感觉跟这个没有关系吧?返回1只是阻止其他hook收到消息,msdn上也说是可以的
2019-3-20 02:44
0
雪    币: 177
活跃值: (345)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Justgoon 你是不是把32位的dll注到64位进程去了
注入用的控制台程序是32位的 一样会卡死。。
2019-3-20 04:33
0
雪    币: 177
活跃值: (345)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
playgame return 1; 修改为 return CallNextHookEx(g_hHook, nCode, wParam, lParam);
返回1是为了拦截消息 在想要被注入的记事本程序里是正常拦截的 但其他不需要被注入的程序里有键盘消息就会卡住。。
2019-3-20 04:34
0
雪    币: 203
活跃值: (1204)
能力值: ( LV9,RANK:195 )
在线值:
发帖
回帖
粉丝
9
yuchengton 感觉跟这个没有关系吧?返回1只是阻止其他hook收到消息,msdn上也说是可以的


说了多少遍仔细看。
If code is greater than or equal to zero, and the hook procedure did not process the message, it is highly recommended that you call CallNextHookEx and return the value it returns; otherwise, other applications that have installed WH_KEYBOARD hooks will not receive hook notifications and may behave incorrectly as a result.

may behave incorrectly as a result.
微软说的很清楚了,发生意外我不负责,你自己的问题。
2019-3-20 15:07
0
雪    币: 203
活跃值: (1204)
能力值: ( LV9,RANK:195 )
在线值:
发帖
回帖
粉丝
10
Kazusa 返回1是为了拦截消息 在想要被注入的记事本程序里是正常拦截的 但其他不需要被注入的程序里有键盘消息就会卡住。。
说了多少遍仔细看。
If code is greater than or equal to zero, and the hook procedure did not process the message, it is highly recommended that you call CallNextHookEx and return the value it returns; otherwise, other applications that have installed WH_KEYBOARD hooks will not receive hook notifications and may behave incorrectly as a result.

may behave incorrectly as a result.
微软说的很清楚了,发生意外我不负责,你自己的问题。
2019-3-20 15:08
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
你好,我也遇到了这样的问题,我发现,这应该是程序位数不匹配的问题,如果你的钩子是64位的,你往32位的程序(非拦截程序)里输入时,会卡死,往64位程序里输入时,则没有问题。我是编译的64位,而win10的程序大部分是32位,所以我出现这个问题,
2020-10-7 20:14
0
游客
登录 | 注册 方可回帖
返回
//