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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HOOK虚函数

發布時間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HOOK虚函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 聲明
  • 過程
    • 過程綜述
    • 代碼講解
  • 正常代碼:
  • Hook后:

聲明

首先呢,這里會牽扯到虛函數,建議先看看以下博客(前三章就行),
c++類成員函數指針
詳解虛函數的實現過程之初探虛表(1)
詳解虛函數的實現過程之單繼承(2)
詳解虛函數的實現過程之多重繼承(3)
詳解虛函數的實現過程之虛基類(4)
詳解虛函數的實現過程之菱形繼承(5)

看了之后大家會了解到:虛函數的地址存放在虛表里面,虛表地址放在對象里面,虛表地址都是放在對象的前四個字節。

所以我們可以進行把存放在 虛表里面這個函數地址值給替換(這也就是Hook手法之一)了,當進行調用虛函數時,是不是就可以改變程序的走向,和原來不同。

過程

class Base { public:virtual void Print() {printf("這是一個虛函數");} }; void Myprint() {printf("這是一個普通函數");}

過程綜述

Base類里面有個虛函數,虛表地址存放在對象的前四個字節里面,然后虛函數地址存放在虛表的前四個字節里面,
用Myprint函數地址,把虛表里面前四個字節的地址值給替換了,這樣就Hook成功。

代碼講解

  • 創建一個Base對象,然后用指針指向它
  • Base pb;Base* Pb = &pb;

    或者這樣也行

    Base* Pb = new Base();
  • 找到虛表中存放虛函數的地址的地址單元
  • DWORD* pVtAddr = (DWORD*)*(DWORD*)Pb;

    首先,把這個指針的范圍放在四個字節,因為虛表地址就四個字節,所以有了(DWORD *),然后出內容,加個*號,即*(DWORD *),取出內容后,內容也就是虛表的地址值,此時這個指針也就指向了這個地址值,范圍是整個虛表,然后還要強轉一下范圍(DWORD*)(因為函數的地址值是前4個字節),所以就有了(DWORD*)*(DWORD*)Pb

  • 修改一下這個地址單元的屬性(原來是不可寫的,改為可寫)
  • DWORD dwOldProtect = 0; VirtualProtect(pVtAddr, 4, PAGE_READWRITE, &dwOldProtect);
  • 然后用函數地址值來覆蓋虛表中存放虛函數的地址地址單元
  • *pVtAddr = (DWORD)Myprint;
  • 調用函數
  • Pb->Print();
  • 如果利用Base* Pb = new Base();出來的堆空間,別忘了把它delete掉
  • delete Pb;

    正常代碼:

    #include <iostream> #include<Windows.h> class Base { public:virtual void Print() {printf("這是一個虛函數");} };void Myprint() {printf("這是一個普通函數");} int main() {Base* Pb = new Base();Pb->Print();delete Pb;return 0; }

    Hook后:

    #include <iostream> #include<Windows.h> class Base { public:virtual void Print() {printf("這是一個虛函數");}};void Myprint() {printf("這是一個普通函數");} int main() {Base* Pb = new Base();DWORD* pVtAddr = (DWORD*)*(DWORD*)Pb;DWORD dwOldProtect = 0;VirtualProtect(pVtAddr, 4, PAGE_READWRITE, &dwOldProtect);*pVtAddr = (DWORD)Myprint;Pb->Print();delete Pb;return 0;}

    總結

    以上是生活随笔為你收集整理的HOOK虚函数的全部內容,希望文章能夠幫你解決所遇到的問題。

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