Agar.ioは超有名なゲームなので知っている方もいると思います。
今回のお話はアプリ版ではなくブラウザ版のアガリオが対象です
https://agar.io/
現在は残念ながら過疎化が進んでしまいましたが、全盛期は本当に大人気でした(海外では)
人気なゲームゆえに、やはりチート(ボット)を作る人たちがいました。
2015年から始まったゲームですが、つい昨年までずっと「ボットを作る→運営がBOT対策→Bot対策を突破できる新しいBotを作る
」が繰り返されてきました。
なので現在のAgar.ioのAntiBotはかなりエグイものになっていますw
私もAgar.ioを解析して独自のクライアントを作ったり、Botも作ったことがあるので、Agar.ioのBot対策がどんなものかをご紹介したいと思います。
#はじめに
Agar.ioのAntiBotを紹介する前に。
まず、Agar.ioは自分より小さい敵(細胞)を食べて大きくなっていくゲームです。
たくさん食べれば食べるほど大きくなれます
つまり、Botを大量にスポーンさせて自分に向かってくるようにすれば急速に大きくなれるわけです。
Botはゲームのプロトコルを真似れば(正規のクライアントを全く同じやりとりをすれば)作ることができます。
これをするためには
通信内容を解析したり、JavaScriptで書かれたゲームのコアを解析する必要があります。
補足:Agar.ioはWebSocketを用いたリアルタイムのオンラインゲーム
これを簡単に解析されては困るので運営はBotが作られるたびに解析が困難になるように対策するのです。
#Agar.ioのAntiBotまとめ
伝わりづらい部分も多々あると思いますが・・・。
順番に書いていきます
###Emscriptenで出力されたコア
JavaScriptが難読化されていても根気よく読めばいける!と思いたいですが、そうでもないんですよね
Agar.ioのゲーム本体のコードはEmscriptenで出力されたJavaScriptなので非常に解読が困難です。
(EmscriptenはC/C++で書かれたコードをJSに変換できるツール)
JavaScript Obfuscatorとかで難読化されたコードなら私でも読めますが、Emscriptenで出力されたら無理です
これのせいで未だに全てのプロトコルの解析ができた人はいません(ほぼできているけど)
###クライアントからサーバーに送信するメッセージがすべて暗号化されている
コードを解析できないなら、通信内容を解析すればいいんじゃね?と思いますが、これも対策が施されています
クライアントから送信されるメッセージがすべてXORで暗号化されています。
XORは以下のような性質があります
a ^ b = c
c ^ b = a
2回同じ値でxorすると元の値に戻ります
bが暗号化キーというわけです
クライアントでxor暗号化 -> 送信 -> サーバーでxor計算して複合化
という流れです
「あれ?じゃあ暗号化キー判明すれば、通信内容とのxor計算するだけで複合化されたデータを見れるんじゃね?」
と思うかもしれませんが、
実はキーは一つのパケットを送信するごとに変化するようになっています。
つまり、最初のキーがわかっても複合化できるのは一番最初に送信されるパケットだけになります。
次のパケットを解析したい場合は鍵を同じアルゴリズムで変化させなければならないのです
このアルゴリズムを解析するにはEmscriptenで出力されたコードを解析する必要があります。
###サーバーから送られてくるデータも暗号化されており、圧縮されているものもある
サーバー -> クライアント
でも同じようにxorで暗号化されたデータが送られてきます。
一番最初に複合化するためのキーが送られてきます
また、一部のデータ(フィールド上のプレイヤーデータなど)は圧縮された状態で送られてきます。
ちなみに、先ほどクライアント -> サーバー
のパケットは暗号化されていると書きましたが、
暗号化に使われるキーは、サーバーから送られてくるデータを使って生成されるます。
なので、生成されたものをコアから抜き取るか、サーバーから送られてくるデータを複合化するしかありません。
###データにずらしが入っている
botを作っても自分の方向に向かってくるようにしないと意味がありません
これを困難にするために、座標情報がずらされています。
説明が難しいですが、ずらしを考慮して座標パケットを送信しないとbotがスクランブルしてプレイヤーのもとに向かってきません。
###reCAPTCHA
有名なbot対策であるGoogle reCAPTCHAが導入されています。
いつごろからかわかりませんが、
reCAPTCHAが導入され、プレイヤーが何度もすぐに死んだり怪しいプロキシを経由して接続すると
reCAPTCHAによる認証が要求されてしまうようになりました
これを回避する方法が発見され、一時期盛り上がりましたが
今度はreCAPTCHA V2に続きV3が導入され、
プレイヤーがスポーンするたびにV3による認証が必要になりました。
これを突破したのが私なのですが、数か月後に対策されて今はもう使えませんTT
#さいごに
Agar.ioのantibotを紹介しました。(もしかしたら他にもあったかもしれない)
チートすることの何がおもしろいの?と言う人がいるかもしれませんが、
確かにただのプレイヤーだったら、すぐに飽きる原因になりますし、面白くないかもしれません
しかし、作る側からすればめちゃくちゃ面白いです
antibotを突破できたときの達成感はデカイですし、他の開発者と繋がったりゲームのオーナーと話ができたりして刺激的です。
もちろん褒められたことではありませんが、めちゃくちゃ成長できました。
おわりです