浮点数值的模糊搜索 —— 小数、坐标、物理参数怎么办
为什么浮点值麻烦
Float(浮点数)在计算机中的存储和整数不同:
- 整数用二进制精确表示(191 就是 191)
- 浮点数用科学计数法(
1.91 × 10²),存在精度丢失 - 浮点数的比较不能用
== 等于,必须用|a - b| < ε(差值足够小就算"相等")
这对模糊搜索的影响是:Float 类型的"等于""大于""小于"在边界上可能不精确。比如你让 Float 值增加了 0.1,实际存储可能是 191.09999... 而不是 191.1。
场景一:界面显示有小数点
比如赛车游戏中你要修改的坐标是 X=3.1415,伤害值是 25.7。这种情况最直接:
- 数据类型选 Float(或 Double,如果是高精度参数)
- 精确搜索时输入带小数点的值
- 模糊搜索时和整数一样用"值增加了/减少了"——Float 也有大小关系,只是比较精度低一点
场景二:界面显示整数,但底层存 Float
很多游戏为了方便做小数计算(比如速度、加速度、帧率同步),底层用 Float 存"整数"值:
- 界面显示金币 191,实际内存存 191.0f
- 界面显示 HP 1200,实际内存存 1200.0f
这就是为什么:Dword 搜不到,Float 反而能搜到。
判断方法:
- Dword / Word / Byte 都搜过了,精确和模糊都没结果
- 切 Float,试一下
- 如果 Float 搜到了并改了能生效,就是这种情况
场景三:Float 搜索结果异常多
Float 类型搜索经常出现结果爆炸——因为浮点数在内存里有大量中间态值。比如 191.0f 到 202.0f 之间,实际在内存中可能经过了 191.001、191.002……191.01、……191.99、……202.0。
解决方法:
方法 A:用"范围搜索"替代"确切值搜索"
不要搜:Float = 191.0
要搜:Float 在 190 ~ 192 之间(或 190.5 ~ 191.5)
方法 B:降低比较精度
部分版本的八门神器或 GG 修改器有"比较精度"选项,设置较低的精度值(比如 0.5 或 1.0),可以把 190.9 和 191.1 都视为"接近",减少中间态。
方法 C:用模糊搜索追踪整数边界变化
第 1 轮(Float 类型):全量快照
第 2 轮(金币增加到 192):选"值大于 191"(而不是单纯"值增加了")
第 3 轮(金币增加到 193):选"值大于 192"
...
方法 D:切换到整数类型(如果存的是整数值)
如果 Float 存的就是整数值(191.0f 而不是 191.5f),可以试试用 Dword 搜 1.0f 的整数值——因为在内存里 Float 和 Dword 共用同一段物理字节,只是解析方式不同。
Float vs Double:怎么选
| Float (单精度) | Double (双精度) | |
|---|---|---|
| 字节数 | 4 | 8 |
| 精度 | 约 7 位有效数字 | 约 15 位有效数字 |
| 游戏中常见 | ✅ 绝大多数游戏的小数 | 少数需要高精度物理计算的游戏 |
| 搜索速度 | 快 | 慢(要扫更多字节) |
经验法则:99% 的情况选 Float 就够了。只有当 Float 搜不到、且你确认游戏有高精度物理引擎时,才试 Double。
实战案例
案例一:赛车游戏坐标
你想修改赛车的 X 坐标,让它瞬移到赛道前方。界面显示坐标值类似 "X: 3.141592"。
步骤:
1. 数据类型选 Float
2. 记录当前 X = 3.141592
3. 精确搜索 3.141592 → 可能返回 0-1 条(浮点精确匹配较难)
4. 如果搜不到,启动模糊搜索:
- 全量快照
- 让赛车稍微移动一点,X 变成 3.145 → "值增加了"
- 继续移动 → "值增加了"
- 重复到只剩少量结果
5. 把 X 改成你想要的值(比如 3.5 瞬移到终点附近)
案例二:RPG 伤害修正值
你想修改攻击力,让每次攻击伤害翻倍。游戏内显示攻击力是整数 100,但你怀疑底层用 Float。
步骤:
1. Dword 搜 100 → 没结果
2. Float 搜 100.0 → 还是没结果(可能做了加密)
3. 改用 Float + 模糊搜索:
- 记录当前攻击力相关值的变化(比如看"实际伤害"随装备变化的规律)
- 或直接搜"让值增加"——升级装备后攻击力 Float 增加了
4. 找到后改成目标值
小结
Float 搜索的核心思路:
- 优先试整数类型,搜不到再试 Float
- Float 搜不到确切值时,用范围搜索(搜 a~b 而不是 c)
- 模糊搜索同样适用于 Float——它不关心精度,只关心变化方向
- 99% 的 Float 问题用 Float + 模糊搜索解决