我正在学习反转 Visual C++ 对象。
我通常使用对它的交叉引用来CompleteObjectLocator
找到对象的 vtable(或 VFT 的 VMT,不管你怎么称呼它),我之前在反汇编的二进制文件中找到了它(使用对对象的TypeDescriptor
或的交叉引用ClassHierarchyDescriptor
)。指向的指针CompleteObjectLocator
是 vtable 的第 -1 个字段。
但是,由于某些类在我的程序中可能是抽象的,因此它们没有CompleteObjectLocator
s。我如何找到他们的虚拟表?
我知道程序将指向 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
函数不能与ClassB
and 的vtables 一起使用ClassD
,我希望至少从那里调用它们的构造函数,这也不会发生。
我知道我能找到一个虚函数表动态,因为这将是第一个元素this
,但我不知道在哪里(如果任何地方)this
的ClassB
并ClassD
用。我可以静态地找到他们的 vtables 和构造函数吗?