C++的CTTI技术分析
来源:互联网 发布:office mac版下载 编辑:程序博客网 时间:2024/04/27 22:26
C++的RTTI技术分析 编译器是vc2013
@VfTable包含ClassVfTable,类的虚表指针vfptr指向@VfTable+4的位置,即vfptr=@VfTable+4=ClassVfTable
我是为了统一一下才这样表示的.在类虚表位置-4的地方,也就是@VfTable-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: https://www.blackhat.com/presentations/bh-dc-07/Sabanal_Yason/Paper/bh-dc-07-Sabanal_Yason-WP.pdf
2.openrce igorsk 写的:http://www.openrce.org/articles/full_view/23
3.<<C++反汇编与逆向分析技术揭秘>>.
4.clang源代码: http://clang.llvm.org/doxygen/MicrosoftRTTI_8cpp_source.html
5.https://msdn.microsoft.com/en-us/library/ms879782.aspx
- C++的CTTI技术分析
- c分析面向对象的实现技术
- 汉王的技术分析
- LTO技术的分析
- 技术宅找女朋友的技术分析
- 技术宅找女朋友的技术分析
- 技术宅找女朋友的技术分析
- 技术宅找女朋友的技术分析
- 技术宅找女朋友的技术分析
- 技术宅找女朋友的技术分析
- 技术宅找女朋友的技术分析
- 技术宅找女朋友的技术分析
- 技术宅找女朋友的技术分析
- 技术宅找女朋友的技术分析
- IDS的技术分析和需求分析
- 基本面分析与技术分析的关系
- 容灾技术的分析
- 最近关心分析的技术
- jQuery--FQA
- 支持拖拽、缩放的ImageView
- ubuntu10.04分辨率设置
- Android自定义控件系列七:详解onMeasure()方法中如何测量一个控件尺寸(一)
- 海量数据相似度计算之simhash和海明距离
- C++的CTTI技术分析
- 关于url-pattern的写法和路径
- Linux下配置vlan网卡教程
- 第四章 最大子数组问题(股票最大收益) C++实现 算法导论
- Windows Phone Grid跨布局
- Android学习:java.lang.RuntimeException: setAudioSource failed异常处理
- 有唯一解的高斯消元模板
- # ##宏
- 第一个安卓JNI例子