【问题标题】:Identify C++ class members from asm listing从 asm 列表中识别 C++ 类成员
【发布时间】:2011-06-08 07:57:38
【问题描述】:

我正在尝试拆解并了解一个旧游戏的启动器(http://pastebin.com/raw.php?i=6Z4Xu3Cg 上的 asm 列表)。它是使用 Borland C++ 1995 构建的,并且在 asm 列表中有四个具有名称和 dtor 地址的类。如何找出其他函数属于哪个类?如何识别 vtable?毕竟,它应该包含所有内容。

顺便说一句,这与破坏复制保护无关。游戏太老了,没有任何形式的保护。我正在尝试做的事情与 OpenTTD 开发人员所做的一样。

谢谢你, 硬盘

【问题讨论】:

  • 你为什么假设所有函数都属于类? C++ 是一种多范式语言,并且允许按照 C 的非成员函数。类似地,可能没有 vtable - 它们仅为具有虚拟函数的类生成,并且仅用于运行时多态性。如果游戏只有 4 个类,则它们很可能对系统的正交方面进行建模并且没有继承关系。无论如何,vtable 只有指向虚函数(也许还有 RTTI)的指针——这不是理解整体的魔法钥匙。

标签: c++ assembly decompiling borland-c++


【解决方案1】:

不,它不包含所有内容。每个未动态取消引用的符号都可能已被条带化。反汇编程序可以做的是识别特定编译器输出的典型结构并赋予它一些意义。

【讨论】:

  • 对于 Borland C++ 编译器来说,tpid 结构之间的代码是否属于同一个类至少可以肯定吗?
  • 取决于链接器如何工作/工作的人可以假设这一点并且可能是正确的,但不会指望它。例如,您可以在两个 tpid 结构之间找到 WinMain,这是一个绝对不属于类的函数。要理解的一件重要事情是在程序集级别上没有类。你有一堆包含类成员变量的结构,以及一堆带有指向这些结构的指针的函数。一个类成员变量是指向 vtable 的指针。
  • 类成员变量的结构是什么,你是如何找到它们的?我唯一能找到的是 dword_4038F8,它出现在每个 dtor 和 ctor...
  • 那些结构在代码中是找不到的。您可能会找到它们的静态初始化程序。但是对于 CPU 来说,结构只是一块连续的内存。赋予结构其结构的是访问其成员的代码。因此,once 只能从函数使用内存的上下文中识别结构。例如,您可以跟踪传递了指针的哪些函数,以分析该指针的哪些偏移量以哪种方式访问​​函数。好旧的纯代码分析。 IDA Pro 就是针对这类事情开发的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 2019-01-12
相关资源
最近更新 更多