文章目录
- Introduction
- Data types
- Booleans
- Negative numbers (Signed integers)
- Floating-point numbers (fractional numbers)
- Unknown value scans
- Health finding
- Float finding (Player position hack / Teleport hack)
- Additional things
Introduction
这节课将结束数据类型并涵盖更高级的 game hacking 技巧,特别是学习如何编辑我们看不到的数字,例如玩家的 XYZ 坐标或者没有显示数字的血条,这被称为 未知值扫描,因此数据类型只是计算机上存储信息的方式,我们已经学到了很多比如 ASCII 和 Unicode,当然我们还有负数和浮点小数还没涉及
Data types
我们已经学到的数据类型总结:
- byte = UInt8 1byte 最大255
- unsigned short = UInt16 2bytes 最大65535
- unsigned integer = UInt32 4bytes 最大42亿
- unsigned long = UInt64 8bytes
- string (variable)
- char 1byte 最大255
接下来介绍更多数据类型,日后他们将在课程中统称为 Data 数据!
Booleans
在游戏中,很多情况下我们需要将值表示为 true 或 false,比如:
- 怪物是否活着 isAlive = true or false
- 火把是否打开 isOn = true or false
当我们在计算机中存储数据时,我们使用 1 表示 true,0 表示 false,你可能会想计算机只需要 1bit 即可保存一个 bool 类型的数据,很不幸,计算机使用了整个 byte 来保存一个 bool 值,这就是使用 8个bit 作为一个 byte 分组的副作用
有些游戏可能会用 bit flag 技术来优化,比如黑暗之魂3,但这实际上很少见,为了应对这个情况,已经是一种非常先进的 game hacking 技术了
值得一提的是,有些编程语言还会浪费更多,甚至使用 4bytes 也就是一个 int32 的空间来存储 bool,通常 C 和 C++ 占用 1byte,C# 占用 4bytes,而 Java 要占用 8bytes
Negative numbers (Signed integers)
到目前为止我们只了解正数,让我们来介绍一下负数:
- 第一位 Sign bit 作为符号位,0 为正,1 为负
- 后面作为数字的值存储
这里涉及一个负数补码反码系统,视频作者在这里跳过,这个系统介绍起来足够消耗一个小时甚至更多
对于笔记作者来说,一个简单的补码记忆方式是:如果第一位是0,那么就当正常的二进制数
否则如果第一位是1,那么就减去一个特殊的数字即可,比如 1000 0000,等于 0 - 128,或者 1111 等于 7 - 8 = -1
7 - 8 里面的 7 是后三位的和,8 是第一位的权值
Floating-point numbers (fractional numbers)
有两种实现的方法,一种是浮点,一种是双精度,这两种数据类型几乎相同,但有细微的差别
- 第一位 Sign bit 作为符号位,0 为正,1 为负
- 后面 8 位作为 exponent 指数位
- 最后 23 位作为 mantissa(fraction)
而双精度 double 作为科学用,一般很少在游戏中出现,但实际上是差不多的,float 同样需要 4bytes 存储
- 10.5f 浮点数后面一般加 f 作为标志
- 10.5 double 后面一般没有 f
Unknown value scans
现在我们将上面学到的应用到真正的 game hacking 技术中,我们尝试找到一个没有血条数值的怪物的生命值
Health finding
我们可能可以猜测怪物的生命值是100,但往往不正确,所以我们:
- 先收集所有数值
- 在游戏中想办法改变怪物的生命值,比如让怪物受到一次攻击
- 查找所有减少或者改变了的数值
这就使得数值范围得到了缩小,最终找到生命值!
Float finding (Player position hack / Teleport hack)
位置通常使用浮点数存储,我们先用 CE 查找未知的数值,类型选择 FLOAT
然后在游戏中移动,我们不知道移动了多少,只知道移动了,在 CE 中继续扫描,通过选择:
- Unchanged value
- Changed value
- Increased value
- Decreased value
最终可以缩小范围找到你需要的值!
最后你会发现很多棘手的事情,比如玩家可能旁边有宠物,这就需要你自行针对游戏的特性想一些办法了~
现在我们留下了这些数据,把他们放到下面去
然后选中所有,按下空格来冻结住!程序很有可能会崩溃,因为你冻结了一些指针或者天知道是什么的东西,通过这样来缩小范围最终找到正确的值!
当你找到了 X 地址,你可以简单地加4,来找到玩家的 Y 地址,因为 FLOAT 占用 4bytes,游戏会彼此相邻地存储坐标,因为这就是程序员制作游戏的方式
Additional things
当你退出游戏重新进入并修改那个地址的数值时,有时你会发现数值有效,有的则锁定在了 0,这是因为一种叫做静态和动态的东西,现在你只需要记得有些 game hacking 会在您重新启动游戏时再次起作用,而大多数则不会!