我通过取消引用来调用 vmt 上的虚拟方法,直到获得指向该方法的指针。
这一切都很好,但是,我将如何完全更改指向对象上 VM 表的指针?
例子:
聚丙烯; // 指向它的默认 VM 表
聚丙烯乙; //指向一个完全不同的VM表
A->MethodOne() // 如上所述的调用
B->MethodOne() // 调用完全不同的方法,因为我们将其指向 VM 表的指针覆盖为具有不同方法指针的备用表
我将如何做到这一点?
我的代码:
#include <Windows.h>
#include <iostream>
class PP
{
public:
PP() { }
~PP() { }
virtual void MethodOne() { std::cout << "1" << std::endl; }
virtual void MethodTwo() { std::cout << "2" << std::endl; }
};
typedef void (*MyFunc)(void);
int main()
{
PP* A = new PP();
//(*(void(**)(void))(*(DWORD*)A + (4*1)))();
( *(MyFunc*) ( *(DWORD*)A + (4*0) ) )(); // call index 0 (4bytes*0)
A->MethodOne();
A->MethodTwo();
system("PAUSE");
delete A;
return 0;
}