13

バックグラウンド

私はかなり長い間、Android ゲームでプレイヤーがチートをしているという問題を抱えていました。厳格なシングルプレイヤー ゲームでは、これは大きな問題にはなりませんが、私のゲームにはマルチプレイヤー バトルとグローバル ハイスコア リストが含まれているため、正当なプレイヤーが不正行為のためにプレイを停止する原因となっています。

彼らがどのようにだますか

詐欺師は、 Gamecihと呼ばれる root ユーザー向けのアプリを使用します。Gamecih を使用すると、ユーザーはアプリを一時停止し、変数の値を変更してから、アプリを再開できます。つまり、私の場合、彼らはゲームを一時停止し、「健康」を 74 兆に変更してから、マルチプレイヤーの全員からがらくたを追い出します。これは、Gamecih を使用して Fruit Ninja (私のゲームではありません) をチートする方法を示すビデオです。

考慮された方法

  1. コードの難読化。難読化は変数のを変更せず、変数のみを変更するため、これは機能しません。これは、詐欺師が現在のヘルスと同じ値を持つ変数を見つけて、その変数を変更できることを意味します。
  2. コードの難読化 + ゲッターとセッターの値の変更。このように、健康は実際には実際の健康価値を表していません。getter メソッドでは、return health*10; のようなことを行います。セッターでは health=input/10; を実行します。もちろん、これはもっと複雑になる可能性があります。

私が欲しいもの

考慮された方法 2 を使用する必要があると主張することもできますが、繰り返しますが、ハッキングを防止するものではなく、ハッキングを難しくするだけです。理想的には、人々が Gamecih を使用して不正行為を行っていることを検出し、「Darn you, you nasty hacker」というポップアップを表示して、アプリケーションを閉じたいと考えています。プレイヤーがオフラインでもプレイできるようにしたいので、サーバーに依存するソリューションは望んでいません。可能であれば、コードの難読化も避けたいと考えています。

4

10 に答える 10

9

生命を X 個の変数に格納することができ、実際の値はそれらの合計になります (常に動的に計算されます)。更新するものをランダムに選択します。その上で、いくつかの一貫性チェックを追加できます。これにより、チーターが何をどのように変更するかを理解することが非常に難しくなります。

整合性チェックは、たとえば、1 番目、2 番目、3 番目の変数が大きくなる順序で、4 番目が最小であるという単純なルールである可能性があります。このツールでこれを理解するには、かなりの時間がかかるでしょう。

Yoy はさらにクリエイティブになり、その上にいくつかの暗号化など (あなたが言及した方法) を混在させることもできます。次に、誰かがあなたのコードを持っていない限り、それは不可能に近いものになります.

編集:ランダムな名前(または配列内の位置を簡単にするために)で常に変化する100のランダム変数を追加し、正しいものを探している詐欺師に幸運を祈ります. そして、それをすべて動的にして、彼らが再びクラックしなければならないたびに。

于 2012-10-01T09:42:28.373 に答える
7

想定されていないときに値が変更されたかどうかを定期的に確認できます。

たとえば、ヘルス値が変化したという事実を別の非表示フラグに格納できます。check メソッドが値の変更を検出し、フラグが設定されていない場合、変更が不正であったことがわかります。

例えば ​​:

void incrementHealth(int amount) {
    health = health + amout;
    hiddenCheck.hasChanged = true;
    }

および定期的に呼び出す必要がある別のメソッドで:

void checkHealth() {
    if (hiddenCheck.hasChanged) {
        // change is valid
        hiddenCheck.hasChanged = false;
        hiddenCheck.lastKnownValue = health;
        } else {
            if (hiddenCheck.lastKnownValue != health) {
                // An illegal change has occured ! Punish the hacker !
                }
            }
        }
   }
于 2012-10-01T09:58:11.923 に答える
6
try{
    ApplicationInfo info = getPackageManager().
            getApplicationInfo("com.cih.gamecih", 0 );
    return true;
} catch( PackageManager.NameNotFoundException e ){
    return false;
}

この関数が true を返した場合、ハッカーがマルチプレイヤー モードに入ることさえ許さず、アンインストールするよう促します。

于 2012-10-01T13:02:12.610 に答える
2

ゲームをだますのが得意な人もこれらのフォーラムを読んでいて、あなたの小さな秘密をすべて知っています.

重要な変数をローカルに保存するゲームのチートを防ぐ確実な方法はありません。ゲームはこれらの変数をサーバー上に保持する必要があります。これらの変数がサーバーに保存されていない場合、ゲームをハッキングできる人物が常に存在します。

于 2015-02-10T03:13:36.977 に答える
1

私は自分でGameCIHを時々使用するので、これについて考えています。すべての新しいトランザクションを自己チェックするローリング 10 エントリのトランザクション ログを持つことができます。

(GameCIH は一度に 1 つの変数しか処理できないため) 行うことは、相互にチェックされる 2 つの変数を持つことです。

  • 元の (または 11 年前の) 値
  • 変更 1 ~ 10 の値の配列
  • 合計値、否定。(これにより、表示される 10 進数値が完全に変更され、最も古いログ エントリがロールバックされると、元の値とは異なる方法で変更されます。)

合計値の負の値が、元のトランザクションとログに記録された 10 個のトランザクションの合計と一致しない場合は、エラーが返されます。

統計 mod の処理方法を変更するだけで済みます。そのうちの 1 つでも元の値を直接変更しようとすると、ゲームはそれが正しく変更されていないことを返します。

于 2013-06-07T13:58:57.547 に答える
1

保存された値から統計を動的に計算します。

private double getSaltedSqrt(int i){
    return Math.sqrt(i)+1337;
}

private int getTrueValue(double i){
    return (i-1337)*(i-1337);
}

このようにして、通常の脳を持つ人間は RAM からあなたの値を見つけることができなくなります。ヘルスが 100 の人のヘルス値は 1347.0 になります。

誰かがそのプレイヤーに 10 ダメージを与えた場合、次のようにコールするだけです。

currentHealth = getSaltedSqrt(getTrueValue(currentHealth)-damage);

ただし、これを行う最も安全な方法は、これらすべての変更をサーバー経由で実装することです。

于 2012-10-01T09:55:28.177 に答える
0

ゲームの起動時に root アクセスを確認していただけますか? 次に、ルート化されたデバイスでアプリを開くことを拒否するか、マルチプレイヤー モードを拒否しますか? アプリが初期化されている場合にのみ、最初のロード画面で小さなチェックを提供します。アプリがスーパーユーザーをリクエストする可能性があります。ユーザーが許可した場合、スーパーユーザーなしでは許可されていない無害な機能を実行しようとし、その機能が正常に実行されたかどうかを確認するコードを実行し、変更を元に戻します。ユーザーがルート モードを終了する必要があることを示すメッセージ ボックスをポップして、再試行してください。

別の方法として、マルチプレイヤー モードに入ったときにこのチェックを適用することもできます。

また、サーバーからマルチプレイヤー モードを実行し、デバイスからシングル プレイヤー モードを実行して、シングル プレイヤーが自由にヘックスを編集できるようにすることもできます。

于 2014-02-24T12:16:16.593 に答える
0

メモリ チートを防ぐには、次のいずれかを実行します。

于 2013-03-12T14:41:58.170 に答える
0

ヘルスなどのハッシュ (crc32 や md5 など) を保存する必要があります。値を更新するたびに、現在設定されている値のハッシュ チェックを行います。この場合、詐欺師はハッシュを処理する別のアプリを作成する必要があります。可能ですが、これにより、スクリプトキディの詐欺師をすぐに止めることができます.

于 2013-12-23T00:06:13.223 に答える
0

ポケモン ゲームでは、DMA を使用しました。ゲームが非常に短時間一時停止している間に、タイマーをオフにしてすべての値の更新をトリガーすることで、同様の効果を得ることができます。更新により、すべての変数にランダムな量が追加されます (個々の値を取得するために減算する変数を含む)。大きな配列に値を格納して、開始位置を変更することもできます。のような絶対ポインターの代わりに、次のGameState[121]ようなものがGameState[121+StartingPosition]あり、値インクリメンターとロケーションランダマイザーを組み合わせるだけです。どちらの場合でも、モジュラー演算はあなたの味方です。配列のオーバーフローとオフバイワンのバグに注意してください。バッファオーバーランは良くありません。;)

これが Flash または Java アプリの場合: 残念ながら、メモリ管理を使用して RAM 内の値の位置をすばやく再マップすることは、ゲームボーイ アドバンスが使用するネイティブ バイナリほど便利ではありません。すべての変数をランダムな順序で 2 番目のセットにコピーしてから、元の値を削除してガベージ コレクションを行うと、おそらくゲームの実行が非常に遅くなります。

于 2014-01-14T07:56:19.263 に答える