最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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個字節(jié)的代碼地址 0xB8, 0x00, 0x00,0x40,0x00,0xFF,0xE0,0x00  只要把第二位和第三位的數據改成函數的地址,調用原先的函數時就會調到自定義的函數執(zhí)行.

二、實現方法:

.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語言中判斷素數(求素數)的思路與方法實例

    計算機或者相關專業(yè)基本上大一新生開始學編程都會接觸的一個問題就是判斷質數,下面這篇文章主要給大家介紹了關于C語言中判斷素數(求素數)的思路與方法,需要的朋友可以參考下
    2022-03-03
  • C語言中%c與%s的區(qū)別與劃分詳解

    C語言中%c與%s的區(qū)別與劃分詳解

    這篇文章主要介紹了C語言中%c與%s的區(qū)別與劃分詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    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 并發(fā)指南之std::mutex詳解

    C++11 并發(fā)指南之std::mutex詳解

    這篇文章主要介紹了C++11 并發(fā)指南之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,直譯過來是:“協議緩沖區(qū)”,是一種與語言無關、與平臺無關的可擴展機制,用于序列化結構化數據,這篇文章主要介紹了C/C++ProtoBuf使用,需要的朋友可以參考下
    2024-01-01

最新評論

张掖市| 远安县| 荣昌县| 尚志市| 张家川| 阳山县| 沁源县| 十堰市| 汾阳市| 平原县| 南充市| 徐州市| 高州市| 新绛县| 松阳县| 仁布县| 吉木萨尔县| 金川县| 福海县| 宣武区| 克东县| 建宁县| 曲阜市| 宝鸡市| 巴里| 若羌县| 安吉县| 广昌县| 湘潭市| 长垣县| 栖霞市| 太和县| 穆棱市| 阿克陶县| 友谊县| 东源县| 石柱| 洛扎县| 郎溪县| 永德县| 福清市|