|
|
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 在内存里的存储很直观:
- 十进制: 100
- 二进制: 00000000 00000000 00000000 01100100
- 十六进制: 00 00 00 64
复制代码
但浮点数 100.0 的存储完全不同,它遵循 IEEE 754 标准:
- Float 100.0:
- 二进制: 01000010 11001000 00000000 00000000
- 十六进制: 42 C8 00 00
复制代码
看到了吗?同样是 100,整数存的是,浮点数存的是。完全不一样。
这就是为什么用 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:输入当前显示的血量值(比如)
Scan Type:Value Type:
点击 First Scan
在 Tutorial 中点按钮让血量减少
输入新的血量值,点 Next Scan
重复几轮,找到地址,改成 5000
流程和整数搜索完全一样,唯一的区别就是 Value Type 选了 Float。
搜索 Ammo(Double 类型)
在 CE 中设置:
Value:输入当前弹药值
Scan Type:Value Type:
同样的流程,找到地址,改成 5000
通关
两个值都改成 5000 后,点击 Next,Step 4 通关。
━━━━━━━━━━━━━━━━━━━━
浮点数搜索的陷阱
精度问题
浮点数有一个先天缺陷:精度有限。
比如游戏显示血量是,但内存里实际存储的可能是。如果你精确搜索,可能搜不到。
解决办法:
方法一:勾选 CE 扫描设置里的 "Rounded (default)"。这会让 CE 在比较时允许一定的误差范围。大多数情况下默认就是开启的。
方法二:使用范围搜索。把 Scan Type 改为,搜索 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 预告:代码查找器。你将第一次看到游戏的汇编代码,找到是"谁"在修改你的血量。 |
|