スマホゲームボット攻防戦

[「AWS & Game Advent Calendar 2020」](https://qiita.com/advent-calendar/2020/aws-game) 13日目の記事です。

ゲームボットと言われましたら、最初にどのようなものを思い出しますか？人数が足りない際にプレイヤーの代わりでプレイする良質なボットもありますが、悪質なチートボットもあります。今日はスマホゲームの中、最も多いな「自動化ボット」の攻防について、話しさせていただきます。

この投稿は、個人の意見であり、所属する企業や団体には関係ありません。データは全部ネット上で集められたものです。

#はじめに、自動化ボットとは？
　自動化のボット(オレオレ定義)とは、ツールやプログラム言語を利用し、自動プレイできるツールのことです。中には大きく分けて２種類があります。一つはゲーム内の利益を得るための自動プレイボットで、デイリークエストや周回イベント（ボッ〇〇〇チャ、古○場）などのところで多く出る傾向があります。もう一つはリアルマネーを稼ぐためのボットで、リセマラボットやデイリーボーナス取得するボットがそれを該当します。前者は個人利用が多くて、後者は業者で複数アカウントで行うことが多いです。業者は大量のアカウントをボットで回し、[人権キャラ](https://word-dictionary.jp/posts/3245)またはガチャに回せる十分な通貨を集まったら、初期アカウントとしてトレイドサイト（例：https://gametrade.jp/） で売買され、リアルマネーを獲得します。
自動化ボットのイメージ（出典:https://game.watch.impress.co.jp/docs/series/koreagame/1182993.html ）
![スクリーンショット 2020-12-14 0.03.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163447/3e96915f-8f6e-6e7a-c139-35bab1c8a976.png) 

#ゲームへの影響は？
　自動プレイボットは自分だけのことに見えますが、他のプレイヤーに不公平、不利益に与える可能性があります。特にランキングに関わるイベントは、対応しないと炎上になり、ユーザ全体の満足度を影响する恐れがあります。
　一方、業者側で利用するボットはユーザ側の認知度が低いが、ゲーム運営側に大きく負担をかかることが多いです。ボットユーザが大量に作られることにより、APIサーバ及びデータベース（DB）側のへの負荷が増加します。ユーザを分析する際に、ボットユーザを排除する必要があるため、手間がかかります。費用面にも、大量のアクセスによるサーバとログの費用及びリセマラによるCDN費用が発生します。割合として小さいかもしれませんが、ゲーム運営者視点から見ると、自分たち収益を得られず負担が掛けられた一方、逆に業者側がお金を稼いていることはムカつきますね。
　こうして、自動化ボットにめぐる攻防戦が始まっています。

#攻：ボットはどのように作られていますか？
## レベル１：GUIツールだけ利用するパターン
 　プログラムスキルが必要なく、GUI操作だけでスクリプトを作れるため、閾値が非常に低い。特に最近のエミュレーターは操作記録機能を搭載したことが多いです。例えば、NOXの「スクリプトレコーディング」機能でしたら、操作を記録し、スクリプト化することができます。その後、記録されたスクリプトを繰り返して再生し、自動化プレイを実現できます。動作イメージはこちら
[![サンプル](http://img.youtube.com/vi/BkfJASa4fYE/0.jpg)](http://www.youtube.com/watch?v=BkfJASa4fYE)
レコーディング機能は簡単に見えますが、対応できるパターンが非常に限られています。ゲームでは、ランダム要素が多く、ずっと同じプレイでカバーできる場合はかなり少ないでしょう。逆に、どんな敵でも同じパターンで勝てば、そもそもデッキが十分強く、ツールを利用しなくでも大丈夫かもしれない。さらに、スタミナや時間限定などのゲーム開始条件が様々のため、十分強くでも自動プレイができないケースが多いでしょう。

##レベル２　ツールとプログラミングの組み合わせ
　エンジニアの皆さんは上記の状況を見れば、なにが足りないかすぐわかるでしょうね。そう、「条件分岐」が必要でした。「失敗したらリトライ」、「スタミナが切れたら補充する」などの条件分岐ができれば、”理想”な自動化ツールになれます。しかし、自分で書いたプログラム内で条件分岐を書くことが簡単ですが、ゲームは既に出来上がったため、条件分岐を組み込めることは難しいでしょう。最近のツールでは、画像認識を利用し、条件分岐を作ることがほとんどでした。ここは機械学習の画像認識ではなく、特定な範囲の中、保存された画像が存在するかどうかを判断するだけです。
あるゲームの自動ログインのサンプルプログラムを例として説明します。まず、画像をピクセル単位で切り取ります。その後、特定な範囲で切り取った画像を検索し（FindPic)、見つかったらクリックする（LeftClick）ような条件分岐分岐を行う。
ご覧の通り、書くこと自体が大変ですし、画像の解像度に依存するためメンテナンス性も悪いため、個人ユーザがここまでやることは少ないと思います。多くの場合、業者がツールを作成し、一般のユーザに販売する形になります。
![p1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163447/b333d0bf-b080-5e9d-8dbe-4d3858adcfa3.png)
## レベル３　現代のプログラムでスクリプト化
　メンテナンス性と汎用性を上げるために、やはり現代なプログラム技術でやる必要がありますね。なので、レベル３ではエミュレーターと連携し、完全プログラミングベースで行うことが多いです。ここまで来たら、もう皆さん日常で書いているプログラムとほぼ変わらないです。中国で有名のゲーム「アー〇〇イツ」の自動化ツールを例として説明します。ツール完全にpythonで動いてい、[OCR](https://ja.wikipedia.org/wiki/%E5%85%89%E5%AD%A6%E6%96%87%E5%AD%97%E8%AA%8D%E8%AD%98)を利用し、画面上の文字を識別し、対応の動作を行います。上のスクリプトと比べて、ロジックはかなりはっきりしていて、メンテンナンスもしやすくなりました。
![スクリーンショット 2020-12-14 0.14.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163447/48e14b9b-78de-80c3-2aad-62e4c06240ab.png)
## レベル４：複数手段の組み合わせ
　ここまでは大体個人でもできそうですが、業者側で利用する周回ボットやリセマラボットは、さらに複雑な仕組み（より高速、より軽量化）を持っています。悪用されないため、やり方の紹介は割愛しますが、レベル1~3のやり方と悪質な技術の組み合わせをイメージしていただければと思います。

# 防：ボットはどのように対策すれば良いでしょうか？
 攻のやり方を理解できたら、対策すること自体も明確になります。

##レベル１　ログの記録と分析を行う
　あたり前のようなことですが、意外とやっていないところがあります。ゲーム開発が忙しいため、ヒットするかどうかがわからない時点でボット対策に投資したくない気持ち非常に理解できます。しかし、ログを記録しないと後でボットを検知しようもないため、最低限のログを揃えたほうが良いと思います。データの構造化をしないまま、とりあえずデータレイクに保存し、必要なときで分析を行います。このような[データレイク](https://aws.amazon.com/jp/big-data/datalakes-and-analytics/what-is-a-data-lake/)のアプローチはおすすめです。

　その後の分析について、ゲームの特徴に応じてやり方が様々です。例えば、毎日ログインボーナスをもらう業者用ボットをなんとかしたい。業者用ボットは多くのアカウントを同時操作するため、似たような操作を短時間で行うケースが多いと思われます。そのため、一定時間間隔（数秒）のログイン記録を抽出し、高い順で並び、グループごとのログインIDとIPを比較すれば、一部のボット検出できるかもしれない。事前にログを貯めていれば、仮説を思い出すたびにすぐ検証することができ、改善のフローもスムーズになると思います。

　非構造型のログを分析するために、AWSでは様々なサービスを提供しています。Athena, GlueやRedshiftなどの古株サービスはもちろん、個人的に一押ししたいのは今年re:Inventで発表された[Glue DataBrewのサービス](https://aws.amazon.com/jp/blogs/news/announcing-aws-glue-databrew-a-visual-data-preparation-tool-that-helps-you-clean-and-normalize-data-faster/)です。今までエンジニアしかできないデータ整理と抽出作業は、ゲーム企画側の方でもできるようになり、コードを記述することなく、データのクリーンアップや正規化することができます。

## レベル２　制限を掛けます
　IP、地域、アクセス頻度に制限を掛けることは業者ボットに対して、非常にシンプルかつ有効な方法と思思います。AWS WAFではこれらの対応を数クリックで簡単にできます。もし業者側でプロキシやVPNなどの仕組みを利用し、IPや地域の制限を突破したら、匿名 IP リストのマネージドルールを利用することにより、これらの匿名ネットワークの背後にあるボットから発信される悪意のあるトラフィックをブロックできます。 更に、他のAWSサービスと連携し、動的に怪しいIPをブロックするシステムも構築可能です。2018年re:Inventで発表されたpokemonsのWAF自動化更新アーキテクチャにご参考してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163447/0fbc813f-1c27-2ebc-f462-5680e3f80772.png)

##レベル３：監査の仕組みを入れます。
 上記の取り組みは大量なアクセスが発生する場面が有効ですが、個別ユーザが利用する自動プレイツールの対応が難しいと思います。その場合は、ログで事後対応以外、監査ツールの導入も一つのアイデアだと思います。こちらも大きく分けてキャプチャ認証みたいな人間で判断するタイプと、裏でアクセスログで判断するタイプの２種類があります。前者は効果が良いものの、ユーザのプレイ体験に直接影响が出るため、頻繁に行うことができません。後者に関して、ユーザ側に影响しませんが、バレたらボット作成者に対策される可能性が高いため、ボットをより進化されるリスクがあります。
例：グラブルの自動監査
![pic6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163447/99938bbc-b606-aa25-e508-7df62a0d4f02.jpeg)

##レベル４：機械学習でボットユーザを判断します
レベル１〜３まで対応すれば、ほぼ多くのボットが撲滅されますでしょう。しかし、ボット製作者側も継続的に対策を行っています。特に人気なゲームでは自動化ボットを完全排除することが難しいでしょう。ボットは監査の仕組みに対してカウンターを打つことができますが、人間の行動を真似することはできません。そこで機械学習の出番です。荒野行動など人気なゲームを開発したNetEaseさんの論文を引用して説明します。下記の図のように、人間の行動はばらつきが多く、ボットはほとんど似たような動きをします。

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163447/99795a05-fb84-34e3-c4cb-02afbe2b9951.png)
したがって、アクセスの特徴を用い、モデルを訓練することができたら、機械学習でボットを判定することは容易だと考えられます。実際NetEaseさんは１年半、合計107TBのプレイログを用いて、モデルをトレニングした結果、約99%の正解率でボットを識別できました。このような機械学習の手法は導入コストが高いですが、仕組み的に製作者側からカウンターを打ちにくいため、高い効果が期待できます。
　従来の機械学習のパイプラインの構築は複雑かつ高価でしたが、Amazon Sagemakerを利用すれば、機械学習用に使用できる全コンポーネントを1 つのツールセットに集約し、パイプライン構築の手間と費用を大幅に抑えられることができます。先日のadvent calendarに、[Amazon SageMakerを利用したチート検知の記事](https://qiita.com/zentahori/items/e1f1b403dce27ac8bfaf)があったため、興味がある方はぜひそちらもご覧になってください。


#余談
自分はソシャゲ一マーとして、ボット利用したい気持ちはとても理解できます。特定の賞品を得るために、ずっと周回しないと行けないイベントをやる際に特に思います。初期アカウント購入も同じく、一定期間運営したゲームに新規参入することはなかなかハードルが高く、人権キャラが無い状態でゲームを挑むことはとても難しいと思います。したがって、ボットが大量に出て対策しないと行けないまら、ゲームの改善も少し思い出していただければ、一プレイヤーとしてはとてもうれしいです。

#最後
ここまで読んでいただいてありがとうございます。もし少しでもご参考になりましたら、ぜひLGTMやSNSでシェアをしていただければと思います。
この記事で利用した一部のデータと画像は以下の参考資料から取得したものになります。

https://game.watch.impress.co.jp/docs/series/koreagame/1182993.html
[NGUARD+: An Attention-based Game Bot Detection Framework via Player Behavior Sequences](https://galina0217.github.io/works/nguard/nguard_plus.pdf)
https://github.com/ninthDevilHAUNSTER/ArknightsAutoHelper
https://www.youtube.com/watch?v=zyP-pfij86s
https://www.bilibili.com/video/BV1Xt411T736