2

最近、Gamecih という root ユーザー向けのアプリを使ってチートをしている人々に問題がありました。Gamecih を使用すると、ユーザーはゲームを一時停止し、実行時に変数を変更できます。

コードを難読化すると、不正行為者が実行時にどの変数を変更するかを知るのが難しくなりますが、他の問題が発生する可能性も懸念されます.

Javas 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ドキュメント>シリアル化>オブジェクトのシリアル化の例>進化/置換

于 2012-08-21T23:27:05.383 に答える
1

あなたが名前を付けたアプリを使用して、ppl が vars @ runtime を更新できることを理解しています。

メンバー名を変更しても、値からヒントが得られます。難読化すると、クラス名は変更されますが、新しい名前はとにかくフォーラムで終わります。だからこれじゃ足りない

アップデートでできることは、起動時にシリアル化されたデータを古いオブジェクトにロードし、「新しい」難読化されたクラスに転送し、カスタムシリアル化を使用することです(deviceID値またはgmailアドレスを使用してXORを使用して、あまり明白にしないようにします) .

プレーヤーのデータもいくつかのクラスに入れるようにしてください。

于 2012-09-06T13:05:03.480 に答える
0

あなたの状況で私がすること:

  1. 難読化されたクラスと難読化されていないクラスを含む更新プログラムをリリースします。プレーヤーがロードされると、両方のクラスで試行されます。プレーヤーが非 obf でロードされた場合。クラスを作成してから、このクラスを難読化されたクラスにマップします。
  2. プレーヤーが保存されると、難読化されたクラスで保存されます。
  3. 適切な時間が経過したら、難読化されたクラスのみを含む更新をリリースします。
于 2015-05-24T11:58:05.067 に答える