加密数据的处理思路 —— 内存修改器面对加密存储时的应对策略
游戏为什么要加密数据
简单说:防修改、防外挂。
开发者发现玩家用八门神器改金币改数值太容易,于是对关键数据做了加密处理:
- 不是把 HP 存在 100 的整数里
- 而是用一个公式(XOR / 加偏移 / 乘常数)对 100 做变换后存进去
- 内存里存的是 1065353316 这种看起来像随机数的值
- 游戏运行时自动解密,显示给玩家的还是 100
五种常见的加密类型
类型一:加法偏移(最常见)
存储值 = 真实值 + 固定偏移量
真实值 = 存储值 - 固定偏移量
例子:偏移量 1065353216 是一个很常用的偏移(它等于 2^30,方便做位运算)。真实值 100 → 存储值 1065353316。
类型二:乘法缩放
存储值 = 真实值 × 常数(10、100、1000 等)
真实值 = 存储值 ÷ 常数
例子:真实金币 191 → 存储值 19100(×100,为了支持 2 位小数显示)。
类型三:XOR 异或
存储值 = 真实值 XOR 密钥
真实值 = 存储值 XOR 密钥(XOR 可逆)
XOR 加密的特点:同一个密钥,加密和解密是同一个操作。比如:
真实值 = 191 = 00000000 00000000 00000000 10111111(二进制)
密钥 = 42 = 00000000 00000000 00000000 00101010
存储值 = 191 XOR 42 = 00000000 00000000 00000000 10010101 = 149
类型四:动态密钥
每次游戏运行时密钥随机生成,所以同一个真实值在不同运行周期存储值不同。这是对修改器最不友好的情况。
类型五:链式加密
存储值 = 加密(真实值 + 前一个存储值 + 偏移量)
依赖相邻值的加密,联合搜索也很难处理。
应对策略
策略一:模糊搜索(万能)
不管什么类型的加密,模糊搜索都不关心具体的值,只关心变化方向——"增加了还是减少了"。这是破解加密数据的最通用手段。
加密后:HP 从 X 变成 Y(X 和 Y 都看不懂)
但:X > Z(加密前的增加方向不会变)
模糊搜索"值增加了" → 有效!
策略二:反推加密公式
如果加密比较简单(加法、乘法、固定密钥 XOR),你可以通过两次搜索反推出公式。
反推加法偏移
第 1 次:HP = 100 → 搜"值=100" → 无结果
第 2 次:HP 变成 105 → 搜"值增加了" → 找到那条地址
看加密存储值:假设是 1065353316 和 1065353321
差值:1065353321 - 1065353316 = 5(和真实值差值一样)
偏移量:1065353316 - 100 = 1065353216
知道了偏移量,下次直接搜 目标值 + 偏移量 就能命中。
反推乘法缩放
第 1 次:金币 = 191 → 搜 191 → 无结果
第 2 次:金币 = 202 → 搜模糊"增加了" → 找到存储值 2020
缩放系数:2020 ÷ 202 = 10
下次直接搜 目标值 × 10
反推 XOR 固定密钥
真实值 191 → 存储值 149
密钥 = 191 XOR 149 = 42
验证:100 XOR 42 = 118 → 搜 118 应该能命中
策略三:联合搜索(绕开加密)
如果一个 struct 里部分值被加密、部分没加密,联合搜索用未加密的那几个值定位 struct,然后直接改加密值。
策略四:Hook 游戏函数(进阶)
八门神器本身不直接支持,但同类工具(GG 修改器、Cheat Engine)支持 Hook / Memory Script:在游戏的"解密函数"处设断点,把解密后的值拿出来改,或者直接跳过加密逻辑。
这需要逆向能力:
- 找到游戏读取 HP 的函数
- 注入脚本,在函数返回前修改返回值
- 或者直接跳过加密步骤
实战案例:某游戏的 XOR 加密
场景:精确搜金币 191 没结果,搜模糊也很慢。
尝试反推:
第 1 轮:金币 = 191 → 模糊全量快照
第 2 轮:金币变成 202 → 选"值增加了" → 剩 500 条
第 3 轮:金币变成 215 → 选"值增加了" → 剩 30 条
第 4 轮:金币变成 100(花了 115)→ 选"值减少了很多" → 剩 1 条!
看存储值的变化:
191 → 存储值 A
202 → 存储值 B(增加了 11)
215 → 存储值 C(增加了 13)
100 → 存储值 D(减少了 115)
关键:存储值的变化量和真实值的变化量**完全一致**!
说明加密要么是加法偏移,要么是乘法系数为 1 的什么
进一步:用 191 XOR A、202 XOR B……看结果是否相同。
如果是 XOR 固定密钥:
191 XOR 存储值 = 密钥 K
202 XOR 存储值' = 同一个密钥 K
算出 K 后,下次直接搜:目标值 XOR K
什么时候彻底没解
遇到以下情况,八门神器级别的工具可能束手无策:
- 动态密钥链 + 每次运行重新分配内存:地址和加密值都变
- 服务端校验:客户端存的任何值,服务器端都有副本和校验
- 内存自修复:游戏有后台线程定期检查并修复被修改的值
- 完整的反作弊系统:如 EAC、BattlEye、VAC,它们不仅防修改,还会检测修改工具本身
这时要么放弃用八门神器,要么转向Hook 函数、修改存档文件、重写 APK 反编译等更重的手段。