グローバルハイスコアテーブルへの誤ったスコアレポートを防ぐにはどうすればよいですか?


44

ブラウザおよびモバイルゲームには、通常、グローバルなハイスコアテーブルがあります。また、これらのテーブルには2,147,483,647のスコアが含まれることが一般的です。スコアを報告するWebサービスコールを考え出し、それを使用して架空のスコアを記録します。

単純なパズルゲームの場合、プレーヤーが行ったすべての動き(およびレベルの生成に使用されたランダムシード)の記録をスコアレポート呼び出しに含めることで、これを防ぐことができます。その後、ゲーム全体をサーバー上で再現および検証できます。

しかし、これはパックマンよりも大きいものではすぐに実行不可能になります。

この種の不正行為を他にどのように防ぐことができますか?


同じ手法を使用してグローバルハイスコアテーブルを作成するiPhoneゲームに関しても、まったく同じ質問がありました。
deft_code

リプレイを送信するのは実行不可能だと確信しています
o0 '。

はい私は確信しています。:)
teedyay

回答:


9

Mobloxに使用した内部システム(後にOpenFeintに置き換えられました)は次のように機能しました。

  • JSONメッセージをプレーンなHTTP(HTTPSではなく)で送信します。すべてのフィールドのMD5ハッシュとマジックストリングを含めます。
  • サーバーで、同じ操作でメッセージの整合性を確認します。

システムをクラックするには、この魔法の文字列を見つける必要があります。リバースエンジニアリングでも可能ですが、痛みを伴います。

OpenFeint、ScoreLoop、およびCocosLiveはすべて同じトリックを使用しますが、HTTPSを使用します。実装が非常に簡単です。


29
あなたの魔法の文字列を見つけるためのリバースエンジニアリングはそれほど難しいとは思いません。
キロタン

4
これは、ネイティブC ++のAndroidアプリケーションです。シンボルも、適切なデバッガもありません。したがって、ARMコードを読み取ることはできますが、簡単にトレースすることはできません。キーは複数の操作で構成されているため、すべての文字列を見つけるだけでは不十分です。それは完璧ではありませんが、非常に苦痛です。
エリス

3
少なくとも米国の大学における標準的な学部演習では、y86(cgi2.cs.rpi.edu/~hollingd/comporg-spring2007/notes/Y86/…)アセンブリコードを読むことにより、説明したとおりに構築されたパスワードをリバースエンジニアリングします。

12
これは非常に弱い技術であり、開発者に非常に誤ったセキュリティ感覚を与えます。
o0 '。


21

複雑なゲームの場合、リプレイ全体をサーバーに送信することは常に実行可能ではないということは正しいですが、サーバーに定期的に(そして半ランダムに)クライアントにその状態の一部を尋ねさせると、同様のシステムを使用できますゲームが実行されています。

たとえば、FPSでは、毎分「何人のキルを持っていますか?」、「すべての敵はどこにいますか?」などを尋ねることができます。クライアントがチャレンジで合理的な答えを返さなかった場合妥当な時間、彼らは浮気しています。

もちろん、これは、プレイセッション全体でゲームがオンラインの場合にのみ機能します。ここでの目標はオンラインリーダーボードにアップロードできるようにすることであるため、合理的だと思います-プレイヤーが間違った答えをした場合、ゲームから追い出さないでください。スコアリストに載せないでください。

ただし、リプレイの送信を再検討することをお勧めします。本当に必要なのは、最初のランダムシードとタイムスタンプ付きの入力だけです。これは実際にはせいぜい数百KBです。多くのアーケードゲームは、プレーヤーのレビューのためにリプレイを保存するために既にこれを行っています。サーバーにこれらを検証させることは簡単ではないかもしれませんが、ボッティング以外のあらゆる種類の不正行為を防ぎます。


10

トップスコアテーブルで最高の結果を監視することで、悪用の最も目立つものを制限できます。ゲームによっては、「完璧なスコア」が得られる場合がありますが、それを超えるとスコアは不正になります。そうでない場合は、最低の「不可能なスコア」を計算できます。プレイヤーは毎秒10ショットを撃つことができ、ゲームは1分間続き、殺された敵はそれぞれ100ポイントの価値がありますか?その場合、60,000を超えるスコアは不正でなければなりません。

また、いくつかのメタデータを送信することにより、問題を軽減するのに役立ちます。あなたが説明するようにゲームの完全な履歴ではなく、スコアを構成するコンポーネントだけです。説明:スコア60000、500人の敵を倒し、1つのボーナスアイテムを獲得しました。その後、簡単なチェックを実行できます。これは「あいまいさによるセキュリティ」であり、したがってまったく安全ではありませんが、最も素朴な攻撃者を排除するのに役立ちます。


ユーザーがメタデータと一致しないスコアを送信した場合、ユーザーにフラグを付けることもできます(IPによって)。次に、正しいメタデータを持つDOESのスコアを再度送信しようとすると、それを精査し、場合によっては完全に禁止することができます。また、そこから生意気なメッセージを送信してスコアリクエストを送信することもできます:)
アダムハート

この答えは受け入れられた答えよりも良いと思います。プレーヤーが達成できる最大数を把握してください。それより高いものは、ただ捨ててください。

6
大学攻略に行く一人のプレイヤーのであれば、ネットワーク上の誰もが今、「詐欺師」である
AttackingHobo

6

最終的には、残りは(定義上)単に信じられないだけであり、したがって正当な(そして素晴らしい)プレーヤーである可能性があるため、不可能なほど高いスコアしか除外できません。

それ以外の場合は、難読化手法(暗号化、スコア以外の統計情報の送信など)に依存する必要があります。

また、ゲームのプレイ中にスコアを定期的に送信することもできます。これにより、不正行為がさらに複雑になります。つまり、サーバーは、特定のスコアを保証するのに十分な時間ゲームをプレイしたかどうかを判断し、十分な中間レポートを確保することもできますプレイタイム中に受信されました(100%にしないでください。さもないと、帰宅途中にトンネルに入る列車が窓から電話を投げてしまいます)。

最終的に誰かがそれを破る方法を見つけるので、それらを止めようとして自殺しないでください。


6

私はしばらく前に私のプロジェクトにクイック/ダーティーハイスコアテーブルを追加しましたが、インターネットセキュリティなどにまったく精通していなかったため、一種の欠陥が見つかりました。驚くべきことに、1,200,000近くのスコアが記録されたので、ボードのトップに到達するのはたぶん5〜6回の露骨な誤ったスコアのバッチしかありませんでした。スコアのほとんどは、真の「ハッキング」というよりは、ゲームの不具合のようにさえ見えました。

だから私は重要な点だと思う:あなたのゲームのスコアリングシステムが気密であることを確認するか、少なくともいくつかの本当に良いスコア実現可能性チェックを行う。今、私が話しているこのゲームはLudum Dare 48時間のエントリーでしたので、最も安定したものではありませんでした。しかし、全体として、カジュアルプレイヤーはゲーム内の不具合を発見/活用する可能性が高いと思います誰かがリーダーボードを直接「ハッキング」する。

そうは言っても、私は現在このプロジェクトの書き直しに取り組んでおり、難読化に取り組んでいます。あまり詳しくはしませんが、基本的にはすべてのスコアに一連のランダムな値とハッシュとマジックストリングに基づいてキー値を送信し、その後、そのチェックに合格し、実際の「上位X "リーダーボードは、検証の別のラウンドに合格する必要があります(今回は、サーバーエンドで期限切れになるキー値が生成され、実行可能性チェックが徹底されます)。

また、何らかの種類のパケットトレーサーを使用して、どのような種類のものが表示されるかをテストすることをお勧めします(私はもともと、誰かがパケットトレーサーを使用して、アップロードされたスコアのhttpリクエストを見つけて複製し、マジックストリングまたは何か(最初に正当なスコアが必要だったが、そのスコアの複製を必要なだけ送信できることを意味します。)これをテストするためにWiresharkを使用しました。

ちょっと長いことがわかりましたが、うまくいけば...


確かです。塩漬けのハッシュは良い方法のように見えます。同じ有効なスコアを何度も再送信するとは考えていませんでした。パケット(およびハッシュ)に含まれるGUIDとタイムスタンプがそれに支払われるべきです-サーバー上で重複をチェックできます。ありがとうございました。
teedyay

3

私はこの分野の専門家ではありませんが、私があなただったら、コードに埋め込まれたキーでスコアを暗号化しようとします。それらの人々は、Webサービスに使用されるプレーンテキストの代わりに、コードにリバースエンジニアリングを適用する必要があります。


2
さらに1つ進みます。exeファイル(またはその一部)をハッシュすることにより、コードからハッシュを生成します。スコアを送信する際にバージョン番号を送信すると、サーバーは単純な定数バージョン番号->ハッシュコードを持つテーブルを使用して検証できます。その後、プログラムを変更して不正行為を行った場合、その高得点はカウントされないというボーナスが追加されます。
コンフィギュレー

7
誰かがプログラムを変更している場合は、必要なキーを既に送信できます。

2
@Joe Wreschnig、彼らは好きなキーを送信できますが、サーバーは有効なキーのみを受け入れるように設定する必要があります。
AttackingHobo

5
Joeのポイントは、新しく変更されたプログラムのハッシュを使用する必要はなく、以前のハッシュが何であれ送信できるということだと思います。
キロタン

1
@ gd1:それはどのように役立ちますか?
キロタン

1

Speedrunsは基本的にすべてのキーストロークの記録であり、完全なゲームに関する記録です。それで、はい、あなたはゲーム全体を記録することができます、それは実行不可能ではありません。どれでもそうする他の方法は、リバースエンジニアリングによるクラッキングである(私は十分にそれを強調することはできません:あなたは無名を追加している、セキュリティを追加していません)。

それでも、この方法で実行しても、実際にスピードランを送信できます。それを防ぐために何もすることはできません。


2
通常、記録ではなく再生がサーバーにとって実行不可能な部分です。クライアントが数時間ゲームをプレイしている場合、サーバー側の再シミュレーションには多くのCPU分またはそれ以上かかることがあります。多くの人がスコアを提出している場合、それは本当に受け入れられません。

2
データパケットのサイズは、モバイルゲームでは問題になります。特に、プレーヤーが帯域幅をバイト単位で支払う場合はそうなります。
teedyay

ああ、あなたの両方が言うことは本当です。それでも、他の「実際の」ソリューションはありません。
o0 '。

11
提出されたすべての記録を検証する必要はありません。トップ10になった記録を検証する必要があります。そして、あなたはリアルタイムでそれをする必要はありません。定期的なバッチ処理で問題ありません。
グレー

@teedyayプレーヤーは1秒あたり平均5つのアクションを実行し、各アクションは32ビットで完全に記述できます。これは、1秒あたり20バイトまたは1時間あたり72 kBです。米国の一般的なモバイルデータ価格は、GBあたり10ドル、または1000 kBあたり1セントです。
ダミアンジェリック

1

あなたがそれをしている間に、ハイスコアが単にエクスプロイトを見つけたプレーヤーであるかどうかの問題があります(たとえば、ゲーム内のあるものがスコアペナルティを与え、バグが負のスコアを「ラップアラウンド」させる場合)非常に前向きになるために...またはボード上の安全な場所のような特定のゲーム条件を見つけて、そこに座っているだけで、無期限に失うことを心配する必要のないプレイヤー)。

ハッキングとゲームのエクスプロイトの違いを伝えるために、少なくともいくつかのプレイデータをアップロードすることをお勧めします。少なくともエクスプロイトを修正するのに役立ちます。

一部のゲーム(特にターンベースのゲーム)では、実際にサーバーを介してゲームをプレイできます。ゲームロジックはすべてサーバー側にあり、クライアントは単なるインターフェイスです。これにより、スコアのハッキングが非常に難しくなるだけでなく、サーバー上のすべてのプレーヤーのアクションを簡単に記録できるため、いつでもゲームをリプレイできます。けいれんアクションシューティングゲームのようなもののために、これは実用的ではないかもしれないことを認識しています。


1

1つのシードからすべての乱数発生源を作成し、すべてのフレームの入力を保存します。高得点(たとえば上位50位)を獲得したら、シードと完全な入力をサーバーに送信します。サーバーでゲームをリプレイし、ハイスコアを獲得したらリーダーボードを更新します。

リクエストのサイズが大きいため、これをより洗練されたゲームでは実行できないと考える場合は、この例を見てください。

ゲームに8つのボタン入力(1つのパッドと4つのボタン)があり、60fpsで実行されているとします。1時間のゲーム入力は、圧縮せずに3.6KBで送信できます。セッションはおそらく1時間未満であり、人間の入力には多くの冗長性があるため、圧縮はそれを大幅に縮小するはずです。

課題は、記録された入力からプレイ可能かつサーバー上で実行可能なゲームを決定論的にすることです。


0

これを実装したことはありませんが...

タイムスタンプを使用してスコアを段階的に送信します。これにより、スコアが改善された頻度と、ハイスコアの「勢い」を追跡する方法を確認するログが得られます。

次に、スコアのマイルストーン/基準を設定します。

例:20,000を超えるスコアは、ゲームの最初の20秒では到達できません。250,000を超えるスコアは、200,000を超えるエントリなしでは到着できません。

これは、ゲームの状態を送信することとまったく同じではありませんが、それに近いものです。

副次的な利点:これから得られるすべての便利なゲームプレイ統計を考えてください。誰かがそのために良いお金を払うだろう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.