这节课将结束数据类型并涵盖更高级的 game hacking 技巧,特别是学习如何编辑我们看不到的数字,例如玩家的 XYZ 坐标或者没有显示数字的血条,这被称为 未知值扫描,因此数据类型只是计算机上存储信息的方式,我们已经学到了很多比如 ASCII 和 Unicode,当然我们还有负数和浮点小数还没涉及
我们已经学到的数据类型总结:
接下来介绍更多数据类型,日后他们将在课程中统称为 Data 数据!
在游戏中,很多情况下我们需要将值表示为 true 或 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
到目前为止我们只了解正数,让我们来介绍一下负数:
这里涉及一个负数补码反码系统,视频作者在这里跳过,这个系统介绍起来足够消耗一个小时甚至更多
对于笔记作者来说,一个简单的补码记忆方式是:如果第一位是0,那么就当正常的二进制数
否则如果第一位是1,那么就减去一个特殊的数字即可,比如 1000 0000,等于 0 - 128,或者 1111 等于 7 - 8 = -1
7 - 8 里面的 7 是后三位的和,8 是第一位的权值
有两种实现的方法,一种是浮点,一种是双精度,这两种数据类型几乎相同,但有细微的差别
而双精度 double 作为科学用,一般很少在游戏中出现,但实际上是差不多的,float 同样需要 4bytes 存储
现在我们将上面学到的应用到真正的 game hacking 技术中,我们尝试找到一个没有血条数值的怪物的生命值
我们可能可以猜测怪物的生命值是100,但往往不正确,所以我们:
这就使得数值范围得到了缩小,最终找到生命值!
位置通常使用浮点数存储,我们先用 CE 查找未知的数值,类型选择 FLOAT
然后在游戏中移动,我们不知道移动了多少,只知道移动了,在 CE 中继续扫描,通过选择:
最终可以缩小范围找到你需要的值!
最后你会发现很多棘手的事情,比如玩家可能旁边有宠物,这就需要你自行针对游戏的特性想一些办法了~
现在我们留下了这些数据,把他们放到下面去
然后选中所有,按下空格来冻结住!程序很有可能会崩溃,因为你冻结了一些指针或者天知道是什么的东西,通过这样来缩小范围最终找到正确的值!
当你找到了 X 地址,你可以简单地加4,来找到玩家的 Y 地址,因为 FLOAT 占用 4bytes,游戏会彼此相邻地存储坐标,因为这就是程序员制作游戏的方式
当你退出游戏重新进入并修改那个地址的数值时,有时你会发现数值有效,有的则锁定在了 0,这是因为一种叫做静态和动态的东西,现在你只需要记得有些 game hacking 会在您重新启动游戏时再次起作用,而大多数则不会!