我知道这个问题之前曾被问过,但这并不是我需要的,而且我试图操纵this thread的答案,我无法得到我正在寻找的结果。 所以基本上我想要做的是操纵C ++对象中的虚拟表,所以在调用对象的一个函数时它将调用另一个函数 它当然仅用于教育目的。 我的代码是这样的:
filesize()
狗继承自动物,如:
class Animal
{
private:
int height;
int length;
int type;
public:
virtual void makeNoise()
{
}
virtual void sleep()
{
}
};
另一个A类:
class Dog : public Animal
{
public:
virtual void sleep() override
{
cout << "Going to sleep for Dog" << endl;
}
virtual void makeNoise() override
{
cout << "bark bark" << endl;
}
};
函数Hack是我想要覆盖的函数A-&gt; doSomething()
class A
{
public:
virtual void doSomething(void)
{
cout << "did nothing" << endl;
}
};
主要功能:
void Hack()
{
cout << "Hacked!" << endl;
}
现在问题是我该怎么做:
void main()
{
int x = 0, y = 0, z = 0;
A* a = new A();
Animal * dog = new Dog();
someFunctionToManipulateVirtualTable(dog); //function get an object of type Dog but should hack into an object of type A's vtable
a->doSomething(); //should print "Hacked!"
}
到目前为止,我尝试过不成功,从main获取指针通过dog引用,然后获取虚拟表指针并用Hack的地址覆盖它,问题是,虚拟表位于只读地址位置,I设法使用A类的本地实例破解vtable,只需在本地实例上进行一些指针操作..
任何领先优势都会很棒。 感谢
答案 0 :(得分:0)
最简单的解决方案是先自己创建新的vtable:
class Helper : A {
virtual void doSomething() override { Hack(); }
}
然后创建一个Helper
对象,窃取其vtable指针,并将该vtable指针放在a
中。
您的解决方案假定Dog
的vtable与A
的vtable有某种关联。几乎可以肯定不是这样。这些类型完全不相关。