冒险岛079

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1|回复: 0

Day 4 -- 浮点数的秘密:为什么你的血量不是整数

[复制链接]

701

主题

13

回帖

2235

积分

管理员

积分
2235
发表于 3 小时前 | 显示全部楼层 |阅读模式
Day 4 -- 浮点数的秘密:为什么你的血量不是整数
Cheat Engine 从入门到住院 · Day 4

前两天我们搜的都是整数——100、96、5000,干净利落。但你有没有想过,如果游戏里的血量是 98.7654321 呢?

很多游戏引擎(特别是 Unity 和 Unreal)内部用浮点数存储数值。你看到的"100 血",在内存里可能存的是 100.0,用的是完全不同的编码方式。

如果你用整数去搜浮点数,就像拿中文字典查英文单词——翻烂了也找不到。

今天 CE Tutorial Step 4 就带你认识这个新物种。

━━━━━━━━━━━━━━━━━━━━

本文你将学到

  • 浮点数和整数在内存中的存储差异
  • Float 和 Double 的区别与选择
  • 如何搜索浮点类型的数值
  • 混合类型搜索的技巧
    阅读时间:12 分钟 | 实操时间:20 分钟 | 难度:入门

    ━━━━━━━━━━━━━━━━━━━━

    CE Tutorial Step 4:浮点数搜索

    进入 Step 4,你会看到:

  • Health(血量):一个浮点数值
  • Ammo(弹药):另一个浮点数值(可能是 Double 类型)
  • 分别有按钮让它们减少

    你的任务:找到这两个值的地址,把血量改成 5000,弹药也改成 5000。

    ━━━━━━━━━━━━━━━━━━━━

    整数 vs 浮点数:存储方式的区别

    整数 100 在内存里的存储很直观:
    1. 十进制: 100
    2. 二进制: 00000000 00000000 00000000 01100100
    3. 十六进制: 00 00 00 64
    复制代码

    但浮点数 100.0 的存储完全不同,它遵循 IEEE 754 标准:
    1. Float 100.0:
    2. 二进制: 01000010 11001000 00000000 00000000
    3. 十六进制: 42 C8 00 00
    复制代码

    看到了吗?同样是 100,整数存的是
    1. 00000064
    复制代码
    ,浮点数存的是
    1. 42C80000
    复制代码
    。完全不一样。

    这就是为什么用 4 Bytes 整数搜索一个浮点数值,永远搜不到——因为内存里存的"密码"不同。

    你不需要记住 IEEE 754 的编码规则,只需要记住一件事:搜浮点数时,Value Type 要选 Float 或 Double

    ━━━━━━━━━━━━━━━━━━━━

    Float 和 Double 的区别

    | 属性 | Float | Double |
    |------|-------|--------|
    | 字节数 | 4 | 8 |
    | 精度 | 约 7 位有效数字 | 约 15 位有效数字 |
    | 范围 | 极大 | 更极大 |
    | 常见用途 | 大多数游戏数值 | 高精度场景 |

    简单说:Float 是"普通精度",Double 是"双倍精度"。

    大多数游戏用 Float 就够了。但 CE Tutorial 的 Step 4 里,一个值是 Float,另一个是 Double,所以你需要分别搜索。

    ━━━━━━━━━━━━━━━━━━━━

    实操步骤

    搜索 Health(Float 类型)

  • 在 CE 中设置:
  • Value:输入当前显示的血量值(比如
    1. 100
    复制代码

  • Scan Type
    1. Exact Value
    复制代码
  • Value Type
    1. Float
    复制代码

  • 点击 First Scan

  • 在 Tutorial 中点按钮让血量减少

  • 输入新的血量值,点 Next Scan

  • 重复几轮,找到地址,改成 5000

    流程和整数搜索完全一样,唯一的区别就是 Value Type 选了 Float。

    搜索 Ammo(Double 类型)

  • 在 CE 中设置:
  • Value:输入当前弹药值
  • Scan Type
    1. Exact Value
    复制代码
  • Value Type
    1. Double
    复制代码

  • 同样的流程,找到地址,改成 5000

    通关

    两个值都改成 5000 后,点击 Next,Step 4 通关。

    ━━━━━━━━━━━━━━━━━━━━

    浮点数搜索的陷阱

    精度问题

    浮点数有一个先天缺陷:精度有限。

    比如游戏显示血量是
    1. 99.3
    复制代码
    ,但内存里实际存储的可能是
    1. 99.30000305175781
    复制代码
    。如果你精确搜索
    1. 99.3
    复制代码
    ,可能搜不到。

    解决办法:

    方法一:勾选 CE 扫描设置里的 "Rounded (default)"。这会让 CE 在比较时允许一定的误差范围。大多数情况下默认就是开启的。

    方法二:使用范围搜索。把 Scan Type 改为
    1. Value between
    复制代码
    ,搜索 99.2 到 99.4 之间的值。

    方法三:用 Day 3 学到的未知值搜索。先 Unknown initial value,然后用 Decreased / Unchanged 来缩小范围。浮点数和整数在变化方向上没有区别。

    类型猜错了

    如果你不确定游戏用的是 Float 还是 Double,可以用排除法:

  • 先试 Float(更常见)
  • 找不到就试 Double
  • 还找不到?可能根本不是浮点数,回去试整数

    或者使用 CE 的 "All" 类型搜索,一次搜所有类型。但这样会非常慢,而且结果会特别多,不推荐作为首选。

    ━━━━━━━━━━━━━━━━━━━━

    怎么判断游戏用的什么类型

    一些经验规则:

  • 显示整数的场景(HP: 100, Gold: 5000):先试 4 Bytes 整数
  • 显示小数的场景(Speed: 3.5, Damage: 12.8):先试 Float
  • Unity 游戏:大量使用 Float(Unity 的 Vector3、Transform 都是 float)
  • 精度要求高的场景(坐标、物理计算):可能是 Double
  • 显示百分比(HP: 75%):内存里可能是 0.75 的 Float,也可能是 75 的整数

    最靠谱的方法:找到地址后,看它在内存里的原始十六进制数据,然后分别用 Float 和整数解读,哪个能对上游戏显示的值,就是哪个类型。

    ━━━━━━━━━━━━━━━━━━━━

    常见问题

    Q:搜索 Float 时结果为 0 怎么办?

    A:很可能是精度问题。确认 CE 的舍入选项已开启(Scan 菜单中),或者用范围搜索代替精确搜索。

    Q:我搜到了地址,但修改后游戏显示没变?

    A:有些游戏的 UI 不会实时刷新。试着触发一次血量变化(比如再挨打一次),UI 就会用你修改后的值重新计算。

    Q:Float 和 4 Bytes 都是 4 字节,怎么区分?

    A:虽然都是 4 字节,但编码方式完全不同。如果你把一个 Float 值用整数方式解读,会得到一个莫名其妙的大数字。反过来也一样。CE 的地址列表里可以右键切换显示类型来验证。

    ━━━━━━━━━━━━━━━━━━━━

    小结

    今天我们攻克了浮点数这个关卡:

  • 浮点数(Float/Double)和整数在内存中的编码方式完全不同
  • 搜索浮点数时,Value Type 必须选 Float 或 Double
  • 注意浮点精度问题,善用范围搜索和舍入选项
  • 大多数游戏优先试 Float,找不到再试 Double

    到这里,你已经掌握了 CE 的三种基本搜索能力:精确值搜索、未知值搜索、浮点数搜索。这三板斧足以应对大多数"改数值"的需求。

    但"改数值"只是 CE 能力的冰山一角。从明天开始,我们要深入"水面之下"——直接看游戏的代码在干什么。

    Day 5 预告:代码查找器。你将第一次看到游戏的汇编代码,找到是"谁"在修改你的血量。
  • 您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    果子博客
    扫码关注微信公众号

    Archiver|手机版|小黑屋|风叶林

    GMT+8, 2026-3-29 20:23 , Processed in 0.244140 second(s), 19 queries .

    Powered by 风叶林

    © 2001-2026 Discuz! Team.

    快速回复 返回顶部 返回列表