我有以下用于说明虚拟方法的C ++代码:
class X{
O a;
H b;
virtual void c() = 0;
virtual void d() = 0;
};
class Y : public X{
virtual void c();
virtual void d();
};
在MSVC上输出以下vtable布局:
1> class X size(24):
1> +---
1> 0 | {vfptr}
1> 8 | a
1> 16 | b
1> +---
1>
1> X::$vftable@:
1> | &X_meta
1> | 0
1> 0 | &X::c
1> 1 | &X::d
1>
1> X::c this adjustor: 0
1> X::d this adjustor: 0
1>
1>
1> class Y size(24):
1> +---
1> | +--- (base class X)
1> 0 | | {vfptr}
1> 8 | | a
1> 16 | | b
1> | +---
1> +---
1>
1> Y::$vftable@:
1> | &Y_meta
1> | 0
1> 0 | &Y::c
1> 1 | &Y::d
1>
1> Y::c this adjustor: 0
1> Y::d this adjustor: 0
1>
1>
阅读C ++对象模型内部后,我想知道上面的vtable布局中的类型信息是什么?
在书中(我认为他们使用GCC vtable布局),类型信息将在vtable的第0个元素中。对于MSVC而言,这不是一个虚拟函数 - 所以存储的类型信息在哪里?这是"_meta"
是什么?
答案 0 :(得分:5)
这就是“_meta”是什么?
是。除了多态元数据之外,您认为这意味着什么?
答案 1 :(得分:3)
对于MSC,您会发现在RTTICompleteObjectLocator
上搜索更多信息很有用,这些信息没有完全记录,但看起来大致如下:
struct RTTICompleteObjectLocator
{
DWORD signature;
DWORD offset;
DWORD cdOffset;
struct TypeDescriptor*;
struct RTTIClassHierarchyDescriptor*;
};
它确实位于vtable附近,因此可以通过生成的组件中的指针调整轻松定位。
<子> 这是我在书签中保存了几年的来源:P. Sabanal, M.Yason. Reversing C++, Black Hat DC 2007 子>