• mfc HackerTools全局钩子


    钩子英文名叫Hook,是一种截获windows系统中某应用程序或者所有进程的消息的一种技术。

    如在键盘中按下一键,操作系统将收到键按下消息,把消息放入消息队列,然后消息队列对消息进行派发,发给相应的应用程序,经过应用程序处理后发给操作系统,操作系统再调用相应的应用程序的创建的窗口过程。

    SetWindowsHookEx安装一个应用程序定义的钩子过程,并把创建的钩子过程放在钩子链中,可以安装多个钩子,多个钩子就形成了钩子链,最后安装的钩子总是在最前面。

    LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);形参含义并不是都一样的,不同钩子过程形参表示的意义不一样。

    BOOL UnhookWindowsHookEx(HHOOK hhk);此API的功能是把SetWindowsHookEx创建的钩子从钩子链中移除。形参是SetWindowsHookEx返回的钩子句柄。

    全局钩子必须在DLL上实现,钩子过程不能在本进程代码中实现,所以先得写一个DLL。

    #include "stdafx.h"
    
    extern HMODULE g_hDllMoudle;    //dll的句柄
    //共享内存
    #pragma data_seg("mydata")    //创建一个名为mydata的数据段
        HHOOK g_hHook = NULL;
    #pragma data_seg()
    #pragma comment(linker,"/SECTION:mydata,RWS")  //把mydata数据段设置为可读可写可共享
    
    
    
    
    extern "C" _declspec(dllexport)
    //钩子回调函数
    LRESULT GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
    {
        MessageBoxA(0, "弹窗", "你中毒了", 0);
        return CallNextHookEx(g_hHook, code, wParam, lParam);
    }
    
    extern "C" _declspec(dllexport)
    //设置全局钩子
    BOOL SetGlobalHook()
    {
        g_hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)GetMsgProc, g_hDllMoudle, 0);
        if (g_hHook==NULL)
        {
            return FALSE;
        }
        return TRUE;
    }
    
    extern "C" _declspec(dllexport)
    //卸载全局钩子
    BOOL UnSetGlobalHook() 
    {
        if (g_hHook) 
        {
            UnhookWindowsHookEx(g_hHook);
        }
        return TRUE;
    }
    调用DLL中的钩子
    void CInject::SetGlobalHook()
    {
        //定义函数指针和函数指针变量
        typedef BOOL(*typedef_SetGlobalHook)();
        typedef_SetGlobalHook fnSetGlobalHook = NULL;
        //获取DLL加载基址
        m_hDll = LoadLibrary(m_Edit);
        if (m_hDll)
        {
            m_TipMsg += L"DLL加载成功
    ";
        }
        else
        {
            m_TipMsg += L"DLL加载失败
    ";
        }
    
        //获取函数地址 给函数指针变量赋值
        fnSetGlobalHook = (typedef_SetGlobalHook)GetProcAddress(m_hDll, "SetGlobalHook");
        if (fnSetGlobalHook)
        {
            m_TipMsg += L"加载函数地址成功
    ";
        }
        else
        {
            m_TipMsg += L"加载函数地址失败
    ";
        }
        //设置全局钩子
        BOOL bRet = fnSetGlobalHook();
    
            
        if (bRet)
        {
            m_TipMsg += L"设置全局钩子成功 开始无限弹框
    ";
        }
        else
        {
            m_TipMsg += L"设置全局钩子失败
    ";
        }
    
        UpdateData(FALSE);
    
    }
  • 相关阅读:
    SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤
    svn branch and merge(svn切换分支和合并)详解
    WPF 后台任务 等待动画 样例 && C# BackgroundWorker 详解
    WPF CheckBox 滑块 样式 开关
    WPF自适应可关闭的TabControl 类似浏览器的标签页
    Bootstrap WPF Style(二)--Glyphicons 字体图标
    WPF 中的 Pack URI地(资源文件加载)
    Bootstrap WPF Style,Bootstrap风格的WPF样式
    tomcat修改server.xml的虚拟目录,启动eclipse后清空
    js修改css属性值
  • 原文地址:https://www.cnblogs.com/zebra-bin/p/13201622.html
Copyright © 2020-2023  润新知