最近,我遇到了一些问题,人们使用一个名为Gamecih的root用户使用应用程序作弊。 Gamecih让用户在运行时暂停游戏并更改变量。
如果我对我的代码进行模糊处理,虽然骗子很难知道在运行时要更改哪些变量,但我也担心它可能会导致其他一些问题。
我使用Javas 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;
}
}
想象一下,我现在发布了一个更新,并且该播放器具有未经过模糊处理的Player下载更新版本。尝试读取该Object时,将有不同的成员名称和不同的类名。我很可能会得到ClassCastException或类似的东西。
答案 0 :(得分:1)
没有Proguard的专家,但我认为你认为它会打破序列化是正确的。
解决这个问题的一种可能方法可能是在当前保存结构上实现一个层 - 您可以告诉Proguard您不希望混淆哪些类。暂时保持播放器(和相似的对象)相同,不要混淆。一旦对象被反序列化,将其传递给游戏其余部分处理的新层(被混淆) - 如果你不保留非混淆对象,那么它将导致骗子问题调整在游戏过程中(虽然不是在加载时)。与此同时,您可以将播放器的游戏文件转移到另一个不依赖于序列化的保存选项,这可能会在将来使这些问题变得更加容易。
答案 1 :(得分:1)
确保ProGuard中的兼容序列化:
用于将序列化类升级到Java中的其他类:
JDK文档&gt;序列化&gt; <对象输入类>的readResolve
JDK文档&gt;序列化&gt; <对象序列化示例>演进/换人
答案 2 :(得分:1)
我理解ppl可以使用您命名的应用程序更新vars @ runtime。
如果更改成员名称,值仍会提供提示。 如果您进行模糊处理,类名称将会更改,但新名称仍会在论坛上结束。 所以这还不够
您在更新中可以做的是,在启动时,在旧对象中加载序列化数据,转移到“新”混淆类,使用自定义序列化(使用deviceID值的XOR或gmail地址,以便进行更新)不太明显)。
尝试将您的播放器数据分成几个类。
答案 3 :(得分:0)
在你的情况下我会做什么: