第 4 章 从代码到内存:通用入门¶

在最低层,游戏的代码、数据、输入和输出都是复杂抽象,背后是不断变化的字节。其中许多字节代表变量或由编译器根据游戏源代码生成的机器代码。有些代表图像、模型和声音。还有一些只存在一瞬间,由计算机硬件作为输入发出,在游戏处理完它们后就被销毁。剩下的字节告诉玩家游戏的内部状态。但人类无法用字节思考,所以计算机必须把它们翻译成我们能理解的方式。
反方向也存在巨大的脱节。计算机实际上不理解高级代码和感官层面的游戏内容,所以这些内容必须从抽象翻译成字节。有些内容——如图像、声音和文本——被无损存储,随时可以在微秒级呈现给玩家。另一方面,游戏的代码、逻辑和变量则被剥离所有人类可读性,编译成机器数据。
通过操纵游戏的数据,游戏黑客在游戏内获得人类难以企及的优势。但要做到这一点,他们必须理解开发者的代码在编译执行后如何呈现。本质上,他们必须像计算机一样思考。
为了让你像计算机一样思考,本章首先教你数字、文本、简单结构和联合如何在字节层面表示在内存中。然后你会更深入探索类实例如何存储在内存中,以及抽象实例如何在运行时知道调用哪些虚函数。在本章的后半部分,你将上一门 x86 汇编语言速成课,涵盖语法、寄存器、操作数、调用栈、算术运算、分支操作、函数调用和调用约定。
本章非常侧重通用技术细节。没有太多与破解游戏直接相关的趣味信息,但你在这里获得的知识将在接下来的章节中成为核心,届时我们会讨论程序化读写内存、注入代码和操纵控制流等主题。
由于 C++ 是游戏和机器人开发的事实标准,本章解释了 C++ 代码与表示它的内存之间的关系。不过,大多数原生语言具有非常相似(有时完全相同)的底层结构和行为,所以你应该能把在这里学到的知识应用到几乎任何软件上。
本章的所有示例代码都在本书源文件的 GameHackingExam ples/Chapter4_CodeToMemory 目录中。随附的项目可以用 Visual Studio 2010 编译,也应该能与其他任何 C++ 编译器一起工作。如果你想跟着做,请在 https://www.nostarch.co m/gamehacking/ 下载并编译它们。