問題タブ [anti-cheat]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
security - 訪問者が一意であることを識別する方法は?
私はインターネット投票サービスを作ろうとしていますが、問題は、インターネットは複数のアカウントを作成して同じものに投票することで簡単にだますことができることです. 人間が通過するのにわずか3秒しかかからないため、キャプチャと電子メールは役に立ちません。IPはプロキシで変更できます。投票者のブラウザに Cookie を配置すると、次回はそれを削除するだけです。
この質問を作成して、サービスが簡単にだまされるのを防ぐために、すべてのブラウザーが持っている基本的な先物 (javascript など) で使用できる方法について助けを求めました。
私が最初に思いついたのは、私のサイトにアクセスするだけで、ユーザーがブラウザーに持っているすべての Cookie に私の Web サイトがアクセスできるということでしょうか? 彼らが新しいアカウントのためにCCleanerによってすべてをきれいにするとき、私はブラウザが空であることを理解できるので、私のサイトに来るほとんどの実際のユーザーは常に異なるサイトからの少なくともいくつかのクッキーを持っているので、その人はおそらく詐欺師です.
java - クライアント側のアンチチートを確保する方法
初め、
クライアントから送信された情報は、なりすましの可能性があるため信頼できないことを知っていることを示したいと思います。私は潜在的な詐欺師の 99.9% を抑止するための隠蔽によるセキュリティの方法と、セキュリティを回避するプログラムをリアルタイムで検出する能力に興味があります。
これについて私が持っていたいくつかのアイデアには、保護しているゲームと、クライアント側がサーバーからの要求に応じて (TCP 経由で) スキャンできるようにすることで、潜在的なチートアプリの両方のファイルとメモリのチェックサムを検証し、両方ともメモリインジェクションを検出することが含まれていました。チートおよび/またはチート メモリ フットプリント。したがって、バイパス ハックは、SSL で送信されるすべての TCP 情報をリッスンし、暗号化/復号化機能を逆アセンブルしてメッセージの暗号化を解除し、必要なものを理解する必要があります。同様に、クライアント自体が自己変化し、必要に応じて機能をランダムに追加/削除できるようにすることができます (ただし、サーバーによって保持されます)。これは無意味かもしれませんか?
これは経験豊富な人にとっては中程度に難しいと思うだけなので、バイパスするのが難しいかもしれない他の方法を受け入れます.
私は可能な実装にのみ興味があり、クライアント側のアンチチートを持つことがいかに不可能であるかではなく、それを本当に本当に難しくしたいだけです。
minecraft と java タグを追加しました。これは Minecraft 用です。コミュニティが十分に大きいため、誰かが私のシステムを打ち負かす可能性が高いことはわかっていますが、絶え間ない更新と変更を使用して、創意工夫と忍耐力によって彼らを打ち負かすことができることを願っています。
編集: この投稿を見つけました: (マルチプレイヤー) ゲームでチートを防ぐには? そして、明白なものよりも多くのアイデアを探しているので、重複しないように彼の提案を追加しています(そして、彼がバイパスできないかどうかはわかりません)
1) 他のすべてのプロセスを開き、それらの WriteProcessMemory 関数をフックして、ゲームのプロセスでメモリに書き込めないようにします。この 1 つの手順を正しく行うと、すべてのチートとチート エンジンの 90% がブロックされます。
2) さまざまなマウスとキーボードのエミュレーション機能をフックして、同じことを行います。これにより、多くのエイムボットやその他のタイプの自動化ボットを防ぐことができます.
3) ゲーム自体のプロセスで VirtualProtectEx/VirtualAllocEx/etc 関数にフックし、どのモジュールが保護レベルを変更しているか、新しいメモリ チャンクを割り当てているかを監視します。ゲームが多くの割り当てを行う場合に CPU を集中的に使用しないようにするには、これを巧妙に行う必要がありますが、それは可能です。
4) LoadLibrary 関数にフックし、動的にロードされているすべての DLL を監視して、DLL インジェクションを防ぎます。
5) ゲーム接続で軽量のポリモーフィック エンコーディングを使用します。
6) アンチデバッグ手法を使用して、デバッガーがプロセスにアタッチするのを防ぎます。Google のアンチデバッグと、多くのものを見つけることができるはずです。
7) カスタム独自の PE パッカーを使用して、ゲームの有用な分解を防ぎます。
8) 透明度とアルファ ブレンディングを処理する OpenGL または Direct3D 関数とメソッドにフックします。
9) シェーダーを使用している場合は、シェーダーとシェーダー定数値のチェックサムを計算します。
10) プレイヤー キャラクターに追加のオクルージョン カリング手法を使用して、プレイヤー キャラクターへの視線が他のジオメトリによってブロックされている場合にレンダリングされないようにします。パフォーマンスにも役立つ場合とそうでない場合がありますが、多くのウォールハックを防ぐことができます.
actionscript-3 - CPUを遅くしてフラッシュゲームの不正行為を防ぐ方法は?
AS3 でフラッシュ ゲームを開発しました。これは Facebook の Music Challenge に似ています。選択した曲から推測する必要があります。どの曲を再生しているか、スコアは 30 秒間に何曲推測したかに基づいています。このタイムアウトは次のとおりです。 Timer のインスタンスによって処理されます。
すべてがうまく機能しますが、CPUのパフォーマンスを下げることでタイマーが遅くなり、ユーザーがより長くプレイし、より多くの曲を推測し、最終的により高いスコアを獲得できると誰かが指摘しました。システム時間を使用します。問題は、これを行う方法がわからないことです。
どんな助けでも大歓迎です。
android - Android ボードのようなネットワーク型マルチプレイヤー ゲームのアンチチート
TL;DR
- アンドロイド、ボードのようなゲーム。
- レイテンシは重要ではありません。
- LAN/グローバル経由のクライアントサーバー、高スコアの可能性 => 信頼なし。
- 将来の潜在的なBluetoothレイヤー=>完全な信頼。
- モバイルは高価なトラフィックを意味し、アップストリームはダウンストリームよりも高価です。
- PRNG はよく使用され、決定論的でなければなりません。
- シリアライズ+送信用kryonet
私と数人の仲間は、ボードゲームの「ポート」/「フレーバー」(多くの異なるイベントタイプとあらゆる種類の順列) を Android に構築し、ネットワーク化されたマルチプレイヤーの側面をそれに追加しています。私たちは暗号化やネットワークの専門家ではありません =)
ゲームのデフォルトのマルチプレイヤー レイヤーは、クライアント サーバー ベースになります (サーバーは専用ホストであるか、Android デバイス上で実行されます [友人と森の中でネットワークを持っていない場合に備えて])。これは、グローバル サーバーまたは LAN である可能性がありますが、それほど重要ではありません。ただし、チート防止メカニズムが必要な潜在的なハイスコアが存在する可能性があります。ターンベースのボードのようなゲームであるため、遅延は問題になりません。
将来、時間があれば、Bluetooth ベースのレイヤーを追加する可能性がありますが、この場合、人々はお互いをよく知っているという前提であるため、不正行為は問題ではありません。
アップストリームがダウンストリームよりも高価な (ほとんどの場合) モバイル ネットワークを扱っているため、サーバーからのダウンロードは、クライアントからモデルを送信するよりも安価です。
おそらく、データのシリアル化と送信に kryonet を使用することになるでしょう。
ゲームは PRNG を頻繁に使用するため、優れたアンチチートおよび検証ロジックが必要になるため、gamedev とスタック オーバーフローで多くの検索と読み取りを行った後、次のロジックを考案しました。計画がどれほど健全であるかについて、意見が必要です。すべてのヒントと推奨事項は大歓迎です。
仮定/考慮事項:
- PRNG は決定論的に動作します (Mersenne Twister を使用することを考えています)。
- 通常のゲーム プレイは、チート対策によってペナルティを受けるべきではありません。
スキーム/計画:
「ハンドシェイク」/「onResume()」以降の最初の接続時 - サーバーから PRNG シードを取得して保存します。各プレイヤーは、サーバーに独自のシードを持っています。
- また、同じリクエストでゲーム状態のハッシュをサーバーに送信し、同期していない場合はゲーム状態を同期します。
アクション/ユーザー入力で、次の乱数を取得します -> 「乱数のバケット」に保存します(したがってバケットと呼ばれます - バケットは「トラップされたリスト」であり、追加することはできますが、削除することはできません)。入力 ID/Type/Enum もリストに保存します。
他のプレイヤーが知る必要があるまで (つまり、次のプレイヤーのターン) / PNR (ポイント オブ ノー リターン) まで変更を蓄積します。
PNR到達
モデルの変更 ID/タイプ/列挙型 (約 64 ビット) + バケット + ハッシュ (変更後) を送信します。バケット + ハッシュを暗号化する必要があります。おそらく AES 256 (より適切な他の暗号化技術?) です。
N = size( bucket ) である N 個の連続する乱数に対してバケットをチェックします。一致しない場合は、6 に進み、次に 7 に進みます。
モデルを一時的に変更します (完全なゲーム モデルにコミットすることはありません)。
ハッシュを計算し、クライアント提供のハッシュと照合します。無効な場合は 6 に進みます。
有効: サーバー上のゲーム モデルにコミットします。
無効: サーバーから返された状態に戻すようにクライアントに依頼します。
チート: 禁止 (IP [動的 IP...] ではなく、MAC アドレスまたは UID ではありません) / いくつかのチートでゲームから削除します。
編集:また、アンチチートに関する別の質問... ボードのようなゲームで 2 つのファーミング ハイスコアのボット チームに対する対策の良いアイデアはありますか?
EDIT2:私が行った質問前の調査へのリンクは次のとおりです。
良いリンク (分散型のクライアント-クライアント プロトコル用): https://gamedev.stackexchange.com/questions/47145/peer-to-peer-hostless-competitive-games-of-chance
iPhone パズル ゲーム:シンプルなゲーム サーバーのコード例
調べてください:
5) ゲーム接続で軽量のポリモーフィック エンコーディングを使用します。
6) アンチデバッグ手法を使用して、デバッガーがプロセスにアタッチするのを防ぎます。Google のアンチデバッグと、多くのものを見つけることができるはずです。
7) カスタム独自の PE パッカーを使用して、ゲームの有用な分解を防ぎます。
8) ハッシュをプロミスとして使用し、他のプレイヤーの行動に関する条件が満たされると、ハッシュされたプロミスの意味を明らかにします。これは複雑で、パフォーマンスに影響を与えますが、いくつかのアイデアは、特にピア ツー ピア ゲームに役立つ場合があります。
9) クラッカーにとって問題をより困難にする良い方法は、サーバーにゲームの状態の信頼できる唯一のコピーを持ち、クライアントとの間で更新を送受信するだけで、通信プロトコル自体に埋め込むことができるようにすることだと思います。クライアントの検証 (クラッキングされていないため、検出ルールがまだ有効であること)。それと、発見された新しい奇妙な行動を積極的に監視することで、あなたがなりたい場所に近づくことができるかもしれません。
リアルタイム FPS 関連、私たちとの関連性は低い:
クライアント サーバー: (マルチプレイヤー) ゲームでチートを防ぐ方法は?
自動化: 自動化に対する保護
https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
- 優れたマルチプレイヤー/mmo クライアント <> サーバー ゲームは、移動計算でレイテンシーを使用しますか?
- タイムスタンプで場所の違いを検証するときにレイテンシの違いを考慮する方法 (アンチチート)?
以上です、何かヒントになれば幸いです!
macos - プロセス メモリへのアクセスの防止
task_for_pid() と mach_vm_write() を使用してプロセス メモリに書き込む例を作成しました。
OS X のチート エンジンのような別のプロセスから特定のプロセスのメモリへのアクセスをブロックする方法はありますか。
別のプロセスが task_for_pid を呼び出さないようにするにはどうすればよいですか?
フッキングを除いて、他の多くの人が頭に浮かぶことはありません。
c# - キーをエミュレートしているプログラムがあるかどうかを確認する方法
私はタスクがスペースバーを 100 回押すことであるゲームを作成しました。これはマルチプレイヤーです。人々はキー「スペース」をスパムする単純なアプリケーションを使い始めており、ユーザー入力のみをリッスンする方法があるかどうか疑問に思っています。キー イベントをエミュレートしているプログラムを検出します。
これらのプログラムのいずれかをテストしていませんが、私のプログラムは KeyUp イベントをリッスンします。
テスト済み: キーの押下をエミュレートできます
dll - プロキシ dll を使用したアンチチート検索の開発
ゲームの一般的なチート プログラムがあります。
プロキシ directx dll を作成し、必要なコードを挿入できます。プロセスリストをスキャンして、フットプリントを見つけようとする必要がありますか?
誰かが適切なヒューリスティックの方向に私を向けますか?
low-level - CheatEngine のスピード ハックはどのように機能しますか?
Cheat Engineには、基本的にゲームの速度を遅くしたり上げたりできるスピードハックと呼ばれる機能が付属しています. 実はゲームだけでなく、時計を刻むソフトがあればそれも高速化できます。それはどのように機能しますか?これらが実行される内部クロックがあると想像するかもしれませんが、これらが低レベルでどのように発生するかはわかりません。
この機能は、私が試したほとんどのゲームで動作しましたが、NFS Most Want など、多くのゲームで失敗しました。なんで?これらのゲームを実行する別のメカニズムはありますか、それとも単なるアンチチートですか?
c++ - オープン ソース クライアント サーバー プロジェクトで変更されたクライアントを非承認にする方法は?
オープン ソースのクライアント ソフトウェアとサーバー ソフトウェアがあり、どちらも完全にオープン ソースであるとします。
変更されたクライアントが変更されていないサーバーに接続できないようにするにはどうすればよいですか? または、変更されたクライアントを検出しますか? たとえば、オープンソースの大規模マルチプレイヤー オンライン ゲームで不正行為を防止するにはどうすればよいですか?
この件については何も見つかりません。空のGoogle検索を除いて、この件に関する情報をどこから探し始めればよいかわからないので、ここの誰かがこれに答えたり、答えを得るために正しい方向に私を向けることさえできると思いました。
javascript - 時限オンラインクイズでカンニングを防止
私の会社では定期的にインターネットでコンテストを開催しています。これらは単純な多肢選択式クイズで構成されており、クイズを最も速く完了した人が賞品を獲得します。
最近、私たちは不正行為者 (手動で完了するのが不可能な 1 秒未満のエントリの多く) に大きな問題を抱えています。時間はサーバー側で計算されるため、詐欺師が直接時間を操作することはできません。カンニングする唯一の実行可能な方法は、スクリプトを記述して自動的にクイズに記入して送信することです。
これに対処するために、次のことを既に実装しています。
- ユーザーを 1 つのエントリに制限します (IP を確認し、電子メール アドレスを要求することにより)
- プールからランダムに質問を取得します (残念ながら、各クイズは翻訳する必要があるため、翻訳リソースが限られているため、実際のプール サイズは非常に小さくなります)
- 質問と回答の順序をランダムにする
- クイズ要素のクラス名と ID をランダム化する
上記のすべての手法を使用しても、いまだに不正行為を行う人がいます。
最後の手段として、クイズのテキストを画像に置き換え、画像名をランダム化することを検討していますが、これはアクセシビリティの悪夢であり、画像比較を使用してだまされる可能性があります. したがって、可能であればこれを避けたいと考えています。
それで、ここに誰かがこれと戦う方法について何か考えがあるかどうか疑問に思っていましたか?