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

2020-01-06 13:03:55王冬梅
易采站长站为您分析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);