最近、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 などのエラーが発生します。