日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++:Windows编程—Inline Hook内联钩子(上)

發布時間:2025/3/15 c/c++ 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++:Windows编程—Inline Hook内联钩子(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

先介紹下Windows中的Hook技術。Hook是Windows中提供的一種用以替換DOS下“中斷”的系統機制,中文譯為“掛鉤”或“鉤子”。在對特定的系統事件進行hook后,一旦發生已hook事件,對該事件進行hook的程序就會收到系統的通知,這時程序就能在第一時間對該事件做出響應。Windows中的Hook技術的方法較多,常見的有Inline Hook、IAT Hook、EAT Hook 、Windows 鉤子…等。本片博文將主要介紹 Inline Hook(內聯鉤子)。本篇博文介紹的是5字節的Inline Hook,7字節的Inline Hook點擊這里

Inline Hook介紹

Windows的API函數都是保存在系統提供的DLL文件中。當程序調用某個API函數并運行程序的時候,程序會將DLL文件加載到進程中。舉例,比如當我們調用CreateFile這個函數的時候,如下圖


而我們的內聯鉤子的流程如下圖

當我們想要勾住CreateFile函數,首先要找到CreateFile函數地址,將其首地址代碼改為jmp MyHookProc,這樣當調用CreateFile函數時 就會跳轉到我們寫的 MyHookProc函數了,當執行我們自己寫的代碼后 如果還需要繼續執行之前的CreateFile,這時就需要將 CreateFile函數地址的首地址代碼改回來,這樣我們再次調用CreateFile時 就會走原來的流程了。

Inline Hook實現

在Inline Hook的時候我們介紹了,Hook過程主要是修改 被hook函數的首地址處的代碼,將其改為jmp 目標地址即可。那么問題來了,怎樣改

我們用OD隨便打開一個exe程序,如下圖,我們看到的jmp匯編指令是占5個字節的,其中jmp對應的機器碼 是E9(針對長轉移了說) 占一個字節,其后的目標地址占4字節

我們知道內存的內容 都是以二進制存儲的,程序在編譯的時候 先會通過匯編階段 轉為匯編語言,然后再通過編譯階段轉為 機器碼,最后是鏈接階段。這里直接說結論了,jmp 目標地址 經過編譯之后 會變為 E9 偏移量。那么偏移量怎么算?

前面我們知道這里的jmp指令是占5字節,**E9后的偏移量 = 目標地址 - 源地址 -5 ;**知道這個公式之后,我們就可以梳理一下 內聯鉤子的流程了。

  • 找到需要 Hook的函數地址,并保存該地址的前5個字節
  • 構造jmp指令(實際是構造對應的機器碼指令),并將其寫入到 需要Hook的函數地址處
  • 當被Hook的函數被調用的時候,就會跳轉到我們自己的流程了,這里可以執行我們的邏輯
  • 如果還想執行原來的流程,就需要先取消Hook(卸載鉤子),也就是還原被修改的字節。(必須先還原,不然會進入死循環 一直進入到我們自己的流程)
  • 執行完原來的流程
  • 繼續Hook原來的位置(把鉤子繼續勾上,下次調用被Hook的函數 依舊會進入我們的流程)
  • 示例效果

    這是卸載鉤子后,正常彈框

    下鉤子后

    代碼實現

    InlineHook.h

    #pragma once#include <Windows.h>class CInlineHook { public:CInlineHook(void);~CInlineHook(void);bool Hook(LPSTR strModuleName,LPSTR strHookFnName,FARPROC strHookCallFnName);bool UnHook();bool ReHook(); private:FARPROC m_pFnOrign; // 要Hook的函數地址BYTE m_bOld[5]; // 要Hook的函數 前5個字節BYTE m_bNew[5]; // 要Hook的函數 修改后的5個字節 };

    InlineHook.cpp

    #include "StdAfx.h" #include "InlineHook.h"CInlineHook::CInlineHook(void) {m_pFnOrign = NULL;memset(m_bOld,0,5);memset(m_bNew,0,5); }CInlineHook::~CInlineHook(void) {UnHook(); }bool CInlineHook::Hook(LPSTR strModuleName,LPSTR strHookFnName,FARPROC strTargetFnAddr) {bool ret = false;HMODULE hModule = GetModuleHandleA(strModuleName);if( hModule == NULL )goto end;m_pFnOrign = (FARPROC)GetProcAddress(hModule,strHookFnName);if( m_pFnOrign == NULL )goto end;SIZE_T numByte;// 保存被Hook函數的前5個字節if( ReadProcessMemory(GetCurrentProcess(),m_pFnOrign,m_bOld,5,&numByte) == 0 )goto end;// 構造jmp指令:jmp 目標地址,對應的機器碼:e9 4字節的偏移量m_bNew[0] = 0xe9;// 剩余4字節 放偏移量* (DWORD*)(&m_bNew[0]+1) = (DWORD)strTargetFnAddr - (DWORD)m_pFnOrign -5;// 修改被Hook函數的前5個字節 改變其執行流程if( WriteProcessMemory(GetCurrentProcess(),m_pFnOrign,m_bNew,5,&numByte) == 0 ) goto end;end:return ret; }bool CInlineHook::UnHook() {bool ret = false;// 卸載鉤子,實際上即是將更改的5個字節還原SIZE_T numByte;if( m_pFnOrign != NULL && WriteProcessMemory(GetCurrentProcess(),m_pFnOrign,m_bOld,5,&numByte) != 0)ret = true;return ret; }bool CInlineHook::ReHook() {bool ret = true;// 再次裝鉤子,更改要Hook的函數的前5字節 讓其跳轉到目標函數SIZE_T numByte;if( m_pFnOrign != NULL && WriteProcessMemory(GetCurrentProcess(),m_pFnOrign,m_bNew,5,&numByte) != 0)ret = true;return ret; }

    目標函數代碼

    // WINAPI 一定要聲明,指明函數調用方式,這里和MessageBox保持一致 int WINAPI MyMessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) {g_inlineHookObj.UnHook(); // 必須先卸載鉤子 再才可以再次調用被Hook的函數,不然會進入死循環::MessageBoxW(hWnd ,_T("進入MyMessageBox了"),_T("被Hook了,5字節InlineHook"),MB_OK);::MessageBoxW(hWnd ,lpText,lpCaption,MB_OK);g_inlineHookObj.ReHook();return 0; }

    完整項目

    完整項目請在這里下載,沒分也可以在這里github下載最新代碼,如果可以的話,幫忙點個星星喲。

    總結

    以上是生活随笔為你收集整理的C/C++:Windows编程—Inline Hook内联钩子(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 精品一区二区久久 | 久久久精品一区二区 | 国产精品第157页 | 丰满少妇在线观看bd | 亚洲午夜无码久久 | 久久精品欧美 | 国产精品一区二区不卡 | 成人黄色免费看 | 成人18视频免费69 | 在线观看污视频网站 | 亚洲精品久久久久avwww潮水 | 农村妇女毛片精品久久久 | 色av综合网| 好看的中文字幕av | 粉嫩久久99精品久久久久久夜 | 毛片久久久久 | 一区高清 | 欧美乱妇视频 | 色之久久综合 | 色综合狠狠 | 免费中文字幕日韩欧美 | 久久大 | 亚洲第一页在线观看 | 久久久www成人免费精品 | 欧美成人日韩 | 性欧美大战久久久久久久免费观看 | 999久久 | 蜜桃视频在线入口www | 87福利视频| 男人猛进女人爽的大叫 | 高潮疯狂过瘾粗话对白 | 天天插天天干 | 西西44rtwww国产精品 | 波多野结衣在线免费观看视频 | 日韩精品久久久久久免费 | 国产又粗又猛又黄又爽无遮挡 | 97在线观看视频免费 | 日韩免费在线 | 麻豆高清 | 极品白嫩的小少妇 | 久久66热这里只有精品 | aaa天堂| 免费看91| 精品女同一区二区三区 | 欧美性猛交xxxx黑人交 | 少妇被黑人到高潮喷出白浆 | 久草福利资源在线 | 亚洲天堂va | av人人干| 91av影视 | 久久日韩| 91国内在线视频 | 亚洲精品乱码久久久久 | 久久思 | 久久国产精品一区二区 | 精品成人免费视频 | 亚洲精品视频导航 | 黄色片18 | 丰腴饱满的极品熟妇 | 美日韩精品视频 | 一级特黄妇女高潮2 | 男人操女人网站 | 国产一国产二国产三 | 欧美黄在线 | 久久久久无码国产精品一区 | 91免费视频观看 | 国产精品久久精品三级 | 国产中文在线 | 日本欧美在线 | 99久久综合| 久久特黄| 成人福利在线视频 | 天天综合天天做天天综合 | 五月网站| a点w片 | 欧美精品一区二区三区久久 | 菲律宾av| 香港a毛片 | 66精品 | jizz中国少妇 | 中文字幕在线播放一区 | 久久亚洲国产精品 | 性巴克成人免费网站 | 国产偷自拍 | 自拍超碰| 久久av高潮av无码av喷吹 | 好看的av网址 | 欧美激情中文字幕 | 久久精品视频中文字幕 | 日韩人妻精品在线 | 爱情岛论坛亚洲线路一 | 欧美激情性做爰免费视频 | 日韩欧美中文在线观看 | 男生和女生操操 | 国产精品15p | 成人做爰100 | 日本一区视频 | 午夜激情一区 | 五月婷婷丁香六月 |