查找没有完整对象定位器的 vtable

逆向工程 C++ 虚表 虚函数
2021-06-27 14:45:02

我正在学习反转 Visual C++ 对象。

我通常使用对它的交叉引用来CompleteObjectLocator找到对象的 vtable(或 VFT 的 VMT,不管你怎么称呼它),我之前在反汇编的二进制文件中找到了(使用对对象的TypeDescriptor的交叉引用ClassHierarchyDescriptor)。指向的指针CompleteObjectLocator是 vtable 的第 -1 个字段。

但是,由于某些类在我的程序中可能是抽象的,因此它们没有CompleteObjectLocators。我如何找到他们的虚拟表?

我知道程序将指向 vtable 的指针写入this对象的构造函数中,但是在我的程序中,构造函数内联在子类构造函数中,并且我没有看到可能是父类 vtable 的内存。

例如:

  • ClassA继承自ClassB(可能是抽象的)ClassC继承自ClassD(可能是抽象的)继承自(可能是抽象的)。我在BaseClassArray每个班级的 中找到了这些信息
  • 我能够找到 vtableClassA并在其上使用交叉引用,我找到了它的构造函数
  • ClassA的构造函数中,我看到程序使用 vtable ofClassC和 vtable of ClassA(构造函数是内联的,指向 vtable of 的指针ClassC被写入一个位置,三个指令之后它被指向 vtable of 的指针重写ClassA
  • 我希望在ClassBClassD的构造函数中看到一些使用 vtables 的工作ClassA我希望指向 vtable of 的指针在ClassB与 vtables ofClassA的工作之间做内存ClassC,但只有基本上什么都不做的指令,只将一些内容从寄存器移动到寄存器。
  • 或者,如果 of 的构造ClassA函数不能与ClassBand 的vtables 一起使用ClassD,我希望至少从那里调用它们的构造函数,这也不会发生。

我知道我能找到一个虚函数表动态,因为这将是第一个元素this,但我不知道在哪里(如果任何地方)thisClassBClassD用。我可以静态地找到他们的 vtables 和构造函数吗?

0个回答
没有发现任何回复~