国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++實現修改函數代碼HOOK的封裝方法

2020-05-23 14:20:19
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了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++程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新宁县| 石棉县| 和田市| 牡丹江市| 武清区| 渝北区| 专栏| 周宁县| 石嘴山市| 西平县| 晋宁县| 凤城市| 兰西县| 泾阳县| 华安县| 玉门市| 芜湖市| 肥乡县| 石嘴山市| 龙岩市| 岳阳县| 承德市| 资阳市| 清原| 贵州省| 方山县| 峨眉山市| 公主岭市| 桃源县| 韶山市| 阳朔县| 南和县| 花莲市| 安平县| 双桥区| 沛县| 安多县| 马鞍山市| 聂拉木县| 讷河市| 佳木斯市|