2013-04-09 98 views
0

我正在閱讀某人的代碼,他正在調用這樣的函數。該塊中的「this」是一個指向虛擬方法表的指針,他正在使用偏移量來調用表中的函數。如果你想知道這是一件黑客事情。這是怎麼回事?

__asm 
{ 
    MOV EDI, this 
    LEA ECX, [EDI + 0x4] 
    MOV EDX, DWORD PTR DS:[ECX] 
    CALL [EDX + 0x24] 
} 

他的代碼更簡單位,只是稱「這個」 +偏移,但我對什麼是在這個事情感到困惑。我可以發佈Ida的vtable轉儲,如果這樣會有所幫助的話。

+0

哦,是的,該函數返回一個指向結構的指針,如果有幫助的話。 – haze 2013-04-09 03:34:43

+0

你能澄清一下「發生了什麼」的含義嗎?你是否要求解釋個別裝配說明?或者是「個別裝配說明」是你正在尋找的答案? – 2013-04-09 03:47:01

+0

我只想知道作者是如何從0xD4獲得偏移量的。另外,什麼是「DWORD PTR DS:[ECX]」部分在做什麼?這幾乎是我想要弄清楚的。 – haze 2013-04-09 03:54:31

回答

0

看起來像多重繼承。在這種情況下,每個繼承的類接口都有單獨的vtables。因此,2nd和3rd指令計算指定的繼承類接口的vtable的開始。調用是顯而易見的,24只是一個幻數,是在該繼承類中調用的函數的已知偏移量。

0

this在C++中是一個關鍵字,它可以在對象範圍內用來表示對象本身。

class A{ 
    private: 
     int x; 

    void method(){ 
     this->x = 5; //"this" is a pointer to the object itself 
    } 
}; 

在本例中,「this」是A* const

+0

感謝您的迴應,但我知道「這」是什麼。我在問這個代碼中作者究竟做了什麼。他以某種方式得到一個遠離基地址的0xD4的函數,而我無法弄清楚如何。 – haze 2013-04-09 03:51:56

+0

對不起,我誤解了。 – 2013-04-09 03:58:00