我正在学习反转 Visual C++ 对象。
我通常使用对它的交叉引用来CompleteObjectLocator找到对象的 vtable(或 VFT 的 VMT,不管你怎么称呼它),我之前在反汇编的二进制文件中找到了它(使用对对象的TypeDescriptor或的交叉引用ClassHierarchyDescriptor)。指向的指针CompleteObjectLocator是 vtable 的第 -1 个字段。
但是,由于某些类在我的程序中可能是抽象的,因此它们没有CompleteObjectLocators。我如何找到他们的虚拟表?
我知道程序将指向 vtable 的指针写入this对象的构造函数中,但是在我的程序中,构造函数内联在子类构造函数中,并且我没有看到可能是父类 vtable 的内存。
例如:
ClassA继承自ClassB(可能是抽象的)ClassC继承自ClassD(可能是抽象的)继承自(可能是抽象的)。我在BaseClassArray每个班级的 中找到了这些信息。- 我能够找到 vtable
ClassA并在其上使用交叉引用,我找到了它的构造函数 - 在
ClassA我的构造函数中,我看到程序使用 vtable ofClassC和 vtable ofClassA(构造函数是内联的,指向 vtable of 的指针ClassC被写入一个位置,三个指令之后它被指向 vtable of 的指针重写ClassA) - 我希望在
ClassB和ClassD的构造函数中看到一些使用 vtables 的工作ClassA。我希望指向 vtable of 的指针在ClassB与 vtables ofClassA和的工作之间做内存ClassC,但只有基本上什么都不做的指令,只将一些内容从寄存器移动到寄存器。 - 或者,如果 of 的构造
ClassA函数不能与ClassBand 的vtables 一起使用ClassD,我希望至少从那里调用它们的构造函数,这也不会发生。
我知道我能找到一个虚函数表动态,因为这将是第一个元素this,但我不知道在哪里(如果任何地方)this的ClassB并ClassD用。我可以静态地找到他们的 vtables 和构造函数吗?