文章目录
- Introduction
- Operating System
- Tools
- Memory Scanning
- Memory Scan
- Examples!
- Conclusion
Introduction
本节将介绍操作系统的基础知识和内存扫描,这可以说是 game hacking 中最重要的技能,我们不会深入讨论操作系统,因为这本身就是一门独立完整的课程,我们只需要学习 game hacking 有关的部分。
我们将继续学习内存扫描,这是一种在游戏中查找生命值和金币等内容的技术。我们将介绍它是如何进行工作的,最后将演示一些实例让我们简要深入地了解我们需要的操作系统的知识。
Operating System
操作系统可以做很多事情,但这两个是最重要的
- Hardware management 硬件管理
- Process management (running exe files) 可执行的文件,当你打开应用程序,操作系统复制确保程序运行
当你 打开一个 exe 文件
时,操作系统会获取该文件并复制到 RAM 中。当我们进行 game hacking 时,我们会在 RAM 而不是在磁盘上破解副本,这意味着我们所做的更改不是永久性的,这是 game hacking 和常见的 software hacking 主要区别
Tools
让我们来介绍一下课程中使用的工具:
- Cheat Engine 似乎是最著名的工具,发源于2003年,经过大量测试十分稳定
- Squalr 比较新的CE类软件
由于操作系统对 exe 程序有如此大的权力,我们可以令操作系统帮助我们在游戏中进行 game hacking。每个操作系统都有很多你可以要求它做的事情,功能被称为 API 或库,这术语令人困惑,但实际上只是指其他人编写的代码,我可以使用。
操作系统是用 C 和 C++ 编写的代码,我们可以使用其中的一些代码,当我们在 Windows 上操作时,而 Mac 和 Linux 当然采用他们自己的 API,其中的一些功能非常强大,你只是启动 C++ 或 C# 程序并使用代码来编辑血量、金钱,这就是 CE 和 Squalr 的工作方式
Memory Scanning
按照上一章 game hacking 的一般进程:
- Memory scanning
- Memory editing
- See if it worked
这里的 Memory scanning 就好像按 ctrl + F 在你的浏览器中搜索某些内容,在我们的例子中,想用它来查找生命值、法力值、金币、技能点、玩家的XYZ坐标,找到以后编辑即可。
在程序中找到和生命值有关系的数据就好像在好像大海的 0 和 1 中找到一串有关的数据,科学家很久以前就同意把位分为8个,这8个位称为一个字节,看起来更清晰,所以一切都是八位的倍数不可能有一个只有一位的字节,如果一个数据只有一位,他必须四舍五入到八位。
假如我们找到了玩家的健康状况,假如 00100000 是玩家血量,我们只需要覆盖现有的值 11111111 即可,我们暂时不可能在游戏中插入新数据,这意味着无论谁编写游戏都要提前决定限制,一个字节的数据上限是255,四个字节的上限大约20亿,很多金币之类的数据会采用这个数字。
幸运的是,很多工具会帮我们处理这些数据,我们不用真的去进行二进制文件的内存扫描。
Memory Scan
如果玩家有 100 生命值,我们会假设我们正在搜索最多4个字节长的数据,这是大多数程序员的选择。让我们演示一下问题是什么,他并不像 ctrl + F 那样简单,所以我们可以说它的工作原理和 ctrl + F 一样。
大多数游戏有 1GB 到 8GB 内存占用,这可能有40亿个数字,我们会得到非常多的可能项。
我们需要知道,地址是什么。例如一个程序
0110100 01100001 01110100 0010000 01110100 … 省略数亿个数字
我们可以把程序 exe 文件的第一个字节 0110100 称为 第一个字节 地址0,因为他存在第一个位置,然后是第二个,第三个。
此时比如我们在 第169个字节处找到了数据100,那么他的地址就是169,值就是100。值可以改变,但他的地址几乎不会改变!
Examples!
接下来我们将使用一个示例程序来进行说明:
- 打开 Cheat Engine 作为你的逆向工具
- 告诉 CE 你正在尝试读取的游戏
- 现在我们的目标是破解某个特定的数值,比如血量。在 CE 中搜索血量值,我这里是 432,你会发现一大堆数值为 432 的数据,他们大部分是没用的,通过下一步操作进行范围缩小(这里搜索的 Value Type 是 4 Bytes,因为通常血量这样的信息就是用 4 Bytes 存储的)
- 想办法改变你的血量值,穿脱装备或者进行交战,然后进行 Next Scan,这就找到了当前血量值和最大血量值!
- 修改地址在 1CBC9DD0 的数据,也就是玩家当前血量。需要注意的是,有时数据不会马上更新,你需要进行一些操作来刷新屏幕上的数据显示。
Conclusion
在例子中我们学会了找到生命值,这足以让您入门,但我们还需要了解更多内容,比如:
- 如何找到玩家的 X 和 Y 坐标来编写传送代码,他可能是十万一百万
- 我们找到的地址在下一次启动游戏时就会毫无意义,不再有效
但掌握当前的技能足够你进行一些单人游戏的 game hacking,思考一下作为游戏开发者如何应对这种 game hacking!