C++实现修改函数代码HOOK的封装方法


本文向大家介绍C++实现修改函数代码HOOK的封装方法,包括了C++实现修改函数代码HOOK的封装方法的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了C++实现修改函数代码HOOK的封装方法,分享给大家供大家参考。具体实现方法如下:

一、对外的接口如下:

1. 类初始化时对函数HOOK
2. 取消挂钩:
void UnHook();
3. 重新挂钩:
void ReHook();

在初始化时HOOK的代码:

*(DWORD*)(m_btNewBytes+1) = (DWORD)pfnHook;

8个字节的代码地址 0xB8, 0x00, 0x00,0x40,0x00,0xFF,0xE0,0x00  只要把第二位和第三位的数据改成函数的地址,调用原先的函数时就会调到自定义的函数执行.

二、实现方法:

.h头文件如下:

#ifndef  _ULHOOK_H__  

#define _ULHOOK_H__  

  

#include <Windows.h>  

#pragma once  

class CULHook  

{  

public:  

    CULHook(LPSTR lpszModName, LPSTR lpszFuncNme, PROC pfnHook);  

    ~CULHook(void);  

  

    //取消挂钩  

    void UnHook();  

    //重新挂钩  

    void ReHook();  

protected:  

    PROC m_pfnOrig;  

    BYTE m_btNewBytes[8];  

    BYTE m_btOldBytes[8];  

    HMODULE m_hModule;  

};  

  

#endif

.cpp源文件如下:

#include "ULHook.h"  

  

CULHook::CULHook(LPSTR lpszModName, LPSTR lpszFuncNme, PROC pfnHook)  

{  

    BYTE btNewBytes[] = {0xB8, 0x00, 0x00,0x40,0x00,0xFF,0xE0,0x00};  

    memcpy(m_btNewBytes, btNewBytes, 8);  

    *(DWORD*)(m_btNewBytes+1) = (DWORD)pfnHook;  

  

    m_hModule = ::LoadLibraryA(lpszModName);  

    if (NULL == m_hModule)  

    {  

        m_pfnOrig = NULL;  

        return;  

    }  

    m_pfnOrig = (PROC)::GetProcAddress(m_hModule, lpszFuncNme);  

    if (NULL != m_pfnOrig)  

    {  

        MEMORY_BASIC_INFORMATION mbi = {0};  

        DWORD dwOldProtect;  

        ::VirtualQuery(m_pfnOrig, &mbi, sizeof(mbi));  

        ::VirtualProtect(m_pfnOrig, 8, PAGE_READWRITE, &dwOldProtect);  

        memcpy(m_btOldBytes, m_pfnOrig, 8);  

        ::WriteProcessMemory(GetCurrentProcess(), (VOID*)m_pfnOrig, m_btNewBytes, 8, NULL);  

        ::VirtualProtect(m_pfnOrig, 8, dwOldProtect, NULL);  

    }  

}  

  

CULHook::~CULHook(void)  

{  

    UnHook();  

    if (m_hModule!=NULL)  

    {  

        ::FreeLibrary(m_hModule);  

    }  

}  

void CULHook::UnHook()  

{  

    if (m_pfnOrig != NULL)  

    {  

        MEMORY_BASIC_INFORMATION mbi = {0};  

        DWORD dwOldProtect;  

        ::VirtualQuery(m_pfnOrig, &mbi, sizeof(mbi));  

        ::VirtualProtect(m_pfnOrig, 8, PAGE_READWRITE, &dwOldProtect);  

        ::WriteProcessMemory(GetCurrentProcess(), (VOID*)m_pfnOrig, m_btOldBytes, 8, NULL);  

        ::VirtualProtect(m_pfnOrig, 8, dwOldProtect, NULL);  

    }  

}  

  

void CULHook::ReHook()  

{  

    if (m_pfnOrig != NULL)  

    {  

        MEMORY_BASIC_INFORMATION mbi = {0};  

        DWORD dwOldProtect;  

        ::VirtualQuery(m_pfnOrig, &mbi, sizeof(mbi));  

        ::VirtualProtect(m_pfnOrig, 8, PAGE_READWRITE, &dwOldProtect);  

        ::WriteProcessMemory(GetCurrentProcess(), (VOID*)m_pfnOrig, m_btNewBytes, 8, NULL);  

        ::VirtualProtect(m_pfnOrig, 8, dwOldProtect, NULL);  

    }  

}

希望本文所述对大家的C++程序设计有所帮助。