逆向實用干貨分享,Hook技術第二講,之虛表HOOK


               逆向實用干貨分享,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,注入等等一系列的操作,都在最適合自己的場合能發揮出最大的作用.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM