gpt4 book ai didi

java - 使用 ProGuard 混淆源代码

转载 作者:搜寻专家 更新时间:2023-11-01 09:05:40 26 4
gpt4 key购买 nike

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

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

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

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

我知道我可以指示 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 或类似的东西。

最佳答案

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

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

关于java - 使用 ProGuard 混淆源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12050237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com