Android 游戏中的 SharedPreferences 和作弊

Posted

技术标签:

【中文标题】Android 游戏中的 SharedPreferences 和作弊【英文标题】:SharedPreferences and cheating in Android games 【发布时间】:2015-04-05 11:22:51 【问题描述】:

我游戏中的高分目前存储在SharedPreferences

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <long name="level_1_score" value="1000" />
    <long name="level_2_score" value="1100" />
</map>

像这样,可以在有根设备上操纵分数。 (xml文件被拉到PC,编辑,然后推回设备)。

防止这种情况的最佳方法是什么?

【问题讨论】:

您为什么要关心用户是否在自己的设备上更改了自己的高分? 总分将提交至公开排行榜。该分数是通过将各个级别分数相加得出的。 那么为什么SharedPreferences 中的值不仅仅是本地数据缓存,而记录系统是服务器? 排行榜是使用“Google Play 游戏服务”实现的。在游戏中,有一个总分排行榜,但不是个人关卡。我不知道是否可以从 Google 服务器中提取个人水平分数。 【参考方案1】:

最简单的方法可能是使用 Google 应用许可库中的 PreferenceObfuscator。这仍然可以通过反编译您的应用程序来解决,但障碍要高得多。

【讨论】:

【参考方案2】:

也许您可以将 sharedPreferences 与 MODE_PRIVATE 一起使用,但如果您想确信您可以散列名称和值,并添加一些额外的未使用字段来检测是否有人试图更改您会知道的偏好。例如

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <long name="asdadadad" value="ASDASDASDAS" />
    <long name="asdadadadas" value="ADQOWI232DJQO1231" />
    <long name="level_1_score" value="1000" />
    <long name="level_2_score" value="1100" />
</map>

当您对名称和值进行哈希处理时,您会得到这样的图片。当你解密 asdadadad 时,你会得到 level_1_score,当你解密 ASDASDASDAS 时,你会得到一些整数(写成字符串)。 如果用户更改哈希,它可能会被解密为非整数值(无法解析为整数)

没有人能够在不知道您的散列密钥的情况下解密,该密钥将保存为您程序中的某个常量字段。

你可以做一些像这样的陷阱字段,用户可能会认为scores xml名称是level_1_score,但如果用户改变了这个,你可以抓住用户作弊。 (因为没用过)

【讨论】:

【参考方案3】:

是的,即使在 MODE_PRIVATE 中,有根设备应用程序也可以访问您的共享首选项。更糟糕的是,可以编辑与游戏应用程序共享首选项相同的 UID。

但是,你为什么不尝试加密它!? ;)

确保将密钥保存在服务器上。

【讨论】:

如果您将密钥保存在服务器上,您必须提供 https 连接:D 否则用户可以使用类似“wireshark”的程序捕获流量,而不是解密它。但是谁会为比赛做这件事呢? O.o 是的,总会有办法的。但这可以保护大多数破解者,因为密钥不会在代码中硬编码。如果有人拿到了游戏的 apk,他们可以打开类并找到密钥.. 是的,您能做的最好的事情就是防止用户轻易破解您的代码。

以上是关于Android 游戏中的 SharedPreferences 和作弊的主要内容,如果未能解决你的问题,请参考以下文章

Android中的游戏音效

Android游戏中的倒数计时器

Android 游戏中的 SharedPreferences 和作弊

Android - 游戏循环中的主动渲染?

android中怎么手动调用.so库中的游戏,

WiFi-Direct 在游戏开发中的使用 (Android)