2

最近,我遇到了一些问题,人们使用一个名为 Gamecih 的 root 用户应用程序作弊。Gamecih 让用户在运行时暂停游戏并更改变量。

如果我混淆我的代码,虽然作弊者很难知道在运行时要更改哪些变量,但我也担心它可能会导致其他一些问题。

我使用 Java 的 Serializable 接口序列化游戏对象,然后将它们写入文件。现在假设我正在序列化“Player”类的一个对象。它被序列化并保存到文件中。然后用户使用 Proguard 实现下载更新。Proguard 将重命名类和类成员名称。尝试读取已保存的 Player 对象时,这不会导致重大错误吗?

如果我还没有启动我的游戏,这不会是一个问题。但是现在有些玩家在同一个保存的游戏(这是一个 RPG)上玩了几个月。如果他们下载了更新并不得不从头开始,他们会非常生气。

我知道我可以指示 Proguard 不要混淆某些类,但我真正需要混淆的是 Player 类。

澄清:假设我有以下简单的未混淆类:

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 的播放器下载了该更新。当尝试读取该对象时,会有不同的成员名称和不同的类名称。我很可能会得到 ClassCastException 或类似的东西。

4

4 回答 4

1

为了确保 ProGuard 中的兼容序列化:

要将序列化的类升级到 Java 中的不同类:

  • JDK 文档 > 序列化 > 对象输入类 > readResolve

  • JDK 文档 > 序列化 > 对象序列化示例 > Evolution/Substitution

于 2012-08-21T23:27:05.383 回答
1

我知道 ppl 可以使用您命名的应用程序更新 vars @ runtime。

如果您更改成员名称,这些值仍会给出提示。如果你混淆了,类名会改变,但新的名字无论如何都会在论坛上结束。所以这还不够

您可以在更新中做的是,在启动时,在旧对象中加载序列化数据,转移到“新”混淆类,使用自定义序列化(使用 deviceID 值或 gmail 地址进行 XOR 以使其不那么明显) .

尝试将您的玩家数据也分成几个类。

于 2012-09-06T13:05:03.480 回答
1

Proguard 没有专家,但我认为您认为它会破坏序列化是正确的。

解决此问题的一种可能方法是在当前保存结构上实现一个层 - 您可以告诉 Proguard 您不想混淆哪些类。现在让播放器(和类似的对象)保持不变,不要混淆。一旦对象被反序列化,将其传递给游戏其余部分处理的新层(被混淆) - 如果您不保留非混淆对象,那么它将导致作弊者问题调整在玩游戏期间(尽管不是在加载时)。同时,您可以考虑将玩家的游戏文件移动到另一个不依赖于序列化的保存选项,这可能会在将来使此类问题变得更容易。

于 2012-08-21T08:01:53.377 回答
0

在你的情况下我会怎么做:

  1. 发布带有混淆和非混淆类的更新。当播放器被加载时,它将尝试使用这两个类。如果播放器加载了非obf。类然后将此类映射到您的混淆类。
  2. 当玩家被保存时,它将使用混淆类保存。
  3. 在适当的时间后发布仅包含混淆类的更新。
于 2015-05-24T11:58:05.067 回答