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

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

 更新時(shí)間:2014年10月20日 10:08:11   投稿:shichen2014  
這篇文章主要介紹了C++實(shí)現(xiàn)修改函數(shù)代碼HOOK的封裝方法,有助于深入了解C++的HOOK原理,需要的朋友可以參考下

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

一、對(duì)外的接口如下:

1. 類初始化時(shí)對(duì)函數(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í)就會(huì)調(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); 
    } 
}

希望本文所述對(duì)大家的C++程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • C++中sort函數(shù)的基礎(chǔ)入門使用教程

    C++中sort函數(shù)的基礎(chǔ)入門使用教程

    這篇文章主要給大家介紹了關(guān)于C++中sort函數(shù)的基礎(chǔ)入門使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧
    2018-12-12
  • C語言中判斷素?cái)?shù)(求素?cái)?shù))的思路與方法實(shí)例

    C語言中判斷素?cái)?shù)(求素?cái)?shù))的思路與方法實(shí)例

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

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

    這篇文章主要介紹了C語言中%c與%s的區(qū)別與劃分詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 詳解C++ 共享數(shù)據(jù)保護(hù)機(jī)制

    詳解C++ 共享數(shù)據(jù)保護(hù)機(jī)制

    這篇文章主要介紹了詳解C++ 共享數(shù)據(jù)保護(hù)機(jī)制的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-02-02
  • C語言軟件iic虛擬總線中間層設(shè)計(jì)詳解

    C語言軟件iic虛擬總線中間層設(shè)計(jì)詳解

    這篇文章主要為大家介紹了C語言軟件iic虛擬總線中間層設(shè)計(jì)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • C++生成不重復(fù)的隨機(jī)整數(shù)

    C++生成不重復(fù)的隨機(jī)整數(shù)

    這篇文章主要為大家詳細(xì)介紹了C++生成不重復(fù)的隨機(jī)整數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • C++11 并發(fā)指南之std::mutex詳解

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

    這篇文章主要介紹了C++11 并發(fā)指南之std::mutex詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C++語言基礎(chǔ) this和static關(guān)鍵字

    C++語言基礎(chǔ) this和static關(guān)鍵字

    這篇文章主要介紹了C++語言基礎(chǔ) this和static關(guān)鍵字,需要的朋友可以參考下
    2020-01-01
  • C語言詳細(xì)分析浮點(diǎn)數(shù)在內(nèi)存中的儲(chǔ)存

    C語言詳細(xì)分析浮點(diǎn)數(shù)在內(nèi)存中的儲(chǔ)存

    我們?cè)谌粘I钪泻途幊讨卸紩?huì)用到小數(shù),比如:3.1415926、29.9、1E10(科學(xué)計(jì)數(shù)法也是浮點(diǎn)型)。在C語言中的浮點(diǎn)型類型有:float,double,long double。那么浮點(diǎn)數(shù)在這些浮點(diǎn)型的內(nèi)存之中又是如何儲(chǔ)存的呢,這就是今天我們要分享的
    2022-06-06
  • C/C++ProtoBuf使用小結(jié)

    C/C++ProtoBuf使用小結(jié)

    ProtoBuf全稱:protocol buffers,直譯過來是:“協(xié)議緩沖區(qū)”,是一種與語言無關(guān)、與平臺(tái)無關(guān)的可擴(kuò)展機(jī)制,用于序列化結(jié)構(gòu)化數(shù)據(jù),這篇文章主要介紹了C/C++ProtoBuf使用,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

句容市| 乐亭县| 徐闻县| 河北省| 新乐市| 从江县| 高要市| 锡林浩特市| 微山县| 周口市| 阳原县| 深水埗区| 武山县| 台南县| 米脂县| 内江市| 滁州市| 温宿县| 浦江县| 抚宁县| 闽侯县| 怀来县| 临邑县| 永靖县| 中牟县| 南部县| 循化| 涟水县| 茂名市| 伊通| 宜兴市| 泰和县| 武威市| 共和县| 大方县| 文水县| 嵊泗县| 崇义县| 区。| 富平县| 清水河县|