返回介绍

20.2 RTTI 实现

发布于 2024-10-11 21:05:48 字数 837 浏览 0 评论 0 收藏 0

在第 8 章中,我们讨论了 C++ RTTI(运行时类型识别),并指出:编译器实现 RTTI 时并没有标准的方法。至于如何自动识别二进制文件中与 RTTI 有关的结构,IDA 的这项功能同样因所使用的编译器而异。毫不奇怪,对于使用 Borland 编译器编译的二进制文件,IDA 在这方面的功能最为强大。对自动识别微软 RTTI 数据结构感兴趣的读者,可以尝试使用 IDA Palace1 中 Igor Skochinsky 的 IDC 脚本或者 Sirmabus2 中的 Class Informer 插件,这将在第 23 章中深入讨论。

1. 参见 http://old.idapalace.net/idc/ms_rtti.zip
2. 参见 http://www.openrce.org/blog/browse/sirmabus

要了解某一特定编译器如何嵌入 C++ 类的类型信息,一种简单的方法是编写一个利用包含虚函数的类的简单程序。编译该程序后,你就可以将得到的可执行文件加载到 IDA 中,并搜索包含程序所使用的类的名称的字符串。无论使用什么编译器构建二进制文件,RTTI 数据结构始终会包含一个指向字符串的指针,该字符串则包含它所代表的类的名称。使用数据交叉引用,你将可以定位一个指向这类字符串的指针,并在那里找到候选的 RTTI 数据结构。最后,你需要将候选的 RTTI 结构与相关类的虚表关联起来。要完成这个任务,最好的办法是从候选的 RTTI 结构回溯数据交叉引用,直到到达一个函数指针表(虚表)。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文