Hook MessageBox

// HookMessage.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>


class MyHookClass {
public :
    MyHookClass()
    {
        m_pfnOld = nullptr;
        ZeroMemory(m_bNewBytes, 5);
        ZeroMemory(m_bOldBytes, 5);
    }
    ~MyHookClass()
    {
        UnHook();
    }
    /*
    *    Hook function
    *    @param szModuleName,Module name
    *    @param szFuncName ,function name
    *   @param pHookFunc , address of function
    *   @return
    */
    BOOL Hook(char* szModuleName,char* szFuncName,PROC pHookFunc)
    {
        BOOL bRet = FALSE;

        do
        {
             m_pfnOld = GetProcAddress(GetModuleHandleA(szModuleName),szFuncName);
            if (!m_pfnOld)
            {
                break;
            }
            

            DWORD dwNum = 0;
            ReadProcessMemory(GetCurrentProcess(), m_pfnOld, m_bOldBytes, 5, &dwNum);

            m_bNewBytes[0] = '\xe9';
            
            *(DWORD*)(m_bNewBytes + 1) = (DWORD)pHookFunc - (DWORD)m_pfnOld - 5;

            WriteProcessMemory(GetCurrentProcess(), m_pfnOld, m_bNewBytes, 5, &dwNum);
            bRet = true;

        } while (FALSE);
        return bRet;
    }
    void UnHook()
    {
        if (m_pfnOld != nullptr)
        {
            DWORD dwNum = 0;
            WriteProcessMemory(GetCurrentProcess(), m_pfnOld, m_bOldBytes, 5, &dwNum);
        }
    }

    bool ReHook()
    {
        BOOL bRet = false;
        if (m_pfnOld != nullptr)
        {
            DWORD dwNum = 0;

            WriteProcessMemory(GetCurrentProcess(), m_pfnOld, m_bNewBytes, 5, &dwNum);
            bRet = true;
        }
        return bRet;
    }
private:
    PROC m_pfnOld;
    BYTE m_bOldBytes[5];
    BYTE m_bNewBytes[5];
};

MyHookClass g_MsgHook;
int WINAPI MyMessageBox(_In_opt_ HWND hWnd, _In_opt_ LPCTSTR lpText, _In_opt_ LPCTSTR  lpCaption, _In_opt_ UINT uType)
{
    g_MsgHook.UnHook();
    MessageBoxW(hWnd,L"Hook Success",L"Hook",MB_OK);
    g_MsgHook.ReHook();
    return 0;
}
int main(int argc,char* argv[])
{
    // hook windows api
    MessageBoxW(NULL, L"context", L"test", MB_OK);
    char szModuleName[MAXBYTE] = {0};//"user32.dll";
    char szFuncName[MAXBYTE] = { 0 };// "MessageBoxW";
    strcpy_s(szModuleName, MAXBYTE, "user32.dll");
    strcpy_s(szFuncName, MAXBYTE, "MessageBoxW");
    g_MsgHook.Hook(szModuleName, szFuncName, (PROC)MyMessageBox);
    MessageBoxW(NULL, L"context", L"test", MB_OK);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蚂蚁_CrkRes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值