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

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

C++基于hook iat改變Messagebox實例

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

本文實例講述了C++基于hook iat改變Messagebox的方法,分享給大家供大家參考。具體方法如下:

步驟:

1. 定義原始函數類型的寫法

復制代碼 代碼如下:
//定義函數原型 
typedef int (WINAPI *PFNMESSAGEBOX)(HWND hWnd,  LPCTSTR lpText,  LPCTSTR lpCaption,  UINT uType); 
//保存原始的MessageBox地址,注意這里 
PROC g_orgProc = (PROC)MessageBox;

2. 先找到dll,找到后設置標志

復制代碼 代碼如下:
if (stricmp(pszDllName, "user32.dll") == 0)//如果是user32.dll 

        bFindDll = TRUE; 
        break; 
}

3. 找到dll后,查找函數名稱

復制代碼 代碼如下:
//在這里是比較的函數名稱 
if (stricmp(pszFuncName, "MessageBoxA") == 0) 

 //取得函數地址 
 PDWORD lpAddr = (DWORD*)((BYTE*)hModule + pImportDesc->FirstThunk) + n; //從第一個函數的地址,以后每次+4字節 
 //在這里是比較的函數地址 
 printf("addrss:%X/n", lpAddr); 
 DWORD* lpNewProc = (DWORD*)MyMessageBox; 
 ::WriteProcessMemory(GetCurrentProcess(), lpAddr, &lpNewProc, sizeof(DWORD), NULL); 
 return; 
}

當然 在3.中,也可以根據函數地址比較

復制代碼 代碼如下:
#include <windows.h> 
#include <stdio.h> 
 
//定義函數原型 
typedef int (WINAPI *PFNMESSAGEBOX)(HWND hWnd,  LPCTSTR lpText,  LPCTSTR lpCaption,  UINT uType); 
//保存原始的MessageBox地址,注意這里 
PROC g_orgProc = (PROC)MessageBox; 
 
int MyMessageBox(HWND hWnd,  LPCTSTR lpText,  LPCTSTR lpCaption,  UINT uType) 

    return ((PFNMESSAGEBOX)g_orgProc)(hWnd, "mymessagebox", lpCaption, uType); 

 
void SetHook() 

    HMODULE hModule = ::GetModuleHandleA(NULL); 
    IMAGE_DOS_HEADER* pDosHeader = (IMAGE_DOS_HEADER*)hModule; 
    IMAGE_OPTIONAL_HEADER* pOpNtHeader = (IMAGE_OPTIONAL_HEADER*)((BYTE*)hModule + pDosHeader->e_lfanew + 24); //這里加24 
    IMAGE_IMPORT_DESCRIPTOR* pImportDesc = (IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)hModule + pOpNtHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); 
 
    BOOL bFindDll = FALSE; 
    while (pImportDesc->FirstThunk) 
    { 
        char* pszDllName = (char*)((BYTE*)hModule + pImportDesc->Name); 
        printf("模塊名稱:%s/n", pszDllName); 
         
        if (stricmp(pszDllName, "user32.dll") == 0)//如果是user32.dll 
        { 
            bFindDll = TRUE; 
            break; 
        } 
        pImportDesc++;   
    } 
 
    if (bFindDll) 
    { 
        DWORD n = 0; 
        //一個IMAGE_THUNK_DATA就是一個導入函數 
        IMAGE_THUNK_DATA* pThunk = (IMAGE_THUNK_DATA*)((BYTE*)hModule + pImportDesc->OriginalFirstThunk); 
        while (pThunk->u1.Function) 
        { 
            //取得函數名稱 
            char* pszFuncName = (char*)((BYTE*)hModule+pThunk->u1.AddressOfData+2); //函數名前面有兩個.. 
            printf("function name:%-25s,  ", pszFuncName); 
            //在這里是比較的函數名稱 
            if (stricmp(pszFuncName, "MessageBoxA") == 0) 
            { 
                //取得函數地址 
                PDWORD lpAddr = (DWORD*)((BYTE*)hModule + pImportDesc->FirstThunk) + n; //從第一個函數的地址,以后每次+4字節 
                //在這里是比較的函數地址 
                printf("addrss:%X/n", lpAddr); 
                DWORD* lpNewProc = (DWORD*)MyMessageBox; 
                ::WriteProcessMemory(GetCurrentProcess(), lpAddr, &lpNewProc, sizeof(DWORD), NULL); 
                return; 
            }            
            n++; //每次增加一個DWORD 
        } 
        printf("/n");        
    } 
     

int main(int argc, char* argv[]) 

    ::MessageBoxA(NULL, "before hook", "", MB_OK); 
    SetHook(); 
    ::MessageBoxA(NULL, "AFTERE hook", "", MB_OK); 
    return 0; 
}

下面這個是比較函數地址的版本

復制代碼 代碼如下:
#include <windows.h> 
#include <stdio.h> 
 
//定義函數原型 
typedef int (WINAPI *PFNMESSAGEBOX)(HWND hWnd,  LPCTSTR lpText,  LPCTSTR lpCaption,  UINT uType); 
//保存原始的MessageBox地址,注意這里 
PROC g_orgProc = (PROC)MessageBox; 
 
int MyMessageBox(HWND hWnd,  LPCTSTR lpText,  LPCTSTR lpCaption,  UINT uType) 

    return ((PFNMESSAGEBOX)g_orgProc)(hWnd, "mymessagebox", lpCaption, uType); 

 
void SetHook() 

    HMODULE hModule = ::GetModuleHandleA(NULL); 
    IMAGE_DOS_HEADER* pDosHeader = (IMAGE_DOS_HEADER*)hModule; 
    IMAGE_OPTIONAL_HEADER* pOpNtHeader = (IMAGE_OPTIONAL_HEADER*)((BYTE*)hModule + pDosHeader->e_lfanew + 24); //這里加24 
    IMAGE_IMPORT_DESCRIPTOR* pImportDesc = (IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)hModule + pOpNtHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); 
 
    BOOL bFindDll = FALSE; 
    while (pImportDesc->FirstThunk) 
    { 
        char* pszDllName = (char*)((BYTE*)hModule + pImportDesc->Name); 
        printf("模塊名稱:%s/n", pszDllName); 
         
        if (stricmp(pszDllName, "user32.dll") == 0)//如果是user32.dll 
        { 
            bFindDll = TRUE; 
            break; 
        } 
        pImportDesc++;   
    } 
 
    if (bFindDll) 
    { 
        DWORD n = 0; 
        //一個IMAGE_THUNK_DATA就是一個導入函數 
        IMAGE_THUNK_DATA* pThunk = (IMAGE_THUNK_DATA*)((BYTE*)hModule + pImportDesc->OriginalFirstThunk); 
        while (pThunk->u1.Function) 
        { 
            //取得函數名稱 
            char* pszFuncName = (char*)((BYTE*)hModule+pThunk->u1.AddressOfData+2); //函數名前面有兩個.. 
            printf("function name:%-25s,  ", pszFuncName); 
            //取得函數地址 
            PDWORD lpAddr = (DWORD*)((BYTE*)hModule + pImportDesc->FirstThunk) + n; //從第一個函數的地址,以后每次+4字節 
            printf("addrss:%X/n", lpAddr); 
            //在這里是比較的函數地址 
            if (*lpAddr == (DWORD)g_orgProc) 
            {                                
                DWORD* lpNewProc = (DWORD*)MyMessageBox; 
                ::WriteProcessMemory(GetCurrentProcess(), lpAddr, &lpNewProc, sizeof(DWORD), NULL); 
                return; 
            }            
            n++; //每次增加一個DWORD 
        } 
        printf("/n");        
    } 
     

int main(int argc, char* argv[]) 

    ::MessageBoxA(NULL, "before hook", "", MB_OK); 
    SetHook(); 
    ::MessageBoxA(NULL, "AFTERE hook", "", MB_OK); 
    return 0; 
}

附上修改內存頁保護屬性的代碼:

復制代碼 代碼如下:
//修改內存頁的保護屬性 
::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);

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91久久久久久国产精品| 成人网在线免费看| 97色在线播放视频| 久久久亚洲网站| 色婷婷久久一区二区| 欧美高清视频在线播放| 国产精品主播视频| 国产精品va在线播放| 国产精品久久久久久亚洲调教| 91麻豆国产精品| 96国产粉嫩美女| 亚洲精品电影在线| 日韩欧美aⅴ综合网站发布| 国产精品h在线观看| 国产精品视频一区二区三区四| 91在线高清免费观看| 国产在线高清精品| 欧美性猛交xxxx乱大交极品| 日韩中文字幕网址| www.国产精品一二区| 国产不卡av在线免费观看| 亚洲午夜激情免费视频| 亚洲香蕉成视频在线观看| 国产性猛交xxxx免费看久久| 日韩精品久久久久久久玫瑰园| 91免费精品国偷自产在线| 国产精品极品美女在线观看免费| 高清一区二区三区日本久| 在线成人激情视频| 精品福利在线观看| 精品久久国产精品| 国产精品一区二区三区毛片淫片| 国产精品96久久久久久又黄又硬| 国模视频一区二区| 久久色在线播放| 韩国国内大量揄拍精品视频| 免费不卡欧美自拍视频| 日韩不卡在线观看| 国产精品扒开腿爽爽爽视频| 国产精品黄页免费高清在线观看| 久久久精品免费视频| 久久久中精品2020中文| 国产欧美日韩中文字幕在线| 国产精品成熟老女人| 国产aaa精品| 国产美女久久久| 国产精品网址在线| 91精品久久久久久久久久另类| 国产精品久久97| 久久精品国产成人精品| 黄色一区二区三区| 7m精品福利视频导航| 日韩av最新在线| 国产成人免费av| 午夜精品美女自拍福到在线| 国产一区二区三区在线播放免费观看| 欧美最顶级丰满的aⅴ艳星| 亚洲精品小视频在线观看| 亚洲韩国欧洲国产日产av| 国自在线精品视频| 欧美性xxxxxxxxx| 亚洲高清不卡av| 激情av一区二区| 精品国产区一区二区三区在线观看| 国产精品日韩在线一区| 国产精品久久久久久久久久久久| 国产精品免费观看在线| 91高潮在线观看| 国产精品视频xxx| 中文字幕精品在线| 欧美成人午夜激情视频| 日本国产精品视频| 国产精品视频内| 精品高清美女精品国产区| 国产精品丝袜高跟| 国产精品精品久久久久久| 国产一区二区av| 午夜精品福利电影| 国产日韩在线一区| 97热精品视频官网| 国产精品老牛影院在线观看| 91精品国产高清自在线看超| 亚洲欧美成人在线| 国产精品一区二区av影院萌芽| 国产91av在线| 亚洲xxx视频| 日本高清不卡的在线| 国产精品久久久久久久久久久久久久| 国产www精品| 亚洲精品日韩丝袜精品| 亚洲成人在线视频播放| 91精品国产综合久久香蕉最新版| 91在线免费看网站| 日韩精品在线观看一区二区| 国产精品久久精品| 精品中文字幕在线观看| 欧美性jizz18性欧美| 日韩国产精品亚洲а∨天堂免| 欧美裸体xxxx极品少妇| 亚洲一区av在线播放| 97在线视频免费| 国产日韩专区在线| 成人综合国产精品| 热久久视久久精品18亚洲精品| 成人激情在线观看| 91精品国产乱码久久久久久蜜臀| 欧洲s码亚洲m码精品一区| 操日韩av在线电影| 日韩欧美精品网站| 国产精品嫩草影院一区二区| 久久影视电视剧免费网站清宫辞电视| 精品人伦一区二区三区蜜桃网站| 欧美电影在线观看完整版| 欧美精品电影在线| 欧美激情网站在线观看| 精品美女国产在线| 久久久久免费视频| 亚洲国产成人精品久久久国产成人一区| 成人精品一区二区三区| 欧美成人网在线| 久久综合国产精品台湾中文娱乐网| 欧美一区第一页| 欧美日韩视频在线| 91免费的视频在线播放| 国产裸体写真av一区二区| 亚洲桃花岛网站| 国产日韩在线观看av| 91免费在线视频网站| 国内自拍欧美激情| 欧美日韩ab片| 久久精品一本久久99精品| 一区二区国产精品视频| 亚洲精品动漫久久久久| 日韩色av导航| 欧美日韩电影在线观看| 国产69精品99久久久久久宅男| 中文字幕国内精品| 久久天天躁狠狠躁夜夜av| 国产欧美久久久久久| 欧美视频在线免费看| 欧美精品免费播放| 国产精品稀缺呦系列在线| 日韩激情第一页| 成人h视频在线观看播放| 日韩美女主播视频| 久久视频在线免费观看| 成人精品一区二区三区电影免费| 欧美视频二区36p| 日韩成人在线电影网| 亚洲黄色免费三级| 国产视频久久久久| 在线观看中文字幕亚洲| 久久精品99无色码中文字幕| 亚洲精品456在线播放狼人| 亚洲午夜性刺激影院| 国产视频精品自拍| 91产国在线观看动作片喷水| 日韩不卡在线观看| 亚洲欧美999| 日韩电影中文字幕一区| 国产mv免费观看入口亚洲| 亚洲丝袜在线视频| 欧美激情视频一区二区| 日韩精品极品在线观看播放免费视频|