首页
社区
课程
招聘
[原创]RTTI结构详细分析(VC++)
发表于: 2015-1-23 13:48 12689

[原创]RTTI结构详细分析(VC++)

2015-1-23 13:48
12689

对于RTTI结构的资料真的屈指可数,类的逆向也一直是一个不好弄的问题.对此我只想贡献我的一份力量.
文中我不会分析类的内存布局,因为有很多资料已经分析的挺好的了(见参考资料).
但是现有我能找到的资料对RTTI结构的表述不完整,或者表述模糊不清,参考Clang的部分源码后,
我在他们的基础上,补充,扩展了一下RTTI的结构信息.但是仍然也有一部分我也不甚清楚,见谅.

首先给出RTTI结构的完整结构图(图中->是表示两个结构有关联关系):


@VfTable包含ClassVfTable,类的虚表指针vfptr指向@VfTable+4的位置,即vfptr=@VfTable+4=ClassVfTable
我是为了统一一下才这样表示的.在类虚表位置-4的地方,也就是ClassVfTable-4.指向CompleteObjectLocator结构.
现在对每一个结构进行简单的解释.
CompleteObjectLocator
{
+0 isImageRelative: DWORD
+4 VfOffsetToTop: DWORD
+8 VFPtrOffset: DWORD
+12 pTypeDescriptor: TypeDescriptor*
+16 pClassHierarchyDescriptor: ClassHierarchyDescriptor *
[+20 -pSelf: DWORD *] //只在X64时存在,指向自身
}
isImageRelative: 
RTTI结构中的所有指针是否是与映象基地址相关,这是X64与X32的区别.
当是X32时为0,指针含义没有变.但在X64时为1,此时RTTI结构中所有指针不再是指针,而是相对于基地址的偏移量.

VfOffsetToTop: vftable 在类中的偏移

VFPtrOffset:  
这个含义比较复杂.他是在有虚基类被继承多次,并且虚基类的(纯)虚函数被多次覆写时存在.
是虚表指针相对与最近的一个虚基类的偏移.

TypeDescriptor
{
+0 pVFtable: DWORD* //指向虚表
+4 Spare: DWORD     //存储运行时数据,静态分析时总是0.
+8 pTypeInfoString: char* //指向类名.
}

ClassHierarchyDescriptor
{
+0 Unknown: DWORD = 0  //我没查到它的信息.
+4 ClassHierarchyFlags: DWORD
+8 NumBaseClass: DWORD //基类数量,包括自己,并且对同一基类多次继承(菱形继承)会重复计算的.
+12 pBaseClassDescriptorArray: DWORD** //指向BaseClassDescriptor指针数组
}
说一下ClassHierarchyFlags的含义.
定义枚举如下:
enum ClassHierarchyDescriptorFlags{
00252     HasBranchingHierarchy = 1,
00253     HasVirtualBranchingHierarchy = 2,
00254     HasAmbiguousBases = 4
00255   };
ClassHierarchyFlags是根据类是否是多继承,是否是多虚继承,是否有纯虚基类来对上述
枚举量进行异或组合.例如ClassHierarchyFlags=HasBranchingHierarchy|HasVirtualBranchingHierarchy,
表示的含义已经很清楚了.
还剩最后一个结构了.
BaseClassDescriptor
{
+0 pTypeDescriptor: DWORD TypeDescriptor*
+4 NumContainedBaseClass: DWORD  //基类数量,包括自己,并且对同一基类多次继承(菱形继承)会重复计算的.
+8 OffsetInVBase: DWORD   //vftable 在虚基类中的偏移
+12 VBPtrOffset: DWORD  //vbtable(包含所有虚基类的vftable的偏移的一个表)的偏移.此处参考后面列出的参考资料[1].
+16 OffsetInVBTable: DWORD  //类vftable指针在vbtable中的偏移.
+20 BaseClassHierarchyFlags: DWORD
+24 pClassHierarchyDescriptor: ClassHierarchyDescriptor*
}
对于BaseClassHierarchyFlags定义如下枚举:
enum BaseClassDescriptorFlags
{
IsPrivateOnPath = 1 | 8,
IsAmbiguous = 2,
IsPrivate = 4,
IsVirtual = 16,
HasHierarchyDescriptor = 64
};
BaseClassHierarchyFlags是根据自己是否被私有继承,是否是纯虚类,是否对基类私有继承,是否为虚基类,是否
有HierarchyDescriptor结构对上述枚举量进行异或组合.

我是在ms2013上进行验证的.我不敢保证Microsoft的编译器RTTI结构一直都没有变化.
文中还有一些地方解释并不清楚,见谅.要是Microsoft把RTTI结构公开就没这么多事儿了.

参考资料:
1.Reversing C++ - Black Hat: 4eaK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2T1L8r3q4U0K9$3S2S2N6q4)9J5k6h3y4G2L8g2)9J5c8Y4m8J5k6i4y4W2L8Y4c8S2N6r3W2G2L8Y4y4Q4x3V1k6T1K9q4)9J5k6r3c8U0i4K6u0V1x3o6N6Q4x3V1k6e0j5h3u0S2L8X3q4D9i4K6g2X3h3h3q4K6L8$3&6Q4x3V1k6b7j5i4m8W2M7W2)9J5c8X3u0Z5i4K6u0V1k6r3y4Q4x3X3b7H3y4#2)9J5k6q4y4S2j5X3q4F1j5h3I4Q4y4h3k6k6j5i4y4G2L8W2)9J5k6q4N6b7i4K6u0W2M7r3c8X3
2.openrce  igorsk 写的:5e4K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3!0H3k6h3&6J5j5$3g2Q4x3X3g2G2M7X3N6Q4x3V1k6S2M7Y4c8A6j5$3I4W2M7#2)9J5c8X3k6#2L8r3I4Q4y4h3k6$3K9h3g2%4i4K6u0r3x3U0x3`.
3.<<C++反汇编与逆向分析技术揭秘>>.
4.clang源代码: c5dK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3y4D9j5h3&6Y4i4K6u0W2L8r3I4$3L8g2)9J5k6h3!0J5k6#2)9J5c8X3c8G2P5s2W2Y4k6h3&6Q4x3V1k6y4K9h3y4J5L8%4y4G2k6Y4c8d9g2q4c8u0i4K6g2X3z5r3y4H3M7q4)9#2k6Y4y4G2N6i4u0U0k6g2)9J5k6h3S2@1L8h3H3`.
5.7bbK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0M7$3c8F1i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3k6h3&6Q4x3X3c8#2M7#2)9J5c8X3I4A6j5Y4u0S2M7Y4W2Q4x3V1k6E0M7K6R3%4z5e0M7^5x3W2)9J5k6h3q4K6M7s2R3`.


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 4
支持
分享
最新回复 (7)
雪    币: 16711
活跃值: (2783)
能力值: ( LV9,RANK:147 )
在线值:
发帖
回帖
粉丝
2
先留名,这个今晚得回去看一下.
2015-1-23 13:57
0
雪    币: 188
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不错不错,谢谢分享。
2015-1-23 13:58
0
雪    币: 200
活跃值: (38)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
这个不错。之前为了研究这个还去看了vc的crt代码。感觉现有的资料对于虚拟继承部分都说得不是很详细。
2015-1-23 14:43
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个好, 感谢
2015-1-23 15:42
0
雪    币: 2559
活跃值: (176)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
不错不错,谢谢分享。
2015-1-27 15:14
0
雪    币: 4
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
真心请教:有没有介绍RTTI之类的书籍?或者推荐看哪些资料可以学习这类的东西?
2018-4-19 01:18
0
雪    币: 66
活跃值: (3269)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
很棒的参考啊  RTTI是逆向中宝贵的数据 
2019-5-23 16:14
0
游客
登录 | 注册 方可回帖
返回