在C++中有什麼辦法可以獲得真實地址的成員函數,或索引的vTable?得到虛擬成員函數的真實地址(或索引)
更新時間:
我不知道該指數的VTable和 我不知道地址
這裏的爲什麼我想知道這一點:
我想掛鉤DirectX的函數ID3DXFont-> DrawText。如果我知道vTable中的DrawText的索引,我可以將其替換爲掛鉤。但如何獲得索引?如果它能夠獲得真實地址,我可以在vTable中搜索它以獲取索引。
而不是特別的ID3DXFont-> DrawText,可能在將來會有一些其他功能,所以我想寫一個通用的鉤子函數。
這裏是我試過到目前爲止:
#include <iostream>
using namespace std;
struct cls {
virtual int fn1() {
cout << "fn1 called" << endl;
return 1;
}
virtual int fn2() {
cout << "fn2 called" << endl;
return 2;
}
};
template <typename fn_t>
DWORD fn_to_addr(fn_t fn) { // convert function to DWORD for printing
union U {
fn_t fn;
DWORD addr;
};
U u;
u.fn = fn;
return u.addr;
}
int main() {
cls c;
DWORD addr = fn_to_addr(&cls::fn2);
cout << hex << addr << endl;
}
在調試模式下,上面的代碼輸出跳錶的地址。 而在釋放模式中,& CLS :: FN2回報0x00401058,其中指出了一些優化代碼:
00401058 . mov eax, dword ptr [ecx] // get vptr
0040105A . jmp dword ptr [eax+4] // jmp to the second function (fn2)
兩者都不是真實地址。無論如何要做到這一點?
謝謝。
這是一個非常有趣的問題。由於您使用的是虛擬方法,因此它取決於您使用的編譯器。 – mathk
一般不可能。然而,閱讀[RTTI](http://en.wikipedia.org/wiki/Run-time_type_information),並解釋你爲什麼問你的問題....(爲什麼函數的機器地址對你很重要?) ! –
@ aj3423你是什麼意思的「真實地址」?虛擬內存概念如何? –