逆向實用干貨分享,Hook技術第二講,之虛表HOOK
正好昨天講到認識C++中虛表指針,以及虛表位置在反匯編中的表達方式,這里就說一下我們的新技術,虛表HOOK
昨天的博客鏈接: http://www.cnblogs.com/iBinary/p/8001749.html
PS: 今天所講內容和昨天沒有管理,不過理解了昨天的帖子結合今天的知識,你就可以找東西練手了,比如你可以結合的知識,隨便找一款C++寫的游戲,將它的虛表HOOK了,這樣你想干啥就干啥 ^_^
一丶認識虛表指針以及虛表
講解之前我們要認識一下類在內存中的表現形式,以及認識虛表指針.
1.首先我們知道,當類中有虛函數的時候,則會生成虛表指針,虛表指針指向了虛表,虛表中保存的則是當前類中所有虛函數的函數地址.
內存結構圖:

第一個是類的內存結構,第二個是虛表.
那么我們就有想法了,當我們調用虛函數的時候,會通過虛表指針,找到虛表,而后找到虛函數地址
那么現在我們是否可以將虛函數的地址改為我們的函數地址.
聰明: 其實就是很簡單,理解了內存結構,理解了虛表指針,虛表那么就可以進行操作了.
我們只需要將虛表中的虛函數地址更改成我們的即可.
上面都是原理,下面說一下步驟
總共分為三個步驟 1.獲得虛表指針 2.修改虛表的內存保護屬性 3.修改虛表中的虛函數地址為我們的函數地址. 很簡單三步
高級代碼:
#include "stdafx.h" #include <windows.h> class MyTest { public: MyTest(); ~MyTest(); void print(); virtual void ShowHelloWorld(); int m_Number; }; MyTest::MyTest() { printf("MyTest::MyTest()\r\n"); } MyTest::~MyTest() { printf("MyTest::~MyTest()\r\n"); } void MyTest::ShowHelloWorld() { printf("Hello World!\n"); } void ShowData() //我們將虛表中的函數地址換為我們的函數地址 { printf("有木有被坑的感覺\r\n"); } void MyTest::print() { printf("void MyTest::print()\r\n"); } int main(int argc, char* argv[]) { MyTest test; MyTest &obj = test; //可以虛調用 int DwAddress = *(int *)&test; //第一步,獲取自己的虛表指針 obj.ShowHelloWorld(); //虛函數調用,測試作用 DWORD dwOld = 0; //第二步修改虛表指針的內存保護屬性,下方更改虛表 VirtualProtect((void *)DwAddress,0x1000,PAGE_EXECUTE_READWRITE,&dwOld);//修改內存保護屬性,其地址是虛表指針地址 (*(int *)DwAddress) = (int)ShowData;//第三步,HOOK,也就是將我們的函數地址,寫入到虛表中. obj.ShowHelloWorld(); //重新調用,看看是否被HOOK return 0; }
上面代碼可以直接拷貝粘貼, VS2013測試成功.
貼上測試圖:

這里只是簡單的HOOK了一下自己類的虛表,你可以通過自己的分析,找到別的進程中的虛表,然后更改.
當然這個HOOK很簡單,也有自己的適用場合,俗話說,各種HOOK,注入等等一系列的操作,都在最適合自己的場合能發揮出最大的作用.
