Windows中断技术之HOOK钩子编程

什么是HOOk

HOOk是一种中断技术,可以改变拦截Windows下的消息,HOOK程序就可以在消息到达目标窗口之前将其捕获,从而得到对消息的控制权,进而可以对该消息进行处理或修改,加入我们所需的功能

image.png

API
SetWindowsHookEx设置钩子
UnHookWindowHookEx卸载钩子

注意:

  • 先钩的后调用

  • 32位的钩子只能钩32位的程序

  • 键盘、鼠标信息不管什么都会都会钩住,但是不同位数的会发给hook的程序处理

  • 钩全局使用时才会注入dll

hook分类

  • 线程钩子监视指定线程的事件消息。

  • 系统钩子监视系统中的所有线程的事件消息。因为系统钩子会影响系统中所有的应用程序,所以钩子函数必须放在独立的动态链接库(DLL)中。这是系统钩子和线程钩子很大的不同之处。

例子

本进程hook鼠标信息

HHOOK g_hCurHook ;
LRESULT CALLBACK MouseProc(
    int nCode,      // hook code
    WPARAM wParam,  // message identifier
    LPARAM lParam   // mouse coordinates
)
{
    if (nCode < 0)
        return CallNextHookEx(g_hCurHook, nCode, wParam, lParam);
 if(wParam==WM_MOUSEMOVE)
 {
     PMOUSEHOOKSTRUCT pMhs = (PMOUSEHOOKSTRUCT)lParam;
     qDebug() << "WM_MOUSEMOVE x = " << pMhs->pt.x << "y =" << pMhs->pt.y ;
 }
 return CallNextHookEx(g_hCurHook, nCode, wParam, lParam);
}
void QtGuiApplication1::slot1_loadHook()
{
    g_hCurHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseProc, NULL, GetCurrentThreadId());
}
void QtGuiApplication1::slot1_UnHook()
{
    UnhookWindowsHookEx(g_hCurHook);
}


Hook全局

全局钩子又称为系统钩子,在windows下所有进程都有效
一般来说实现全局要在dll中实现(将线程号改为0)

hook全局WM_COMMAND命令 dll代码

HHOOK g_hook;
LRESULT OldWindowProc;
HMODULE g_hondle;
LRESULT CALLBACK CallWndProc(
    int nCode,      // hook code
    WPARAM wParam,  // current-process flag
    LPARAM lParam   // message data
    )
{
    if (nCode<0)
    {
        return  CallNextHookEx(g_hook,nCode,wParam,lParam);
    }
    PCWPSTRUCT cs = (PCWPSTRUCT)lParam;
    if (cs->message == WM_COMMAND)
    {
        OutputDebugStringA("WM_COMMANDhook");
    }
    return  CallNextHookEx(g_hook, nCode, wParam, lParam);
}
extern "C" __declspec(dllexport) void MySetHook()
{
    g_hook = SetWindowsHookEx(
        WH_CALLWNDPROC,
        CallWndProc,
        g_hondle,
        0);
}
extern "C" __declspec(dllexport) void MyUnHook()
{
    UnhookWindowsHookEx(g_hook);
}
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
        g_hondle = hModule;
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

使用dll的cpp文件

#pragma comment(lib,"hookdll.lib")
extern "C" {_declspec(dllimport) void MySetHook(); }
extern "C" {_declspec(dllimport)  void MyUnHook(); }


转载请说明出处
草堂教程网 » Windows中断技术之HOOK钩子编程

发表评论

欢迎 访客 发表评论

一个纯粹的精品教程收录分享站点

查看演示 官网购买