游戏中数据结构的逆向工程

逆向工程 视窗 C++
2021-06-20 08:02:34

我目前正在参加信息学研究的逆向代码工程研讨会:游戏工程,并被分配了有关“识别数据结构”的主题。在与我的主管进行了广泛的交谈之后,我们得出的结论是,我将这个主题与逆向游戏二进制文件结合起来是有道理的。我们的可交付成果是一份 15 页的论文和一个实现我们在论文中讨论的技术的小工具。我们不一定需要发明一种新技术。

我已经做了一些关于逆向工程数据结构的研究,并提出了主要从二进制执行中自动逆向工程数据结构的工具(例如https://www.utdallas.edu/~zxl111930/file/Rewards_NDSS10.pdf

现在我的问题是:关于从视频游戏二进制文件(如魔兽世界)中反转数据结构,什么是合理的编程工具或写作技术?上面论文中提到的方法是否仍然适用于游戏二进制文件,或者还有其他已知的技术吗?

我在逆向工程方面确实有一些经验,但我离“专业”级别还差得很远。我主要在 Windows (x64) 平台上工作。

3个回答

旁注:魔兽世界或任何类似的 MMORPG 可能不是您研究的目标,因为其中许多都具有各种反黑客、反作弊或反机器人技术,它们可能会检测到您在做什么。

我自己还远不是这方面的专家,但我最近已经拆解并试图将一个 20 岁的游戏理解为一个业余爱好项目。可执行文件大小为 800 KB,IDA 在其中检测到大约 1750 个函数,其中 250 个是 C/C++ 库函数。不用说,我花了很多时间查看各种函数并检查它们使用的字符串,但没有了解太多。

给我带来突破的是当我发现编译器如何处理类构造时;每个类构造函数调用一个malloc()-like 函数(以 size 作为参数),然后调用超类的构造函数,然后初始化方法(在更现代的编译器中没有 vtable;编译器单独初始化每个“函数指针”)和类变量。交叉引用这些malloc()调用,检查分配的类的大小,并遵循“构造函数调用超类构造函数”的链,立即让我了解整个类树和每个类的大小。

此外,我知道哪个函数是主类中哪个其他函数的子类方法,这让我对这些函数的目的有了很多了解,因为我知道哪个函数是哪个类的类方法,它很容易跟踪this函数指针,跟踪它的取消引用,并找出哪个类元素用作整数、双精度或指针类型,如果是指针,则知道它们指向哪个其他类类型。

这是我第一次接触 IDA,所以我对它的脚本功能一无所知,当事情变得过于重复时,我开始学习它们;如果我现在必须做同样的事情,我可能会编写/自动化我手动完成的很多工作。

我认为对于以可预测的方式使用 vtable 的现代 C++ 编译器,这可能会更容易;检查 vtable 被分配到的位置以找出类在哪里被实例化;检查超类构造函数调用以了解类层次结构;检查malloc/new调用中的大小以获取结构/类大小;跟踪this类方法中指针(通过虚表很容易识别)以找出元素的使用方式。所有这些都可以使用静态分析来完成,因此您甚至不必太在意反作弊/反调试技术如何影响结果。

这个答案只是为了扩展@Guntram Blohm 所说的内容。

这个问题真的很宽泛,所以我将假设您在 Windows 上逆向工程 x86/x64 本机可执行文件(不是字节码语言,如 Java 和 .NET)。首先让我说这不是一个完整的方法,因为有很多方法取决于很多事情。以下是可能影响逆向工程技术的潜在因素列表:

  • Windows 版本(许多旧工具只能在 XP 上运行,这就是我为 XP 设置 VM 的原因。但并非所有游戏都在 XP 上运行)
  • 可执行架构(并非所有调试器都是多架构)
  • 本机或字节码语言(字节码可以反编译)
  • 编译器 一些编译器公开元数据,这对逆向工程很有用。(您可以使用 PEiD 来计算出可执行文件是用什么编译的。注意:不过,打包程序可以混淆它最初编译时使用的内容)。
  • 保护,例如包装工或反作弊(太多了,不离题,如果你想提出一个新问题,我很乐意回答)

方法一: 首先,研究一下,你可能会找到游戏引擎SDK,它会包含所有的数据结构,如果有任何细微的修改,请检查方法2。

方法 2: 如果你想找到一个特定的数据结构,例如你想找到你的球员健康。如果您在 Cheat Engine 中发现您的健康状况,则使用 Cheat Engine 调试器查看写入的内容。

假设我们将这条指令写入我们的健康值:

MOV [EAX+32], EBX

我们知道 +32 是保持健康的数据结构的偏移量。您可以使用诸如 ReClass 之类的工具来帮助您或在 Cheat Engine 中构建结构。

完成此操作后,您可以更改每个变量的值,并查看它是否对游戏产生视觉影响。如果您无法解决它,您可以在所有寄存器上设置 bp 为您的基地址寄存器的值 + 复杂断点条件上的偏移量。一旦断点被​​击中,您将不得不逐步执行汇编操作码以尝试找出地址的用途。

您可能需要检查 EAT 以获取有关公开的函数或数据的任何提示。

我建议您为自己准备以下工具:

  • 作弊引擎
  • 国际开发协会
  • PEID
  • 重新分类

如果您考虑另一种方法,即在不执行二进制的情况下静态分析数据格式,我建议您查看这篇博客文章文章描述了“检查未知二进制格式的方法,这些格式可以是文件、文件片段或内存转储.”