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

 更新时间:2014年10月20日 10:08:11   投稿:shichen2014  
这篇文章主要介绍了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++程序设计有所帮助。

相关文章

  • C++中sort函数的基础入门使用教程

    C++中sort函数的基础入门使用教程

    这篇文章主要给大家介绍了关于C++中sort函数的基础入门使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-12-12
  • C语言中判断素数(求素数)的思路与方法实例

    C语言中判断素数(求素数)的思路与方法实例

    计算机或者相关专业基本上大一新生开始学编程都会接触的一个问题就是判断质数,下面这篇文章主要给大家介绍了关于C语言中判断素数(求素数)的思路与方法,需要的朋友可以参考下
    2022-03-03
  • C语言中%c与%s的区别与划分详解

    C语言中%c与%s的区别与划分详解

    这篇文章主要介绍了C语言中%c与%s的区别与划分详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 详解C++ 共享数据保护机制

    详解C++ 共享数据保护机制

    这篇文章主要介绍了详解C++ 共享数据保护机制的相关资料,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-02-02
  • C语言软件iic虚拟总线中间层设计详解

    C语言软件iic虚拟总线中间层设计详解

    这篇文章主要为大家介绍了C语言软件iic虚拟总线中间层设计详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • C++生成不重复的随机整数

    C++生成不重复的随机整数

    这篇文章主要为大家详细介绍了C++生成不重复的随机整数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • C++11 并发指南之std::mutex详解

    C++11 并发指南之std::mutex详解

    这篇文章主要介绍了C++11 并发指南之std::mutex详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C++语言基础 this和static关键字

    C++语言基础 this和static关键字

    这篇文章主要介绍了C++语言基础 this和static关键字,需要的朋友可以参考下
    2020-01-01
  • C语言详细分析浮点数在内存中的储存

    C语言详细分析浮点数在内存中的储存

    我们在日常生活中和编程中都会用到小数,比如:3.1415926、29.9、1E10(科学计数法也是浮点型)。在C语言中的浮点型类型有:float,double,long double。那么浮点数在这些浮点型的内存之中又是如何储存的呢,这就是今天我们要分享的
    2022-06-06
  • C/C++ProtoBuf使用小结

    C/C++ProtoBuf使用小结

    ProtoBuf全称:protocol buffers,直译过来是:“协议缓冲区”,是一种与语言无关、与平台无关的可扩展机制,用于序列化结构化数据,这篇文章主要介绍了C/C++ProtoBuf使用,需要的朋友可以参考下
    2024-01-01

最新评论