是否可以将虚拟地址作为成员函数指针的整数获取?

我试过了。

无效(AClass::* Test)();
测试=&AClass::TestFunc;
int num = *(int *)&Test;

但是所有要做的就是让我获得该函数的jmp的虚拟地址。我需要实际功能的虚拟地址。

最佳答案

我知道这很老了,但是由于没有有意义的主题答案,所以我继续。

首先需要考虑一些事情。
C++中的成员函数调用约定称为__thiscall。该约定几乎与__stdcall相同,唯一的不同之处在于,在进行有效调用之前,ECX设置为调用其方法的对象的指针this

为了说明这一点并同时回答您的问题,我们假设AClass类具有这样声明的成员函数:int AClass::myFunction(int a, int b),并且我们有一个名为AClassaClassObject实例。
这是一种相当骇人听闻的方法,可以完成您最初要求的操作,并在获取原始指针后“模拟”对AClass::myFunctionaClassObject调用:

// declare a delegate, __stdcall convention, as stated above
typedef int (__stdcall *myFunctionDelegate)(int a, int b);
// here's the 'hackish' solution to your question
char myFunctionPtrString[10];
sprintf(myFunctionPtrString, "%d", &AClass::myFunction);
int myFunctionPtr = atoi(myFunctionPtrString);
// now let's call the method using our pointer and the aClassObject instance
myFunctionDelegate myFunction = (myFunctionDelegate)myFunctionPtr;
// before we make the call, we must put a pointer to aClassObject
// in ECX, to finally meet the __thiscall calling convention
int aClassObjectPtr = (int)&aClassObject;
__asm{
     mov ecx, aClassObjectPtr
}
// make the call!
myFunction(2, 3);

当然,该实例可以是AClass类型的任何实例。

关于c++ - 成员函数的指针指向整数吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2929426/

10-12 23:51