从 x86-64 可执行文件中查找类和函数名称

Posted

技术标签:

【中文标题】从 x86-64 可执行文件中查找类和函数名称【英文标题】:Finding class and function names from an x86-64 executable 【发布时间】:2019-02-27 02:37:46 【问题描述】:

我想知道在反转应用程序时是否总是有可能以某种方式获取函数和类名。 (在这种情况下是游戏)我已经尝试了大约 1 个月来扭转游戏(刺客信条团结(铁砧引擎)),但仍然没有获得函数名称的运气。我找到了一种获取类名的方法,但对函数名一无所知。 所以我的问题是,是否可以通过文档实际获取函数名称并创建层次结构。 (我这样做是为了更好地倒车和学习新事物(asm x64))

感谢任何与反转类/结构体相关的提示和技巧。

【问题讨论】:

【参考方案1】:

不,编译后的代码不需要函数和类名,它们通常不是已剥离符号表的可执行文件的一部分。

例外情况是跨 DLL 边界的调用,您可能会得到一些包含函数和类名称的错位 C++ 名称,或者如果在发布版本中有任何错误检查/断言消息,那么某些名称可能会出现在字符串中.

带有 RTTI(运行时类型信息)的 C++ 可能在某处具有类型名称,可能将 vtable 指针映射到字符串,或者对于没有虚拟成员的类,可能只有在实际使用过 typeid 时。 (或者如果在禁用 RTTI 的情况下编译,则根本没有。activate RTTI in c++)

我认为即使是异常处理也不需要二进制文件中的类名。

除此之外,编译后的二进制文件中不需要类名或函数名。绝对不在机器代码本身;这当然是所有指针/相对偏移量,即使对于具有虚函数的类也是如此。 How do objects work in x86 at the assembly level?.

C++ 通常不支持自省,这与 Java 不同,因此默认情况下,您要查找的任何信息都不需要在任何位置的可执行文件中。

【讨论】:

啊,好吧:/您知道如何轻松检查您是否启用了 RTTI? @IHateAndLoveASM:不知道。我不知道它会创建什么数据/元数据,也不知道在其中搜索带有:: 的字符串是否可行。大多数游戏发行商都希望难以对其代码进行逆向工程,因此他们不太可能在启用 RTTI 的情况下进行编译。 RTTI 在很长一段时间内也招致了相当多的运行时间损失并且使二进制文件变得臃肿(早在 2000 年左右,当时我正在为 Windows 开发游戏),所以我们当然没有使用任何这些 C++ 部分。不确定当前编译器的状态如何(也许 RTTI 现在可以负担得起),但可能是游戏开发人员正在使用许多较旧的工具/库,并且由于惯性,如果没有别的原因,他们仍然更愿意不使用 RTTI。 RTTI还提供了游戏开发中不常见的问题的解决方案,如果你几乎没有遇到其中一个问题,通常可以通过其他方式解决并获得合理的结果 @IHateAndLoveASM 顺便说一句,没有来源的 SW 分发是“僵尸”,它可能需要数年才能最终消失,但你的努力有点“浪费”时间(除非你确实改进了你的通过这个练习的编程技巧,所以我在“浪费”周围使用引号)。而当你想修改一些软件时,修改源代码效率更高。因此,当您的工作将从探索经验转向乏味的机械逆向工程时,请确保您抓住了这一点,然后让 ACU 游戏继续前进,并专注于更有意义的 [with future] 分布式软件)。

以上是关于从 x86-64 可执行文件中查找类和函数名称的主要内容,如果未能解决你的问题,请参考以下文章

如何计算程序(或函数调用)中两点之间执行的 x86-64 指令的数量?

分别构建第二个可执

PyCharm编写的代码生成可执行文件操作步骤

从核心转储中检索可执行文件

Apple Mach-O-Linker 错误:从(行)引用的变量在架构 x86-64 中找不到

is incompatible with i386:x86-64 output报错