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

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

C++實(shí)現(xiàn)修改函數(shù)代碼HOOK的封裝方法

2020-01-26 15:13:33
字體:
供稿:網(wǎng)友

本文實(shí)例講述了C++實(shí)現(xiàn)修改函數(shù)代碼HOOK的封裝方法,分享給大家供大家參考。具體實(shí)現(xiàn)方法如下:

一、對外的接口如下:

1. 類初始化時(shí)對函數(shù)HOOK
2. 取消掛鉤:
void UnHook();
3. 重新掛鉤:
void ReHook();

在初始化時(shí)HOOK的代碼:

復(fù)制代碼 代碼如下:
*(DWORD*)(m_btNewBytes+1) = (DWORD)pfnHook;

8個(gè)字節(jié)的代碼地址 0xB8, 0x00, 0x00,0x40,0x00,0xFF,0xE0,0x00  只要把第二位和第三位的數(shù)據(jù)改成函數(shù)的地址,調(diào)用原先的函數(shù)時(shí)就會調(diào)到自定義的函數(shù)執(zhí)行.

二、實(shí)現(xiàn)方法:

.h頭文件如下:

復(fù)制代碼 代碼如下:
#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源文件如下:

復(fù)制代碼 代碼如下:
#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++程序設(shè)計(jì)有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 紫金县| 铁力市| 临高县| 南宫市| 定日县| 石城县| 肥西县| 吉隆县| 盐池县| 大竹县| 米泉市| 大宁县| 东阳市| 德兴市| 威远县| 区。| 汕头市| 浦县| 延吉市| 青浦区| 温州市| 门源| 镇平县| 商水县| 乌拉特前旗| 衡山县| 巴林左旗| 黔江区| 四平市| 白山市| 青海省| 车险| 勃利县| 张家港市| 卫辉市| 庆安县| 蕉岭县| 金塔县| 新绛县| 黄石市| 醴陵市|