手机
当前位置:查字典教程网 >编程开发 >C语言 >C++实现修改函数代码HOOK的封装方法
C++实现修改函数代码HOOK的封装方法
摘要:本文实例讲述了C++实现修改函数代码HOOK的封装方法,分享给大家供大家参考。具体实现方法如下:一、对外的接口如下:1.类初始化时对函数HO...

本文实例讲述了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++实现修改函数代码HOOK的封装方法】相关文章:

C++中函数的默认参数详细解析

C++获取zip文件列表方法

用C实现PHP扩展 Fetch_Url 类数据抓取的方法

C++函数中return语句的使用方法

判断一个数是不是素数的方法

c++实现strcat字符串连接库函数的方法详解

解析使用C++编写无错代码的方法技巧

在c和c++中实现函数回调

C++函数重载的深入解析

用C++实现单向循环链表的解决方法

精品推荐
分类导航