显示值与存储值不一致 —— 为什么看到的是 191,内存里存的却是 1910
一个诡异的现象
你在游戏里看到金币数是 191,但输入 191 去搜索,结果是 0 条。换"自动识别"也搜不到。但后来你偶然发现搜 1910 有结果,而且改 19100 之后,游戏里显示的金币变成了 1910。
这不是巧合——很多游戏都会对显示值做一层处理。
常见的不一致类型
类型一:倍率关系(最常见)
游戏底层实际存储的值是界面显示值的 10 倍、100 倍或 1000 倍。比如:
- 界面显示 191,内存存 1910(×10)
- 界面显示 5000,内存存 5000000(×1000,可能为了支持小数显示)
解决方法:尝试搜索显示值乘以 10、100、1000。或者反过来,搜索显示值的 1/10、1/100。
类型二:加偏移
游戏底层存的值比显示值大一个固定数字。比如所有金币都额外加了 10000:
- 界面显示 191,内存存 10191
解决方法:尝试搜索 显示值 + 固定偏移量。偏移量通常在几千到几万之间,可以试几个常见值。
类型三:加密运算(最棘手)
游戏作者用简单的位运算或数学公式加密存储值:
实际存储 = 显示值 ^ 某个常量 (XOR 异或加密)
实际存储 = 显示值 + 某个常量
实际存储 = 显示值 × 某个常量 + 偏移
这种情况下精确搜索几乎不可能命中。你需要改用模糊搜索(下一章会讲)。
类型四:浮点数取整
游戏内部用 Float 存储,但界面只显示整数部分:
- 内存存 191.7,界面显示 191
- 内存存 100.0001,界面显示 100
解决方法:改用 Float 数据类型搜索,搜显示值附近的范围(比如 190-192)。
如何判断是不是不一致导致的
如果你满足以下所有条件:
- root 权限正常
- 进程选对了
- 数据类型试过 Dword / Word / Byte / Float 都搜不到
- 游戏看起来没有做高强度加密
那很可能就是显示值和存储值不一致。
实用排查流程
第一步:搜 10 倍
显示值 = 191
→ 搜 1910(Dword)
→ 如果有结果并修改后显示变成 1910 的 1/10,那就是 ×10 关系
第二步:搜 100 倍、1000 倍
→ 搜 19100(×100)
→ 搜 191000(×1000)
第三步:尝试浮点范围
→ 切换 Float 类型
→ 搜 "190~192" 范围值
→ 或者切换自动识别,让它帮你试 Float
第四步:放弃精确,改用模糊
如果以上都不行,说明做了加密,直接跳到模糊搜索章节。
实际案例
下面是实际游戏中出现过的倍率关系:
| 游戏 | 显示值 | 内存存值 | 关系 |
|---|---|---|---|
| 某些休闲游戏金币 | 191 | 1910 | ×10 |
| 模拟经营游戏金钱 | 50000 | 50000000 | ×1000 |
| 赛车游戏分数 | 9500 | 95000 | ×10 |
| RPG 经验值 | 999 | 1998 | ×2(双倍存储) |
| 射击游戏血量 | 100 | 1065353216 | 复杂加密(见下) |
一个极端例子:血量加密
某些游戏(尤其是需要反作弊的)对关键数据做了复杂加密。比如某游戏的 HP 实际存储值是 1065353216 + 真实HP值。显示 HP 100,内存里存的就是 1065353316。
这种加密规则没有通用解法,你需要:
- 搜 0(假设没加密前 HP 是 0)
- 让 HP 变成 100
- 搜刚才那批结果中"增加了 100 的"
- 看筛选后的值是什么规律,反推加密公式
这就是模糊搜索的威力——下一章详细讲。