移动游戏防作弊攻防战
其他元素&凌聪
Agenda
• 为什么要防作弊
• 作弊方式
• 总结
2
经济损失
3
作弊的其他影响
• 弱联网的休闲游戏
• 排行榜:全局排行/好友排行
• 需要本地运算的重度游戏
• 广告!!!
4
弱联网游戏可能存在的安全问题
• 存档被篡改/复制
• 本地配置被篡改
• 账号被盗或恶意修改
• 内存被修改
• 网络协议被破解/重放攻击
• 工程被逆向破译
• 二进制程序可能被修改
• 函数被外挂Hook
防止存档篡改
• 方法:加密存档!AES 256 CBC PKCS#7
• 必须使用安全的对称加密算法
– 建议使用AES加密算法,密钥256位或以上(工业级,速度快)
• 密钥的存储
– 不要将密钥直接存储在代码、配置或内存中
– 密钥不要存储在存档中
– 密钥每次加密当场现算
– 使用固定密钥,密钥的产生需要有随机度
存档协议设计
00 01
46 44
SourceHash
幻数 版本号 初始向量 源数据哈希
IV
RawData
源数据
• Magic number:标记存档类型
• 版本号:标记加密方法类型
• 源数据哈希:用于验证解密的正确性
• 初始向量:块加密算法的初始向量IV
密钥的产生
• 密钥必须有一定的随机性
– 可以随机数产生(但需要一些技巧)
– 也可以哈希产生
• 产生随机密钥的技巧:
– 应使用工业级加密库的产生函数,这样更随机
– 自己产生的随机数,如以下算法,实际上最多
只有231种密钥,而加密算法要求2256
char key[32];
srand(time(NULL));
for (int i = 0; i < 32; ++i) {
key[i] = rand() % 256;
}