我目前正在参加一个反向代码工程研讨会,以进行信息学:游戏工程方面的研究,并被分配有关“识别数据结构”的主题。经过与主管的广泛讨论,我们俩都得出结论,我将主题与反向游戏二进制文件结合起来是很有意义的。
我们的可交付成果是一份15页的论文,是一个小工具,用于实现我们在此讨论的技术纸。我们不一定需要发明一种新技术。

我已经对逆向工程数据结构进行了总体研究,并提出了大多数工具来自动逆向执行二进制数据的工程数据结构(例如https://www.utdallas.edu/~zxl111930/ file / Rewards_NDSS10.pdf)

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

我在逆向工程方面确实有一些经验,但是我离“专业”很近-水平。我主要在Windows(x64)平台上工作。

评论

本文提到了在子例程内部识别类型传播。那是我相当成功地实现的事情,可以发现复杂的RTS游戏的内部结构布局。 (但是这有助于我从头开始编写自己的反汇编程序;可以将其粘贴即可。)

#1 楼

旁注:WoW或任何类似的MMORPG,可能不是您研究的目标,因为其中许多功能都具有各种反黑客,反作弊或反botting技术,这些技术可能会检测到您在做什么。 />
我自己还不是专家,但是最近我分解并试图将20岁的游戏理解为一项业余爱好项目。该可执行文件的大小为800 KB,IDA在其中检测到大约1750个函数,其中250个是C / C ++库函数。不用说,我花了很多时间查看各种函数并检查了它们所使用的字符串,而又不太了解。

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

另外,我对哪个函数是主类中哪个其他函数的子类方法有了一个想法,这为这些函数的用途带来了很多见识,因为我知道哪个函数是哪个类的类方法,跟踪该函数的this指针,跟踪其取消引用以及找出哪个类元素用作整数,双精度或指针类型是很容易的,对于指针,则要知道它们所指向的其他类类型。 br />
这是我第一次接触IDA,因此我对它的脚本功能一无所知,并在事情变得过于重复时才开始学习它们。如果我现在必须做同样的事情,我可能会脚本化/自动化很多我手动执行的操作。 ;检查vtable的分配位置,以找出在何处实例化类;检查superclass-constructor调用以了解有关类层次结构的信息;检查malloc / new调用中的大小以获取结构/类的大小;在类方法(可通过vtable轻松识别)中跟踪this指针,以查找元素的使用方式。所有这些都可以使用静态分析完成,因此您甚至不必在乎反作弊/反调试技术如何影响结果。

评论


感谢您的详细回答。因为我宁愿进行静态分析,所以也一定会考虑使用vtable。我不迟于明天将您的答案标记为“正确”,希望在那之前我能得到更多的投入。到目前为止谢谢你!

– Puelo
14-10-20在10:17

#2 楼

这个答案只是在@Guntram Blohm所说的内容的基础上扩展。在Windows上(不是字节码语言,例如Java和.NET)。首先,我要说的是这并不是一个完整的方法,因为有很多方法取决于很多事情。以下列出了可能会影响您的逆向工程技术的潜在问题:


Windows版本(许多较旧的工具仅在XP上运行,这就是我为XP设置VM的原因。但是并非所有游戏都可以在XP上运行)
可执行体系结构(并非所有调试器都是多体系结构)
本机或字节码语言(可以反编译字节码)
编译器某些编译器公开了元数据,这些数据可用于逆向工程。 (您可以使用PEiD来计算可执行文件的编译方式。请注意:打包程序虽然可以混淆原来使用的编译程序)。主题如果您想提出一个新的问题,我会很乐意回答)

方法1:
首先,进行研究,您可能会发现包含所有数据结构,如果有任何细微的修改,请检查方法2。

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

我们假装我们将此指令写入了我们的健康值:

MOV [EAX+32], EBX


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

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

您可能想要检查EAT,以获取有关功能或数据的任何提示。

我也建议您使用以下工具:


作弊引擎
IDA PRO
PEiD
ReClass


评论


非常感谢您的回答:我确实知道如何根据我在游戏中所拥有的信息(例如您的健康示例)手动查找结构。我的任务是介绍并部分实现可自动执行此类操作的技术。您对此有何建议?

– Puelo
14-10-20在12:39

我的假设是正确的,那就是您在编辑帖子之前使用Windows和反向工程本机软件。

– Paul
14-10-20在12:42

哦对不起。是的,您的假设是对的!

– Puelo
14-10-20在12:52

#3 楼

如果您考虑采用另一种方法,即静态分析数据格式而不执行二进制操作,那么我建议看一下这篇博客文章,其中描述了“检查未知二进制格式的方法,这些格式可以是文件,文件片段或内存转储。 。”