RTTI结构详细分析(VC++)

对于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: 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/301930.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是VR、AR、MR、XR?

VR、AR、MR、XR的定义 VR虚拟现实是利用计算机技术创造虚拟世界&#xff0c;用户可以通过穿戴VR设备&#xff0c;进入虚拟现实的环境&#xff0c;感受身临其境的体验。 AR增强现实技术是将现实和虚拟世界结合在一起&#xff0c;用户可以通过手机、平板电脑等设备&#xff0c;看…

Weblogic安全漫谈(四)

黑名单机制必然会推动两种研究方向的发展&#xff1a;一是挖掘不在黑名单的新组件&#xff0c;是为绕过规则&#xff1b;二是发掘检查的盲区&#xff0c;是为绕过逻辑。 CVE-2020-14756 二次反序列化具有对抗检查逻辑的天生丽质&#xff0c;在CVE-2018-2893中就有利用字节数组…

文件夹重命名:如何一键完成简体中文文件夹名到繁体中文的批量转换

随着科技的发展&#xff0c;人类越来越依赖计算机和电子设备进行文件管理。在这个过程中&#xff0c;经常会遇到要将简体中文文件夹名转换为繁体中文的情况。这有助于统一文件名的格式&#xff0c;也能提高文件的可读性和检索性。那如何一键完成简体中文文件夹名到繁体中文的批…

【精通C语言】:分支结构switch语句的灵活运用

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; C语言详解 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、switch语句1.1 语法1.2 代码示例 二、switch的控制语句2.1 break2.2 defualt子句 三、…

前端下载文件问题之如何获取报错信息

问题&#xff1a;点击下载后。接口会生成并返回文件流。在极端情况下接口数据返回异常&#xff0c;需要抛出错误信息&#xff0c;比如后端拼接错误情况、空文件情况。 难点&#xff1a;responseType设置为Blob后&#xff0c;返回内容为二进制文件流&#xff0c;从而无法获取错误…

03、Kafka ------ CMAK(Kafka 图形界面管理工具) 下载、安装、启动

目录 CMAK&#xff08;Kafka 图形界面管理工具&#xff09;下载安装启动打开 cmak 图形界面 CMAK&#xff08;Kafka 图形界面管理工具&#xff09; Kafka本身并没有提供Web管理工具&#xff0c;而是推荐使用bin目录下各种工具命令来管理Kafka&#xff0c; 这些工具命令其实用起…

安达发|基于APS排程系统的PDM功能

APS系统&#xff08;Advanced Planning and Scheduling&#xff0c;先进计划与排程&#xff09;是一种基于APS系统&#xff08;Advanced Planning and Scheduling&#xff0c;先进计划与排程&#xff09;是一种基于供应链管理和生产管理的综合性软件系统。它通过整合企业内外部…

安达发APS排产软件之PDM产品工艺数据管理

PDM&#xff08;Product Data Management&#xff0c;产品数据管理&#xff09;是一种用于管理产品全生命周期内所有与产品相关的信息和数据的技术。在制造业中&#xff0c;PDM系统被广泛应用于产品工艺数据管理&#xff0c;以提高生产效率、降低成本、保证产品质量和缩短产品上…

Vue3+Pinia实现持久化动态主题切换

PC端主题切换大家都用过&#xff0c;下面用Vue3Pinia实现一下这个过程; 【源码地址】 1、准备工作 npm install pinia npm install pinia-plugin-persist2、基础配置 // main.js import { createApp } from vue import App from ./App.vue import bootstrap from "../bo…

Java面向对象(抽象类,接口,内部类)

文章目录 今日内容教学目标 第一章 抽象类1.1 概述1.1.1 抽象类引入 1.2 abstract使用格式1.2.1 抽象方法1.2.2 抽象类1.2.3 抽象类的使用 1.3 抽象类的特征1.4 抽象类的细节1.5 抽象类存在的意义 第二章 接口2.1 概述2.2 定义格式2.3 接口成分的特点2.3.1.抽象方法2.3.2 常量2…

麒麟KYLINOS禁用IPV6地址

原文链接&#xff1a;麒麟KYLINOS操作系统上禁用IPv6的方法 hello&#xff0c;大家好啊&#xff01;今天我要给大家介绍的是在麒麟KYLINOS操作系统上禁用IPv6的方法。IPv6是最新的网络通信协议&#xff0c;旨在解决IPv4地址耗尽的问题。然而&#xff0c;在某些特定的网络环境或…

MYSQL 索引使用规则

索引失效 最左前缀法则 where之后写的顺序不重要&#xff0c;存在就可以 范围查询后面的索引查询失效&#xff08;比如>&#xff09;,但是>或者<是不会失效的 不要在索引列上进行运算操作&#xff0c;否则索引失效。 字符串类型字段不加引号索引会失效 尾部模糊匹配…

ThreadLocalRandom类原理剖析

ThreadLocalRandom 类是JDK7在JUC包下新增的随机数生成器&#xff0c;它弥补了Random类在多线程下的缺陷。 Random 类及其局限性 在JDK7之前包括现在&#xff0c;java.util.Random都是使用比较广泛的随机数生成工具类&#xff0c;而且java.lang.Math中的随机数生成也使用的是…

网安面试三十到题(结束)

121 有文件上传了漏洞了&#xff0c;linux下怎么找xx.conf的文件 目录遍历,目录扫描 122 反序列化漏洞原理 ## 你要把别人序列化好的文件进行反序列化进行利用&#xff0c;但是在序列化的过程中&#xff0c;被别人注入了攻击代码、魔 法函数之类的&#xff0c;当你反序列化的时…

花为缘积萨伯爵名表工艺之美,传承卓越

腕表是时间的载体&#xff0c;也是品味的象征。在现代人眼中&#xff0c;它们不仅仅是时间的工具&#xff0c;更是一种艺术形式。在制表工艺的殿堂中&#xff0c;花为缘积萨伯爵名表以其独特的创造力和严谨缜密的要求&#xff0c;创作了一系列典范之作&#xff0c;将技术与美学…

伦敦银1盎司等于多少克?

1盎司的伦敦银大概等于31克&#xff0c;用于衡量伦敦银重量的“盎司”&#xff0c;是国际贵金属市场上专用的计量单位&#xff0c;它的全称是金衡盎司&#xff0c;英文的名字是troy ounce&#xff0c;它与西方日常用于计算重量的单位常衡盎司也不一样&#xff0c;一金衡盎司约等…

DTM分布式事务

DTM分布式事务 从内网看到了关于事务在业务中的讨论&#xff0c;评论区大佬有提及DTM开源项目[https://dtm.pub/]&#xff0c;开学开学 基础理论 一、Why DTM ​ 项目产生于实际生产中的问题&#xff0c;涉及订单支付的服务会将所有业务相关逻辑放到一个大的本地事务&#xff…

【性能测试入门】:压力测试概念!

压力测试可以验证软件应用程序的稳定性和可靠性。压力测试的目标是评估软件在极端负载条件下的鲁棒性和错误处理能力&#xff0c;并确保软件在紧急情况下不会崩溃。它甚至可以进行超出软件正常工作条件的测试&#xff0c;并评估软件在极端条件下的工作方式。 在软件工程中&…

简单介绍Java 的内存泄漏

java最明显的一个优势就是它的内存管理机制。你只需简单创建对象&#xff0c;java的垃圾回收机制负责分配和释放内存。然而情况并不像想像的那么简单&#xff0c;因为在Java应用中经常发生内存泄漏。 本教程演示了什么是内存泄漏&#xff0c;为什么会发生内存泄漏以及如何预防…

2024年第十届计算机与技术应用国际会议(ICCTA 2024)即将召开!

​ ​ 2024年第十届计算机与技术应用国际会议&#xff08;ICCTA 2024&#xff09; 会议时间&#xff1a;2024年5月15-17日 会议地点&#xff1a;奥地利维也纳 (线上线下会议) 会议官网&#xff1a; Home_ICCTA 2024 | Vienna, Austria 组织单位&#xff1a; 奥地利FH JOANN…