3、内存扫描基础:数值类型详解

好,咱们正式开始动手了。上一章我们把 Cheat Engine 的界面摸了个大概,也知道了「精确数值扫描」是怎么回事。但说实话,游戏里的数据远比你想象的要复杂。你想想看,一个角色的血量,可能是整数,也可能是带小数的;一个坐标,可能是 4 字节的,也可能是 8 字节的。如果你只会扫整数,那很多游戏你根本无从下手。

这一章,我就带你把这些「数值类型」彻底搞明白。我个人的习惯是,拿到一个游戏,先别急着扫,先想想这个数据「可能是什么类型」。这个习惯,能帮你省下大把时间。

3.1 数值类型,到底是个啥?

说白了,计算机里存数据,就像我们往不同大小的盒子里放东西。有的盒子只能放整数,有的盒子能放小数,有的盒子大一点,有的小一点。这些「盒子」就是数据类型。

在 Cheat Engine 里,你最常见的类型有这么几种:

类型名称 大小 取值范围(大概) 常见用途
4 字节 (4 Bytes) 4 个字节 -21亿 ~ 21亿 血量、金钱、等级、弹药
8 字节 (8 Bytes) 8 个字节 非常大,几乎无限 经验值、大型游戏中的坐标、时间戳
浮点数 (Float) 4 个字节 带小数,精度约 7 位 角色移动速度、视角旋转、血量百分比
双精度浮点数 (Double) 8 个字节 带小数,精度约 15 位 高精度坐标、物理引擎计算
字节数组 (Byte Array) 可变 0~255 的整数序列 物品 ID、技能代码、特殊标志位

嗯,这张表你得记在心里。我刚开始学的时候,就是靠这张表,一个一个去试,才慢慢摸到门道的。

3.2 4 字节和 8 字节:最常用的整数

先说 4 字节。这是游戏里最最常见的类型。你想想看,一个角色的血量,从 0 到 99999,用 4 字节完全够用。我遇到过很多新手,一上来就用「所有类型」去扫,结果扫出来几万个结果,根本没法看。其实你只要知道这个数据是整数,大概率就是 4 字节。

那什么时候用 8 字节呢?当数值特别大的时候。比如某些游戏的经验值,动辄几千万甚至上亿,4 字节就装不下了。我记得有一次逆向一个网游,它的经验值就是用 8 字节存的。我当时用 4 字节扫了半天,死活找不到,后来换成 8 字节,一下就定位到了。

我的小技巧: 如果你不确定是 4 字节还是 8 字节,先试试 4 字节。如果扫描结果很少,或者数值明显不对(比如变成负数),再换 8 字节。

3.3 浮点数和双精度浮点数:带小数点的世界

浮点数,说白了就是带小数点的数。游戏里很多地方都用它。比如角色的移动速度,可能是 5.0、3.5 这样。视角的旋转角度,可能是 0.785 这样的弧度值。

浮点数和双精度浮点数的区别,就在于精度。浮点数只有 4 个字节,能精确到小数点后 7 位左右。双精度有 8 个字节,能精确到小数点后 15 位。对于大多数游戏来说,浮点数就够了。但如果你在做物理引擎相关的逆向,比如赛车游戏里的轮胎抓地力,那很可能就是双精度。

这里有个坑,我得提醒你。有些游戏会把整数存成浮点数。比如血量是 100,但它可能存成 100.0。这时候你用 4 字节整数去扫,是扫不到的。我建议你,如果整数扫描没结果,不妨试试浮点数。

避坑指南: 我曾经在一个 FPS 游戏里找「护甲值」,用 4 字节扫了半天,结果全是动态地址。后来我换成浮点数,一次就找到了。原来这个游戏把护甲值设计成了带小数的百分比形式(比如 0.75 代表 75% 护甲)。

3.4 字节数组:最灵活的扫描方式

字节数组,听起来有点吓人,其实很简单。它就是一段连续的内存,里面存着一串 0~255 的数字。你可以把它想象成「指纹」。每个物品、每个技能,在内存里都有自己独特的「指纹」。

比如,一个「治疗药水」的 ID 可能是 [0x01, 0x02, 0x03]。一个「火焰魔法」的技能代码可能是 [0x0A, 0x0B, 0x0C]。你只要知道这个指纹,就能在内存里把它揪出来。

字节数组的扫描,通常用在「精确数值扫描」找不到的情况下。比如你想找一个特殊的道具,但它的数值是动态变化的,这时候字节数组就派上用场了。

3.5 未知初始值扫描:从零开始的逆向

好,前面讲的都是「我知道这个数是多少」。但很多时候,你根本不知道这个数是多少。比如你刚进游戏,不知道血量的具体数值,只知道它「变少了」或「变多了」。这时候,就需要「未知初始值扫描」。

这个功能,说白了就是让 Cheat Engine 先记住内存里「所有可能的值」,然后你通过操作游戏,告诉它「哪些值变了」,它就会帮你筛选。

具体步骤是这样的:

  1. 选择「未知的初始值」作为扫描类型。
  2. 点击「首次扫描」。这时候 CE 会把所有内存地址都记录下来。
  3. 回到游戏,做一次操作(比如挨打,血量减少)。
  4. 在 CE 里选择「减少的数值」,点击「再次扫描」。
  5. 重复步骤 3 和 4,直到结果少到可以手动分析。

嗯,这个方法很笨,但很有效。我早期逆向一些老游戏,没有现成的数据表,全靠这个功能一点一点把数据筛出来。

3.6 变值扫描:动态追踪的利器

变值扫描,是未知初始值扫描的升级版。它不仅能告诉你「数值变了」,还能告诉你「怎么变的」。比如「增加了 10」、「减少了 5」、「变成了原来的两倍」。

这个功能在对付「动态数值」时特别好用。比如一个怪物的血量,你打它一下,它掉血了。但掉的血量不是固定的,而是根据你的攻击力浮动。这时候,你就可以用「变值扫描」里的「值增加了」或「值减少了」来追踪。

我个人习惯是,先用「未知初始值」扫一遍,把范围缩小到几百个地址,然后再用「变值扫描」做精细筛选。这样效率最高。

3.7 本章知识体系

下面这张图,是我为你梳理的本章知识脉络。你可以把它当作一张「地图」,随时回来查阅。

内存扫描基础:数值类型与扫描策略 数值类型 整数类型 4 字节 8 字节 浮点类型 Float Double 字节数组 物品ID / 技能代码 扫描策略 精确数值扫描 未知初始值扫描 变值扫描

这张图把本章的核心内容都串起来了。你从「数值类型」出发,根据游戏数据的特征,选择合适的类型。然后根据你是否知道具体数值,选择「精确扫描」或「未知初始值扫描」。最后,用「变值扫描」做精细调整。这套流程,就是我多年逆向的经验总结。

3.8 实战小贴士

最后,给你几个实战中的小建议:

  • 先判断类型,再动手。 别一上来就「所有类型」扫,那是新手干的事。
  • 多试几次。 如果一种类型扫不到,换另一种。游戏开发者有时候会故意用奇怪的数据类型来防逆向。
  • 善用「暂停游戏」。 很多游戏在暂停时,内存数据不会变化,这时候扫描最准确。
  • 记录你的扫描过程。 我习惯用记事本记下每次扫描的类型、数值和结果。这样下次遇到类似游戏,可以直接参考。

嗯,这一章的内容就到这里。数值类型是内存扫描的基石,你把它搞懂了,后面的章节就会轻松很多。记住,多动手,多尝试,你很快就能找到感觉。

公众号:蓝海资料掘金营,微信deep3321