25

私が書いているネイティブ (非 Web) シングルプレイヤー ゲームをいじっていて、毎日/毎週/全期間のオンライン ハイスコア リスト(Xbox Live Leaderboard を考えてください) がゲームを作ることに気づきました。さらに興味深いのは、(少量の)コミュニティと競争を追加することです。しかし、このような機能をハッキングへの誘いとして見る人がいるのではないかと心配しています。

私はそのような試みを防止する明白な方法 (公開/秘密鍵の暗号化など) について考えましたが、ハッカーが私のすべてのアイデアを回避できるかなり簡単な方法を見つけました (バイナリから公開鍵を抽出し、偽の暗号化されたファイルを送信する)。スコアなど)。

オンラインのハイスコア リストまたはリーダーボードを実装したことがありますか? これを実装するための合理的なハッカープルーフの方法を見つけましたか? もしそうなら、どのようにしましたか?ハッキングの試みについて、どのような経験がありますか?

4

10 に答える 10

42

結局のところ、あなたはクライアントを信頼することに頼っています。クライアントがリプレイをサーバーに送信する場合、成功したプレイスルーを複製または変更してサーバーに送信するのは簡単です。

あなたの最善の策は、プレイヤーが克服する価値があると見なすものよりも、不正行為の基準を引き上げることです. これを行うために、使用できる実証済みの (ただしあまり言及されていない) 手法がいくつかあります。

  1. ブラックリストに登録された詐欺師をハニーポットに残します。彼らは自分のスコアを見ることができますが、他の人は見ることができません。別のアカウントでログインして確認しない限り、ゲームのハッキングに成功したと考えてしまいます。
  2. 誰かが詐欺師としてフラグを立てられた場合、将来の特定の時点まで、アカウントへの影響が発生するのを延期します。1 ~ 3 日以内に、このポイントをランダムに設定します。通常、詐欺師は複数の方法を試し、最終的に成功します。アカウントステータスのフィードバックを後日まで延期することで、彼らは何が彼らを捕まえたのか理解できません.
  3. すべてのゲーム ユーザー コマンドを取得し、サーバーに送信します。特定のデルタ内の他のスコアに対してそれらを検証します。たとえば、プレーヤーがシュート アクションを 200 回使用して 200,000 のスコアを取得した場合、ゲーム内の近隣のプレーヤーが 5,000 回シュートして 210,000 のスコアを取得した場合、その人物にさらなるまたは人間のフラグを立てるしきい値がトリガーされる可能性があります。調査。
  4. ユーザー アカウントに価値と永続性を追加します。ユーザー アカウントにゲームのロックを解除できるものがある場合、またはゲームに購入が必要な場合、ユーザーは Web ベースのプロキシを介して新しいアカウントを作成するだけでは以前のアカウント ステータスを取り戻すことができないため、禁止の重みは大きくなります。
于 2008-09-28T08:04:12.063 に答える
23

ユーザーの制御下にあるシステムでゲームが実行されている間は、完璧な解決策はありませんが、システムのハッキングをより困難にするために実行できるいくつかの手順があります。最終的には、システムのハッキングを無駄にすることだけが目標になります。

  • ハイスコ​​アリクエストで追加情報を送信して、サーバー側を検証します。X ごとに 5 ポイントを獲得し、ゲームに X が 10 個しか含まれていない場合、ハッカーがジャンプしてスコアを有効として受け入れるようにするための追加のフープがあります。
  • そのオフセットから数バイトのゲームのバイナリで満たす必要があるランダムなチャレンジをサーバーに送信させます。つまり、ハッカーはバイナリの元のコピーを保持する必要があります (もう少し手間がかかります)。
  • ライセンス キーを持っている場合は、それらを含めるためにハイ スコアを要求することで、システムのハッキングを見つけた人を禁止できます。これにより、上記で定義した無効な試行を追跡して、有効なスコアを送信する前にプロトコルをテストすることを禁止することもできます。

とはいえ、ゲームをハックしたくなるほどの人気を獲得することは、おそらくはるかに大きな課題です。

于 2008-08-25T13:28:20.603 に答える
6

正直、ありえないと思います。

私が必要とするセキュリティのために十分に機能する圧縮されたバイナリで非常に単純なキー暗号化を使用する前にそれを行いましたが、誰かがあなたのオンラインハイスコアテーブルをクラックすると考えるなら、それは行われると正直に思います.

かなり悲しい人もいますが、たまたまかなり明るい人もいます。

于 2008-08-25T13:17:44.717 に答える
5

私は Flash ゲームでこれをいくつか行ってきましたが、実際には負け戦です。特に、あまり労力をかけずにある程度読み取り可能なコードに逆コンパイルできる ActionScript の場合。

私が行ってきた方法は、スコアとプレーヤー名をプレーンテキストで送信し、次に 2 つのハッシュ (適切にソルト化) を送信するというかなり従来のアプローチです。それを理解するために努力するほどの決意を持っている人はほとんどいません。

要約すると、私の哲学は、ゲームをより良くすることに時間を費やし、チートを行うのに十分なだけ難しくすることです。

非常に効果的な方法の 1 つは、ゲームのプレイ中にスコアをサーバーに数回送信し、そのたびに少しのゲームプレイ情報を送信して、スコアが「現実的」であるかどうかを検証できるようにすることです。しかし、それは実際には少しやり過ぎかもしれません。

于 2008-08-25T13:22:09.653 に答える
5

ゲームにリプレイ システムが組み込まれている場合は、リプレイをサーバーに送信し、サーバーにリプレイからスコアを計算させることができます。

この方法は完全ではありません。ゲームの速度を落とす (アクション ベースの場合) か、ボットを作成することでごまかすことができます。

于 2008-08-29T00:00:52.120 に答える
3

それは本当に難しい質問です。

私はそのようなことを実装したことはありませんが、ここに簡単な近似があります。

あなたの主な懸念は、ハッカーがあなたのアプリケーションが何をしているかを推測し、独自の結果を送信することです。

まず第一に、あなたのアプリケーションが大成功しない限り、私は心配しません。そのようなことをすることは非常に困難です。

暗号化は問題の解決にはなりません。おわかりのように、暗号化は途中でデータを保護するのに役立ちますが、データが暗号化される前のトランザクションのどちらの側も保護しません (これが主な脆弱性である可能性があります)。そのため、確実に暗号化すると、データは非公開のままになりますが、安全ではなくなります。

本当に心配なら、コードを難読化し、何が行われているかが完全にはわからないようにスコア システムを設計することをお勧めします。ここで、暗号化プロトコルからいくつかのものを借りることができます。次に例を示します。

  1. スコアがいくつかの数mであるとしましょう
  2. スコアに対して何らかのチェックを計算します (たとえば、CRC やその他の足元のシステムなど。実際、それを発明しただけであれば、どんなに不自由であってもうまく機能します)。
  3. リモートサーバーからユーザー (D) の秘密鍵を取得します (明らかに安全な接続を介して)。この鍵を知っているのはあなただけです。
  4. X=m^D mod n を計算します (n は公開鍵/秘密鍵アルゴリズムの公開モジュールです) (つまり、暗号化します:P)

ご覧のとおり、これは別の種類の難読化です。好きなだけその道を下ることができます。たとえば、X に最も近い 2 つの素数を検索し、それらを使用して CRC を暗号化し、それをサーバーにも送信して、CRC とスコアを別々に異なる暗号化方式で取得できます。

それを難読化と組み合わせて使用​​すると、ハッキングが困難になると思います。とはいえ、それもリバース エンジニアリングされる可能性がありますが、それはすべてハッカーの関心と能力に依存しますが... 真剣に、どのようなフリークがゲームの結果を変えるのにそれほどの努力を必要としますか? (すごいか何かでない限り)

最後のメモ

.NET の難読化ツール

Delphi/C++ の難読化ツール

アセンブラ用の難読化ツール (x86)

于 2008-08-25T13:45:01.500 に答える
2

信頼されていないクライアント プラットフォームでは実行できません。実際には、一部の「信頼できる」プラットフォームでさえ打ち負かすことができます。

一般的なケースでは検出できないさまざまな攻撃があり、主にメモリ内の変数を変更します。自分のプログラムの変数を信頼できない場合、実際にはあまり達成できません。

上で概説した他の手法も役立つかもしれませんが、信頼できないプラットフォームで実行するという基本的な問題は解決しません。


興味深いことに、人々はハイスコア テーブルをハッキングしようとするでしょうか? 私は2年以上オンラインでゲームをしており、簡単に割れるハイスコアテーブルを持っています. 多くの人がプレイしましたが、誰かがハイスコアを破ろうとしたという証拠はありません.

于 2008-09-28T08:15:04.610 に答える
2

他の答えが言うように、潜在的に悪意のあるクライアントを信頼することを余儀なくされ、小さなゲームには単純な抑止力と少しの人間による監視で十分です.

工夫を凝らしたい場合は、クレジット カード会社が請求データを調べるのと同じように、スコア データで不正パターンを探す必要があります。クライアントがサーバーと通信する状態が多いほど、コードを介して正しい動作または正しくない動作のパターンを見つけやすくなる可能性があります。例えば。クライアントがスコアの時間ベースの監査ログをアップロードする必要があったとします (別のクライアントにトップ ゲームを観戦させるために使用することもできます)。その後、サーバーはスコア ログがゲーム ルールに違反しているかどうかを検証できます。

結局のところ、これはスコアボードの不正行為を思いとどまらせるのに十分なほど高価にすることです. 検証システムに対する新しい攻撃に対処するために、(更新が容易な) サーバー コードをいつでも改善できるシステムが必要です。

于 2008-08-25T13:36:01.537 に答える
2

@マーティン。

これがマリオカートWiiの仕組みだと思います。追加のボーナスは、ハイスコア保持者がどのようにハイスコアを獲得したかを他のすべてのプレイヤーに見せることができることです。これの面白いところは、最速の「Grumble Volcano」のタイム トレイルをチェックすると、誰かがトラックの 95% をスキップできるショートカットを見つけたことがわかります。彼らがまだそれを最速タイムとして持っているかどうかはわかりません。

于 2008-08-29T00:36:18.507 に答える
1

通常、不正行為やハッキングに対する最大の防御者はコミュニティ ウォッ​​チです。スコアがかなり疑わしいと思われる場合、ユーザーは不正行為のスコアを報告できます。そして、十分な人数がそのスコアを報告した場合、管理者はリプレイの有効性を確認できます。完全に合法的にゲームをプレイしているプレイヤーがすでにたくさんいる場合、ボットと実際のプレイヤーの違いを理解するのはかなり簡単です。

管理者は、問題のあるスコアのみを監視する必要があります。これは、多くのユーザーが完全に苦労して獲得したスコアを削除することに便乗する可能性がわずかにあるためです。また、管理者は報告されるいくつかのスコアを表示するだけでよいため、時間はあまりかかりません。小規模なゲームの場合はさらに少なくなります。

がんばってボットを作れば、通報システムにまた撃ち落とされるだけだとわかっているだけでも、それ自体が抑止力になります。

おそらく、リプレイ データを暗号化しても害はないでしょう。多くの場合、再生データは小さいため、暗号化してもそれほど多くのスペースは必要ありません。そして、それを改善するために、サーバー自体が制御ログによるリプレイを試行し、達成されたスコアと一致することを確認します。

チート対策システムが見つけられないものがあれば、ユーザーはそれを見つけます。

于 2012-12-23T02:31:33.300 に答える