亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

C++封裝IATHOOK類實例

2020-01-26 15:13:38
字體:
來源:轉載
供稿:網友

本文實例講述了C++封裝IATHOOK類的實現方法。分享給大家供大家參考。具體方法如下:

1. 定義成類的靜態成員,從而實現自動調用

復制代碼 代碼如下:
static CAPIHOOK sm_LoadLibraryA; 
static CAPIHOOK sm_LoadLibraryW; 
static CAPIHOOK sm_LoadLibraryExA; 
static CAPIHOOK sm_LoadLibraryExW; 
static CAPIHOOK sm_GetProcAddress;

2. ReplaceIATEntryInAllMods中遍歷模塊的框架

復制代碼 代碼如下:
void CAPIHOOK::ReplaceIATEntryInAllMods(LPCTSTR pszExportMod, PROC pfnCurrent, PROC pfnNewFunc, BOOL bExcludeAPIHookMod) 

    //取得當前模塊句柄 
    HMODULE hModThis = NULL; 
    if (bExcludeAPIHookMod) 
    { 
        MEMORY_BASIC_INFORMATION mbi; 
        if (0 != ::VirtualQuery(ReplaceIATEntryInAllMods, &mbi, sizeof(MEMORY_BASIC_INFORMATION))) //ReplaceIATEntryInAllMods必須為類的static函數 
        { 
            hModThis = (HMODULE)mbi.AllocationBase; 
        } 
    } 
    //取得本進程的模塊列表 
    HANDLE hModuleSnap = INVALID_HANDLE_VALUE;  
    MODULEENTRY32 me32; 
    hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId()); 
    if (INVALID_HANDLE_VALUE == hModuleSnap) 
    { 
        return; 
    } 
    me32.dwSize = sizeof( MODULEENTRY32 );  
    if( !Module32First( hModuleSnap, &me32 ) )  
    {  
        return; 
    } 
    do  
    { //對每一個模塊 
        if (me32.hModule != hModThis) 
        { 
            ReplaceIATEntryInOneMod(pszExportMod, pfnCurrent, pfnNewFunc, me32.hModule); 
        } 
    } while( Module32Next( hModuleSnap, &me32 ) );  
 
 
    ::CloseHandle(hModuleSnap); //配對寫 
 
}

3. 遍歷鏈表摘除自己的框架

復制代碼 代碼如下:
CAPIHOOK::~CAPIHOOK(void) 

    //取消對函數的HOOK 
    ReplaceIATEntryInAllMods(m_pszModName, m_pfnHook, m_pfnOrig, TRUE); 
 
    //把自己從鏈表中刪除 
    CAPIHOOK* p = sm_pHeader; 
    if (p == this) 
    { 
        sm_pHeader = this->m_pNext; 
    } 
    else 
    { 
        while(p != NULL) 
        { 
            if (p->m_pNext == this) 
            { 
                p->m_pNext = this->m_pNext; 
                break; 
            } 
            p = p->m_pNext; 
        } 
    } 
}

4. 在cpp中靜態變量寫好后,再編譯,不然容易出現LINK錯誤

復制代碼 代碼如下:
CAPIHOOK *CAPIHOOK::sm_pHeader = NULL;

源碼:

.cpp源文件如下:

復制代碼 代碼如下:
#include "APIHOOK.h" 
#include <Tlhelp32.h> 
 
CAPIHOOK *CAPIHOOK::sm_pHeader = NULL; 
CAPIHOOK CAPIHOOK::sm_LoadLibraryA("kernel32.dll", "LoadLibraryA", (PROC)CAPIHOOK::LoadLibraryA, TRUE); 
CAPIHOOK CAPIHOOK::sm_LoadLibraryW("kernel32.dll", "LoadLibraryW", (PROC)CAPIHOOK::LoadLibraryW, TRUE); 
CAPIHOOK CAPIHOOK::sm_LoadLibraryExA("kernel32.dll", "LoadLibraryExA", (PROC)CAPIHOOK::LoadLibraryExA, TRUE); 
CAPIHOOK CAPIHOOK::sm_LoadLibraryExW("kernel32.dll", "LoadLibraryExW", (PROC)CAPIHOOK::LoadLibraryExW, TRUE); 
CAPIHOOK CAPIHOOK::sm_GetProcAddress("kernel32.dll", "GetProcAddress", (PROC)CAPIHOOK::GetProcess, TRUE); 
CAPIHOOK::CAPIHOOK(LPTSTR lpszModName, LPSTR pszFuncName, PROC pfnHook, BOOL bExcludeAPIHookMod) 

    //初始化變量 
    m_pszModName = lpszModName; 
    m_pszFuncName = pszFuncName; 
    m_pfnOrig = ::GetProcAddress(::GetModuleHandleA(lpszModName), pszFuncName); 
    m_pfnHook = pfnHook; 
 
    //將此對象加入鏈表中 
    m_pNext = sm_pHeader; 
    sm_pHeader = this; 
 
    //在當前已加載的模塊中HOOK這個函數 
    ReplaceIATEntryInAllMods(lpszModName, m_pfnOrig, m_pfnHook, bExcludeAPIHookMod); 

 
CAPIHOOK::~CAPIHOOK(void) 

    //取消對函數的HOOK 
    ReplaceIATEntryInAllMods(m_pszModName, m_pfnHook, m_pfnOrig, TRUE); 
 
    //把自己從鏈表中刪除 
    CAPIHOOK* p = sm_pHeader; 
    if (p == this) 
    { 
        sm_pHeader = this->m_pNext; 
    } 
    else 
    { 
        while(p != NULL) 
        { 
            if (p->m_pNext == this) 
            { 
                p->m_pNext = this->m_pNext; 
                break; 
            } 
            p = p->m_pNext; 
        } 
    } 

//防止程序運行期間動態加載模塊 
void CAPIHOOK::HookNewlyLoadedModule(HMODULE hModule, DWORD dwFlags) 

    if (hModule!=NULL && (dwFlags&LOAD_LIBRARY_AS_DATAFILE)==0) 
    { 
        CAPIHOOK* p = sm_pHeader;  //循環遍歷鏈表,對每個CAPIHOOK進入HOOK 
        if (p != NULL)   
        { 
            ReplaceIATEntryInOneMod(p->m_pszModName, p->m_pfnOrig, p->m_pfnHook, hModule); 
            p = p->m_pNext; 
        } 
    } 

//防止程序運行期間動態調用API函數 
FARPROC WINAPI CAPIHOOK::GetProcess(HMODULE hModule, PCSTR pszProcName) 

    //得到函數的真實地址 
    FARPROC pfn = ::GetProcAddress(hModule, pszProcName); 
    //遍歷列表 看是不是要HOOK的函數 
    CAPIHOOK* p = sm_pHeader; 
    while(p != NULL) 
    { 
        if (p->m_pfnOrig == pfn) //是要HOOK的函數 
        { 
            pfn = p->m_pfnHook; //HOOK掉 
            break; 
        } 
        p = p->m_pNext; 
    } 
    return pfn; 

 
void CAPIHOOK::ReplaceIATEntryInOneMod(LPCTSTR pszExportMod, PROC pfnCurrent, PROC pfnNewFunc, HMODULE hModCaller) 

    IMAGE_DOS_HEADER* pDosHeader = (IMAGE_DOS_HEADER*)hModCaller; 
    IMAGE_OPTIONAL_HEADER* pOpNtHeader = (IMAGE_OPTIONAL_HEADER*)((BYTE*)hModCaller + pDosHeader->e_lfanew + 24); //這里加24 
    IMAGE_IMPORT_DESCRIPTOR* pImportDesc = (IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)hModCaller + pOpNtHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); 
 
    BOOL bFindDll = FALSE; 
    while (pImportDesc->FirstThunk) 
    { 
        char* pszDllName = (char*)((BYTE*)hModCaller + pImportDesc->Name); 
 
        if (stricmp(pszDllName, pszExportMod) == 0)//如果找到pszExportMod模塊,相當于hook messageboxa時的“user32.dll” 
        { 
            bFindDll = TRUE; 
            break; 
        } 
        pImportDesc++;   
    } 
 
    if (bFindDll) 
    { 
        DWORD n = 0; 
        //一個IMAGE_THUNK_DATA就是一個導入函數 
        IMAGE_THUNK_DATA* pThunk = (IMAGE_THUNK_DATA*)((BYTE*)hModCaller + pImportDesc->OriginalFirstThunk); 
        while (pThunk->u1.Function) 
        { 
            //取得函數名稱 
            char* pszFuncName = (char*)((BYTE*)hModCaller+pThunk->u1.AddressOfData+2); //函數名前面有兩個.. 
            //printf("function name:%-25s,  ", pszFuncName); 
            //取得函數地址 
            PDWORD lpAddr = (DWORD*)((BYTE*)hModCaller + pImportDesc->FirstThunk) + n; //從第一個函數的地址,以后每次+4字節 
            //printf("addrss:%X/n", lpAddr); 
            //在這里是比較的函數地址 
            if (*lpAddr == (DWORD)pfnCurrent)  //找到iat中的函數地址 
            {                                
                DWORD* lpNewProc = (DWORD*)pfnNewFunc; 
                MEMORY_BASIC_INFORMATION mbi; 
                DWORD dwOldProtect; 
                //修改內存頁的保護屬性 
                ::VirtualQuery(lpAddr, &mbi, sizeof(MEMORY_BASIC_INFORMATION)); 
                ::VirtualProtect(lpAddr, sizeof(DWORD), PAGE_READWRITE, &dwOldProtect); 
                ::WriteProcessMemory(GetCurrentProcess(), lpAddr, &lpNewProc, sizeof(DWORD), NULL); 
                ::VirtualProtect(lpAddr, sizeof(DWORD), dwOldProtect, NULL); 
                return; 
            }            
            n++; //每次增加一個DWORD 
        }    
    } 

 
void CAPIHOOK::ReplaceIATEntryInAllMods(LPCTSTR pszExportMod, PROC pfnCurrent, PROC pfnNewFunc, BOOL bExcludeAPIHookMod) 

    //取得當前模塊句柄 
    HMODULE hModThis = NULL; 
    if (bExcludeAPIHookMod) 
    { 
        MEMORY_BASIC_INFORMATION mbi; 
        if (0 != ::VirtualQuery(ReplaceIATEntryInAllMods, &mbi, sizeof(MEMORY_BASIC_INFORMATION))) //ReplaceIATEntryInAllMods必須為類的static函數 
        { 
            hModThis = (HMODULE)mbi.AllocationBase; 
        } 
    } 
    //取得本進程的模塊列表 
    HANDLE hModuleSnap = INVALID_HANDLE_VALUE;  
    MODULEENTRY32 me32; 
    hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId()); 
    if (INVALID_HANDLE_VALUE == hModuleSnap) 
    { 
        return; 
    } 
    me32.dwSize = sizeof( MODULEENTRY32 );  
    if( !Module32First( hModuleSnap, &me32 ) )  
    {  
        return; 
    } 
    do  
    { //對每一個模塊 
        if (me32.hModule != hModThis) 
        { 
            ReplaceIATEntryInOneMod(pszExportMod, pfnCurrent, pfnNewFunc, me32.hModule); 
        } 
    } while( Module32Next( hModuleSnap, &me32 ) );  
 
    ::CloseHandle(hModuleSnap); //配對寫 

 
//防止自動加載 
HMODULE WINAPI CAPIHOOK::LoadLibraryA(LPCTSTR lpFileName) 

    HMODULE hModule = LoadLibraryA(lpFileName); 
    HookNewlyLoadedModule(hModule, 0); //這個函數中憶檢測hModule 了 
    return hModule; 

HMODULE WINAPI CAPIHOOK::LoadLibraryW(LPCTSTR lpFileName) 

    HMODULE hModule = LoadLibraryW(lpFileName); 
    HookNewlyLoadedModule(hModule, 0); //這個函數中憶檢測hModule 了 
    return hModule; 

HMODULE WINAPI CAPIHOOK::LoadLibraryExA(LPCTSTR lpFileName, HANDLE hFile,  DWORD dwFlags) 

    HMODULE hModule = LoadLibraryExA(lpFileName, hFile, dwFlags); 
    HookNewlyLoadedModule(hModule, dwFlags); //這個函數中憶檢測hModule 了 
    return hModule; 

HMODULE WINAPI CAPIHOOK::LoadLibraryExW(LPCTSTR lpFileName, HANDLE hFile,  DWORD dwFlags) 

    HMODULE hModule = LoadLibraryExW(lpFileName, hFile, dwFlags); 
    HookNewlyLoadedModule(hModule, dwFlags); //這個函數中憶檢測hModule 了 
    return hModule; 
}

.h頭文件如下:

復制代碼 代碼如下:
#pragma once 
#include <Windows.h> 
 
class CAPIHOOK 

public: 
    CAPIHOOK(LPTSTR lpszModName, LPSTR pszFuncName, PROC pfnHook, BOOL bExcludeAPIHookMod = TRUE); 
    ~CAPIHOOK(void); 
 
private: 
    static void ReplaceIATEntryInOneMod(LPCTSTR pszExportMod, PROC pfnCurrent, PROC pfnNewFunc, HMODULE hModCaller); 
    static void ReplaceIATEntryInAllMods(LPCTSTR pszExportMod, PROC pfnCurrent, PROC pfnNewFunc, BOOL bExcludeAPIHookMod); 
    //防止程序運行期間動態加載模塊, 當一個新DLL被加載時調用 
    static void HookNewlyLoadedModule(HMODULE hModule,  DWORD dwFlags); 
 
    //跟蹤當前進程加載新的DLL 
    static HMODULE WINAPI LoadLibraryA(LPCTSTR lpFileName); 
    static HMODULE WINAPI LoadLibraryW(LPCTSTR lpFileName); 
    static HMODULE WINAPI LoadLibraryExA(LPCTSTR lpFileName, HANDLE hFile,  DWORD dwFlags); 
    static HMODULE WINAPI LoadLibraryExW(LPCTSTR lpFileName, HANDLE hFile,  DWORD dwFlags); 
    //防止程序運行期間動態調用API函數 對于請求已HOOK的API函數,返回用戶自定義的函數地址 
    static FARPROC WINAPI GetProcess(HMODULE hModule, PCSTR pszProcName);
 
private: //定義成靜態的,會自動調用,從而實現自動HOOK 
    static CAPIHOOK sm_LoadLibraryA; 
    static CAPIHOOK sm_LoadLibraryW; 
    static CAPIHOOK sm_LoadLibraryExA; 
    static CAPIHOOK sm_LoadLibraryExW; 
    static CAPIHOOK sm_GetProcAddress; 
 
private: 
    static CAPIHOOK* sm_pHeader; //鉤子鏈表 
    CAPIHOOK* m_pNext; 
 
    //要鉤子的函數 
    PROC m_pfnOrig; 
    PROC m_pfnHook; 
 
    //要鉤子的函數所在的dll 
    LPSTR m_pszModName; 
    //要鉤子的函數名稱 
    LPSTR m_pszFuncName; 
};

希望本文所述對大家的C++程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲免费av网址| 成人精品福利视频| 5278欧美一区二区三区| 欧美日韩亚洲网| 国产精品亚洲аv天堂网| 久热精品在线视频| 国产91色在线| 激情久久av一区av二区av三区| 国产在线观看一区二区三区| 中文字幕免费国产精品| 欧美在线观看网址综合| 91高清免费视频| 在线观看免费高清视频97| 日韩资源在线观看| 92国产精品视频| 精品国模在线视频| 久久久久久久久中文字幕| 国产精品美女久久久免费| 亚洲精品suv精品一区二区| 成人午夜黄色影院| 中文字幕日韩综合av| 91精品免费久久久久久久久| 亚洲精品电影网在线观看| 欧美精品中文字幕一区| 亚洲精品一区二区三区婷婷月| 国产精国产精品| 国产91对白在线播放| 国内精品久久久久影院 日本资源| 欧美黄色小视频| 日日噜噜噜夜夜爽亚洲精品| 国产精品一区二区三区免费视频| 国产精品999| 亚洲欧美制服另类日韩| 一区国产精品视频| 欧美激情手机在线视频| 亚洲欧美中文日韩v在线观看| 国产在线高清精品| 不卡av电影在线观看| 在线播放日韩精品| 欲色天天网综合久久| 欧美激情二区三区| 精品国产老师黑色丝袜高跟鞋| 欧美极品欧美精品欧美视频| 91沈先生作品| 91视频国产一区| 中文字幕一精品亚洲无线一区| 社区色欧美激情 | 欧美区二区三区| 久久艹在线视频| 91免费人成网站在线观看18| 欧美性20hd另类| 国产精品视频网| 日韩少妇与小伙激情| 国产精品一区二区三| 国产一区二区三区在线视频| 日韩免费高清在线观看| 欧美激情综合色综合啪啪五月| 久久伊人精品天天| 福利二区91精品bt7086| 欧美另类在线观看| 91亚洲精品在线| 国产九九精品视频| 欧洲成人在线视频| 精品无码久久久久久国产| 日韩欧美国产高清91| 欧洲午夜精品久久久| 日韩av在线网页| 欧美激情一区二区三区久久久| 日本人成精品视频在线| 97人洗澡人人免费公开视频碰碰碰| 亚洲精品一区在线观看香蕉| 国产成人综合精品在线| 国产精品久久久久久中文字| 欧美亚洲第一页| 日韩va亚洲va欧洲va国产| 成人久久一区二区| 亚洲欧美日韩图片| 国产v综合v亚洲欧美久久| 疯狂欧美牲乱大交777| 欧美激情一区二区三区成人| 欧美成人中文字幕在线| 日韩在线视频免费观看| 中文字幕国产亚洲2019| 亚洲欧美日韩天堂| 日韩欧美第一页| 中文字幕亚洲激情| 不卡av日日日| 亚洲综合成人婷婷小说| 亚洲国产欧美日韩精品| 91精品综合久久久久久五月天| 久久国产精品免费视频| 亚洲欧美综合区自拍另类| 亚洲视频在线视频| 中日韩美女免费视频网址在线观看| 欧美中文在线视频| 亚洲欧美日韩视频一区| 热久久免费国产视频| 超薄丝袜一区二区| 国产精品久久网| 久久人人看视频| 国产午夜精品麻豆| 亚洲视频欧洲视频| 2020国产精品视频| 久久手机免费视频| 国产精品国产三级国产专播精品人| 亚洲国产精品va| 色天天综合狠狠色| 亚洲精品国产精品久久清纯直播| 日韩av一区二区在线观看| 奇米四色中文综合久久| 亚洲成人精品久久| 超碰日本道色综合久久综合| 欧美精品做受xxx性少妇| 国产精品免费在线免费| 国产国语videosex另类| 国产精品久久久久久久久久ktv| 久久精品国亚洲| 91亚洲精品久久久| 国产主播在线一区| 日韩欧美在线视频日韩欧美在线视频| 51视频国产精品一区二区| 日韩免费视频在线观看| 色悠悠久久久久| 国产一区二中文字幕在线看| 高潮白浆女日韩av免费看| 国产精自产拍久久久久久| 久久久亚洲国产| 69**夜色精品国产69乱| 国产精品久久久久久久久久久久久久| 91在线精品视频| 亚洲午夜激情免费视频| 96精品视频在线| 国产91精品久| 神马国产精品影院av| 欧美亚洲国产成人精品| 欧美巨大黑人极品精男| 欧美成人精品不卡视频在线观看| 91香蕉嫩草影院入口| 国产精品普通话| 久久影院中文字幕| 国产美女久久精品| 91经典在线视频| 伊人久久精品视频| 美日韩丰满少妇在线观看| 精品视频在线播放| 亚洲九九九在线观看| 在线亚洲国产精品网| 欧美大片第1页| 成人免费网站在线| 在线观看日韩专区| 亚洲男人第一av网站| 欧美日韩午夜剧场| 福利微拍一区二区| 亚洲黄页网在线观看| 久久香蕉频线观| 高清一区二区三区日本久| 国产成人综合亚洲| 欧美精品激情在线观看| 日韩国产激情在线| 国产精品九九九| 69精品小视频| 91中文在线视频| 亚洲精品白浆高清久久久久久| 伊人久久大香线蕉av一区二区|