首页
社区
课程
招聘
[求助]我的消息钩子为什么拦截不了消息
发表于: 2018-4-18 15:07 3710

[求助]我的消息钩子为什么拦截不了消息

2018-4-18 15:07
3710

我在一个dll里面写了如下代码,再用另外一个进程LoadLibrary,但是却拦截不了键盘消息,下断点发现set钩子函数没问题,但是跳不到要执行的函数那里(在xp环境下做的)

插入代码
```#include <windows.h>
#include <stdio.h>
HHOOK g_hHook = NULL; //全局保存键盘钩子句柄,取消钩子的时候用


void OutputDbgInfo(char *format,int param)
{
    char *str;
    sprintf(str,format,param);

    OutputDebugString(str);
}

LRESULT CALLBACK HookKeyboardMsg(int code,WPARAM wParam,LPARAM lParam)
{
    LRESULT lResult = 1;

    __try
    {
        if(wParam == VK_F1)
        {
            MessageBox(NULL,"加速已开启","tip",MB_OK);

            return lResult;
        }

        lResult = CallNextHookEx(g_hHook,code,wParam,lParam);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        OutputDbgInfo("[-] HookKeyboardMsg Exception,code:%d\n",GetLastError());

        return -1;
    }

    return lResult;
}

BOOL HookKeyboard(DWORD dwThread)
{
    BOOL bSuccess = TRUE;
    HHOOK hhook;

    __try
    {
        hhook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookKeyboardMsg,NULL,dwThread);

        if(hhook == NULL)
        {
            OutputDbgInfo("[-] SetWindowsHookEx error,code:%d\n",GetLastError());

            bSuccess = FALSE;
        }

        g_hHook = hhook;
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        OutputDbgInfo("[-] SetWindowsHookEx Exception,code:%d\n",GetLastError());

        return FALSE;
    }

    return bSuccess;
}

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            HookKeyboard(::GetCurrentThreadId());
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 7695
活跃值: (1544)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
2
有没有大佬,指点一下
2018-4-19 14:24
0
雪    币: 704
活跃值: (3360)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
3
你是要拦截调用LoadLibrary的这个线程的按键,还是全局按键?你设置钩子的函数只能钩住当前线程。
2018-4-19 14:50
0
雪    币: 7695
活跃值: (1544)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
4
yeyeshun 你是要拦截调用LoadLibrary的这个线程的按键,还是全局按键?你设置钩子的函数只能钩住当前线程。
调用LoadLibrary的
2018-4-19 15:44
0
雪    币: 704
活跃值: (3360)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
5
那我就不清楚了
2018-4-19 17:10
0
雪    币: 7695
活跃值: (1544)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
6
yeyeshun 那我就不清楚了
。。。那全局的怎么写,我看别人都用的WH_KEYBOARD_LL,我用这个就提示没有定义,是要包含什么头文件吗
2018-4-19 17:13
0
雪    币: 704
活跃值: (3360)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
7
WH_KEYBOARD_LL要求_WIN32_WINNT  >=  0x0400,就是要求目标系统版本在Windows  2000  Professional  以上。你可能vs版本低了。
全局的话,建议看一下MSDN。大概就是第三个参数传递HookKeyboardMsg所在模块的基址,就是你的dll的基址。第四个参数的线程ID传递0。
WH_KEYBOARD_LL只能全局不能局部线程。
2018-4-19 18:00
0
雪    币: 190
活跃值: (84)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
SetWindowsHookEx  的参数  dwThreadId  传  0
2018-4-19 23:34
0
雪    币: 7695
活跃值: (1544)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
9
leeqwind SetWindowsHookEx 的参数 dwThreadId 传 0
没什么用
2018-4-20 09:29
0
游客
登录 | 注册 方可回帖
返回
//