agar.ioブラウザーゲームのボットを作成しています



agar.ioのような素晴らしいWebゲームについては、おそらくすべてがすでにわかっています。
もう一度彼女のより幸運なライバルに負けて、私は静かに自分に呪いをかけ、最終的に有利になるためにこのおもちゃをなんとかして割ろうと決めました! その結果、ゲームセルに参加するために、マップ上で自分を見つけようとするゲームボットの分離を作成することができました。

ゲームクライアントに入ります


まず、すべてがどのように機能するかを理解する必要がありました。
ゲームはJavaScriptで記述されており、Webソケットを介してゲームサーバーと通信します。

メインのゲームスクリプトはmain_out.jsファイルにあります。
そこにあるコードはもちろん難読化されており、あらゆる方法で、本来すべきではない場所から実行されないようにしています:

if ("agar.io" != h.location.hostname && "localhost" != h.location.hostname && "10.10.2.13" != h.location.hostname) h.location = "http://agar.io/"; 

Chromeデバッガーを使用してファイルを読み取り可能な形式に拡張すると、ゲームのロジックにどのように侵入するのかという疑問が生じました。

まず、ファイルのローカルコピーを作成してサーバーに接続し、ブラウザでのクロスドメイン検証を無効にすることにしました。

 #  /css/bootstrap.min.css /js/jquery.js /index.html /main_out.js /quadtree.js #   same origin policy chrome.exe --disable-web-security 

これは、ゲーム地域のAJAXリクエストでは機能しましたが、Webソケットを介した接続の試みは拒否されました。 別のアプローチが必要でした。

URLによるファイルの置き換え


実用的なソリューションは、実際のゲームクライアントをダウンロードすることでしたが、ブラウザに必要なファイルを独自のものに置き換えました。 これを行うには、素晴らしいプログラムFiddler Web Debuggerをインストールし、AutoResponderタブで必要なパスを指定します。



このアプローチでは、明らかに、ゲームセッション中にFiddlerを実行し続ける必要があります。

サーバーをだまそうとする


私はゲームの作者を称賛したいと思います-その好意で変更される可能性のあるものは何もサーバーに送信されません(たとえば:あなたのサイズ:))。 クライアントは、マウスの座標のみを送信します。マウスは、セルを移動したい場所に移動し、目的のアクション(例:分割)について報告します。

サーバーは、クライアントの「余分な」データを送信しません。 たとえば、ゲームマップの縮尺を増やしても、サーバーはセル内に表示されるはずだったオブジェクトのウィンドウのみを送信しました。



すべてのパスが閉じているように見えます。サーバーは重要な情報をクライアントに信頼せず、すべてを独自に計算します。

しかし、その後、サーバーをそのルールにintoすことができます。ボットの群れを作成して、常に自分自身を犠牲にして、私の質量を増やします。 しかし、ボットはどのようにしてマップ上で私のセルを見つけることができますか? サーバーAPI自体が役立ちました。たとえば、座標(0、0)を常に送信すると、ゲームセルは常に、マップのこの部分に従い、目標に到達するまで停止することはありません。 ゼロの代わりに、現在の座標をボットに送信するだけで、ボット自体が夕食のためにボットに来ます!

現在のウィンドウでボットを作成します


クライアントコードは同時にデータを受信し、画面上のオブジェクトを再描画します。 ボットと私のゲームタブの1つで制御される20個のタブを開くことができます。 しかし、その後、何らかの方法で座標を隣接するタブに転送する必要があります。 さらに、各タブを描画すると、ブラウザ全体の速度が低下します(私は試しました-)。 したがって、現在のタブで新しいゲームセッションを直接作成し、それらのディスプレイとの接続をオフにすることが決定されました。

 //    var isBot = true; for (i = 0; i < botsCount; i++) { //     , //       setTimeout(function(){ game(window, r, isBot, botsUrl, M); }, 500); } //       function paint() { if(bot) return; //... } 

また、ボットが死んだときに自動的に新しいセッションを開始するようにコードを追加する必要がありました。

作業結果


ボットが作成されます。 そして、彼らは地図上で私を見つけます!



しかし、すべてがそれほどバラ色ではありません。

まず、サーバーはプレイヤーをゲームルームに分散させます。 したがって、私と一緒に50のボットのカードに2〜3を獲得します。 残りは他の部屋で「遊び」、隣の宇宙からの座標に従います。

第二に、他の誰かがボットを食べることができます! したがって、彼らは1分間に数回どこかに私のところに来ることができます。

そして最後に、第三に、ボットは小さいです。 私に向かって歩いて、彼らは多くの質量を得ていません。 したがって、特定の段階から、私の勝利への貢献は最小限になります。

結論


このゲームの作者は、ありふれたハッキン​​グから壊れない素晴らしいネットワークコードを作成しました。 ただし、ゲームはボットキーピングから保護されておらず、クライアントコードを少し理解しているため、他の技術よりもわずかな技術的利点を生み出すことができます。

ボットが目的のカードに接続されるように質問を決定すると、技術に詳しくないライバルを真剣にプッシュする機会があります。

私の小さな目標を達成しました:


たぶんボットのおかげで、自分自身が幸運だったのかもしれません。

[ 顧客概要コード ]

あなたの注意とゲームの幸運に感謝します!

Source: https://habr.com/ru/post/J257619/


All Articles