【发布时间】:2012-08-21 07:37:02
【问题描述】:
最近我遇到了一些问题,有人在使用一款名为 Gamecih 的 root 用户应用作弊。 Gamecih 让用户可以在运行时暂停游戏并更改变量。
如果我混淆了我的代码,虽然作弊者很难知道在运行时要更改哪些变量,但我也担心它可能会导致其他一些问题。
我使用 Java 的 Serializable 接口序列化游戏对象,然后将它们写入文件。现在假设我正在序列化“Player”类的一个对象。它被序列化并保存到文件中。然后用户使用 Proguard 实现下载更新。 Proguard 将重命名类和类成员名称。尝试读取已保存的 Player 对象时,这不会导致严重错误吗?
如果我还没有启动我的游戏,这不是问题。但是现在有些玩家在同一个保存的游戏(这是一个 RPG)上玩了几个月。如果他们下载了更新并不得不从头开始,他们会非常生气。
我知道我可以指示 Proguard 不要混淆某些类,但我真正需要混淆的是 Player 类。
澄清:假设我有以下简单的 unobfuscated 类:
public class Player {
private int gold;
private String name;
//Lots more.
public Player(String name)
{
this.name = name;
}
public int getGold() {
return gold;
}
public void setGold(int gold) {
this.gold = gold;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
一个播放器被创建、序列化并保存到一个文件中。在我实现混淆器之后,它可能看起来像这样:
public class Axynasf {
private int akdmakn;
private String anxcmjna;
public Axynasf(String adna)
{
anxcmjna=adna;
}
public int getAkdmakn() {
return akdmakn;
}
public void setAkdmakn(int akdmakn) {
this.akdmakn = akdmakn;
}
public String getAnxcmjna() {
return anxcmjna;
}
public void setAnxcmjna(String anxcmjna) {
this.anxcmjna = anxcmjna;
}
}
想象一下,我现在发布了一个更新,而一个拥有未混淆播放器版本的播放器下载了该更新。当尝试读取该对象时,会有不同的成员名称和不同的类名称。我很可能会得到 ClassCastException 或类似的东西。
【问题讨论】:
-
离题,但为什么呢?如果有些玩家想玩作弊让他们玩,那并不影响你或其他人。
-
@SJuan76:因为我有全球高分榜和pvp战。
-
关于游戏的更多细节会有所帮助。另外我不明白你在客户端做什么可能会导致问题?
-
@pst:引用我自己的话:“我知道我可以指示 Proguard 不要混淆某些类,但我真正需要混淆的是 Player 类。”。目标是防止作弊,为此,我需要混淆整个 Player 类(包含黄金、物品、健康等变量)。
-
只是从我的脑海中(所以可能是一个坏主意),但你为什么不使用某种校验和或变量的散列,添加一个新的类属性到 Player 类?如果在游戏中玩家获得了一些金币,那么您更新金币和校验和值。如果作弊者只是修改金币而不修改校验和你就知道他在作弊。
标签: java android serialization obfuscation proguard