是否可以将虚拟地址作为成员函数指针的整数获取?
我试过了。
无效(AClass::* Test)();
测试=&AClass::TestFunc;
int num = *(int *)&Test;
但是所有要做的就是让我获得该函数的jmp的虚拟地址。我需要实际功能的虚拟地址。
最佳答案
我知道这很老了,但是由于没有有意义的主题答案,所以我继续。
首先需要考虑一些事情。
C++中的成员函数调用约定称为__thiscall。该约定几乎与__stdcall相同,唯一的不同之处在于,在进行有效调用之前,ECX
设置为调用其方法的对象的指针this
。
为了说明这一点并同时回答您的问题,我们假设AClass
类具有这样声明的成员函数:int AClass::myFunction(int a, int b)
,并且我们有一个名为AClass
的aClassObject
实例。
这是一种相当骇人听闻的方法,可以完成您最初要求的操作,并在获取原始指针后“模拟”对AClass::myFunction
的aClassObject
调用:
// 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/