ゲームは「フレームごとにアニメを推測する」-不正行為に対する保護

おそらく、多くの人がゲームに参加し、そのフレームから映画やシリーズを推測する必要がありました。 非常に頻繁にそのようなトピックゲームはフォーラムで発見されます。 そして最近、彼らはアニメをフレームごとに推測することに専念するサイトを見せてくれました。 自動化されたゲームの場合:回答オプションを使用して、ポイントを考慮します。



数回のゲームの後、アニメシュニックとしての私の興味は満足し、IT専門家が私に目を覚ました。 面白くなり、サイトでの不正行為に対する保護とは何ですか。 簡単な分析の過程で、不正行為に対する保護があれば、すべてが悲しいことになり、JSの初期知識があればゲームをハッキングできることがわかりました。 私のITの関心から外れたはずですが、いや、そのようなゲームを詐欺師から保護するために一般的に何をすべきかと思いました。 そこで、この記事が登場しました。



(注目を集める画像)



次に、ゲームで見つかった弱点と、私が思いついたようなゲームの不正行為に対する保護方法について説明します。



ゲームの本質



各ステップで、プレイヤーにはアニメのフレームと4つの回答オプションが表示され、そのうち1つが正解です。 ゲームは、最初に誤って推測されたフレームまで進みます。 各フレームについて、プレーヤーには15秒が与えられます。 ショットを1回スキップするか、「50 x 50」プロンプトを使用することもできます。



技術的な詳細とハッキングゲーム



サイトのページのURLを見ると、PHPで機能することが簡単にわかりました。 そして、ページをリロードせずにゲームがプレイされたという事実は、AJAXの使用について言及しました。 クライアント機能は、接続された唯一のgame.jsスクリプトにありました



ゲームのセキュリティで私を失望させた最初のことは、game.jsが難読化されていないことでした。 余分なスペースは削除されますが、これとは別に、コードは元の形式になります。



しかし、すべてがさらに悲しかった。 Firebugを起動し、AJAX応答の内容を見ると、非常に興味深いパラメーターが見つかりました。



はい、このパラメーターには、正解のインデックス(0〜3)しか含まれていませんでした。すべてが単純すぎて面白くないとは思っていませんでした。 推測のためにGoogle Imagesを接続する必要があることを望んでいます。



次は技術の問題でした。 最初にしたことは、game.jsからJS Beautifierを介してコードを渡し、読み取り可能なコードを取得することでした。 コードは非常にシンプルで、保護されていませんでした。 AJAX応答は、startGame関数で処理されました。 残ったのは、この関数を再定義することだけでした。 これを行うために、私は小さなgreasemonkeyスクリプトを接続しました。



スクリプトでは、XMLから受け取った応答番号を使用して、目的のボタンを強調表示しました。 その後、彼は2秒後にそれを自動的に押しました。 詐欺師にふけることがないように、コードを提供しません。 文字通り3行あります。 しかし、そのような保護では、最大ポイント数を持つ人がトップに現れなかったことに驚きました。



ゲームの弱点と不正行為に対する保護



正しい答えを伝えることと、選択肢やなぞなぞ、さらには著者の一般的な弱点でさえ、不正行為については考えていない可能性が高いと言えます。 もちろん、正解の数はセッションに保存され、サーバー側でチェックされる必要があります。これはPHPを使用して簡単に実行できます。



最初に検討するのは、クライアント側の保護です。 ゲームにはJSの2つの制限があります。フレームを推測する時間が経過した場合、または別のウィンドウに切り替えた場合、自動的に終了します。 時間はすでに限られているのに、別のウィンドウに切り替えることが禁止されている理由は完全にはわかりません。 プレーヤーがフレームをすばやくグーグルしない場合のみ。 しかし、サイトの作成者を決定しました。



別のウィンドウへの切り替えに対する保護。

その弱点は、JSがクライアントによって完全に制御されることです。 問題を完全に解決することはできません。攻撃者がハッキングするのを難しくすることしかできません。 JSの変更からゲームを何らかの形で保護するには、もちろん、難読化する必要があります。 ページが読み込まれるたびにオンザフライでjsファイルを生成および難読化し、そこに特定のトークンを計算するさまざまな関数を配置して、AJAXを介してチェックすることは非常に便利です。 そのため、攻撃者がJSを置き換えることは困難です。 難しいが、そうではない。



最後に、別のウィンドウへの切り替えに対する保護を無効にするには、window.onblurを再定義するだけです。 しかし、このイベントのハンドラーがオーバーライドされているかどうかを定期的にチェックすることで、これも解決できます。

var onblur_handler = function() { alert('game over'); }; window.onblur = onblur_handler; var check_onblur = function() { if (window.onblur !== onblur_handler) { alert(', !     IP.   !'); window.onblur = onblur_handler; } } setInterval(check_onblur, 2000); // evil code setTimeout(function() { window.onblur = function() { console.log('cheating'); }; }, 2500);
      
      





もちろん、攻撃者はJSをまったく実行しないかもしれませんが、JSが難読化されていて、AJAXリクエストのトークンが含まれている場合でも、これは面倒です。



したがって、アプリケーションはJSから取得した応答番号とトークンをサーバーに送信する必要があります。 サーバーから次の画像へのリンクを受け入れて、オプションに回答します。



制限時間。

時間制限があれば、同じことを行うことができ、クライアント側に保護を残します。 ただし、サーバーの時刻を確認することで安全にプレイすることもできます。 ただし、クライアントによって画像がすぐに表示されるわけではなく、ボタンをクリックしてもサーバーへのリクエストもすぐには表示されないことを考慮する必要があります。 そのため、サーバーに比べてクライアントに有利なスタートを切る必要があります。 クライアントの「バックログ」を分析し、重要な場合にのみ対策を講じることが理想的です。



フレームを繰り返します。

この問題はセキュリティに完全に関連するわけではありませんが、私も検討します。 一番下の行は、フレームがランダムに選択されるため、1つのゲームで2つのフレームが一致する可能性があることです。 これは正しくありません。 問題は非常に簡単に解決できます。 フレームの総数がそれほど多くないことを考慮すると、ゲームの開始時にすべてのフレーム(またはその識別子)を配列に読み込み、ランダムに並べ替え、配列をセッションに保存し、次にフレームをプレーヤーに発行できます。 PHPには、ランダムな順序で並べ替える関数があります。

 shuffle($screenshots);
      
      





スクリーンショットへのリンク。

ゲームのもう1つの弱点は、スクリーンショットリンクです。 ゲームのウェブサイトでは、すべての形式が/web/ANIME_ID/SCREENSHOT_INDEX.jpgの形式になっています。つまり、回答は既に写真のアドレスで強調表示されています。 したがって、スクリーンショットに直接パーマリンクを与えないでください。 同じアドレスを使用して、PHPを使用していつでもスクリーンショットを提供できます。 それぞれの新しい謎の直前に、選択したフレームの識別子をセッションに保存し、特定のphpスクリプトにアクセスするときにこのフレームを送信する必要があります。



問題は、スクリーンショットの最終的な数です。

最後に、最も難しい問題。 実際、フレームの数は限られているため、新しいゲームでは繰り返されます。 攻撃者は、すべてのフレームと対応するアニメを収集するプログラムを簡単に作成できます。 その後、別のプログラムの助けを借りて、現在のフレームと保存されたすべてのセットを比較します。 リンクの問題が解決されなかった場合、攻撃者がリンクのみを比較するだけで十分であることに注意してください。



実際、時間をかけてどのプレイヤーでも、繰り返されるフレームを覚えることができます。 しかし、詐欺師とは異なり、彼は自分でそれを行います。 不正行為者に対処するには、フレームをプログラムで比較するプロセスを複雑にするだけです。



目標を達成するには、フレームがユーザーに送信されるたびに目標を変更する必要があります。 これを行わないと、攻撃者は同じフレームの2つの同一ファイルを簡単に見つけることができます。 PHPに含まれているGDライブラリを使用して、写真を変更できます。



最も簡単なことは、クライアントに送信されるJPEGの品質をランダムに変更することです。

 function open_screenshot($filename) { return imagecreatefromjpeg($filename); } function echo_screenshot($image) { $quality = rand(60, 100); ob_start(); imagejpeg($image, null, $quality); $buffer = ob_get_clean(); header('Content-Type: image/jpeg'); header('Content-Length: '.strlen($buffer)); echo $buffer; } $image = open_screenshot(dirname(__FILE__).'/1.jpg'); echo_screenshot($image);
      
      





これで十分でない場合は、明るさとコントラスト、または他のフィルターで遊ぶことができます。

 function filter_image($image) { $brightness = rand(-10, 10); $contrast = rand(-10, 10); imagefilter($image, IMG_FILTER_BRIGHTNESS, $brightness); imagefilter($image, IMG_FILTER_CONTRAST, $contrast); return $image; }
      
      





ただし、これらの操作はすべて色をわずかにゆがめるだけで、単純なピクセルごとの比較の可能性を残しています。 タスクを複雑にするために、縦横比を保ち、元のサイズに拡大して、フレームを水平および垂直にトリミングできます。

 function cut_image($image) { $k = rand(98000, 100000) * 0.00001; $w1 = imagesx($image); $h1 = imagesy($image); $w2 = round($k * $w1); $h2 = round($k * $h1); $x = rand(0, $w1 - $w2); $y = rand(0, $h1 - $h2); $result = imagecreatetruecolor($w1, $h1); imagecopyresampled ($result, $image, 0, 0, $x, $y, $w1, $h1, $w2, $h2); return $result; }
      
      





ゲームに多くのフレームがある場合、比較のタスクはそれほど簡単ではありません。 ただし、攻撃者がGoogle Imagesに比較アルゴリズムを持っている場合、これは障害になりません。 また、小さいバージョンのフレームを比較する場合、トリミングの効果は小さくなります。



画像は、上記の方法で取得した6つのフレームオプションで構成されています。 ご覧のとおり、明るさとコントラストの値はどこにでもあります。 よく見ると、フレームによっては、他のフレームよりも端で画像がトリミングされていることがあります。



ちなみに、私は通常のグーグルのスクリーンショットに対する保護を思いつきませんでした。 それはそれをさらに歪めることですが、人間の認識に影響を与える可能性があります。



おそらくこれが、この場合の不正行為者に対する保護の技術的な側面について言えることのすべてです。 そのようなアイデアは、遅かれ早かれ、そのようなゲームの保護を気にする開発者の頭に浮かぶと思います。



おわりに



このレベルでのハッキング保護は自慢する大きな理由ではないので、私はまだITの関心がなくてもサイトで不正行為をしませんでした。



実際、不正行為に対する保護の欠如も保護です。 実際、この場合の不正行為は何も与えず、不公平なプレーの容易さはそれに対する関心を殺します。 もちろん、サイトが実際の評価を維持したい場合は、保護に注意する価値があります。



ところで、この記事で説明したことは、この種のゲームだけでなく、もっと深刻なものにも適用できることに注意してください。 たとえば、オンラインテスト。



PS
広告のように見えないように、サイトのアドレスはまだ書いていません。 ただし、「スクリーンショットからサイトを推測する」ということはしません。 問題のサイトはguessanime.comです。

私はサイトとは何の関係もありません。 記事が何らかの形で所有者に触れている場合、ごめんなさい。



All Articles