GameKiller 中文文档 下载 App

浮点数值的模糊搜索 —— 小数、坐标、物理参数怎么办

为什么浮点值麻烦

Float(浮点数)在计算机中的存储和整数不同:

这对模糊搜索的影响是:Float 类型的"等于""大于""小于"在边界上可能不精确。比如你让 Float 值增加了 0.1,实际存储可能是 191.09999... 而不是 191.1。

场景一:界面显示有小数点

比如赛车游戏中你要修改的坐标是 X=3.1415,伤害值是 25.7。这种情况最直接:

  1. 数据类型选 Float(或 Double,如果是高精度参数)
  2. 精确搜索时输入带小数点的值
  3. 模糊搜索时和整数一样用"值增加了/减少了"——Float 也有大小关系,只是比较精度低一点

场景二:界面显示整数,但底层存 Float

很多游戏为了方便做小数计算(比如速度、加速度、帧率同步),底层用 Float 存"整数"值:

这就是为什么:Dword 搜不到,Float 反而能搜到。

判断方法:

  1. Dword / Word / Byte 都搜过了,精确和模糊都没结果
  2. 切 Float,试一下
  3. 如果 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 (双精度)
字节数48
精度约 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 搜索的核心思路:

  1. 优先试整数类型,搜不到再试 Float
  2. Float 搜不到确切值时,用范围搜索(搜 a~b 而不是 c)
  3. 模糊搜索同样适用于 Float——它不关心精度,只关心变化方向
  4. 99% 的 Float 问题用 Float + 模糊搜索解决