在没有引用的情况下破解C ++对象的虚拟表

时间:2016-01-12 20:47:48

标签: c++ visual-studio virtual-functions vtable

我知道这个问题之前曾被问过,但这并不是我需要的,而且我试图操纵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,只需在本地实例上进行一些指针操作..

任何领先优势都会很棒。 感谢

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是先自己创建新的vtable:

class Helper : A {
  virtual void doSomething() override { Hack(); }
}

然后创建一个Helper对象,窃取其vtable指针,并将该vtable指针放在a中。

您的解决方案假定Dog的vtable与A的vtable有某种关联。几乎可以肯定不是这样。这些类型完全不相关。