fr33f0r4ll

自分用雑記

FPSのチートソフトを解析した話

FPSのチートプログラムを解析した

  • 結論
    • アンチチートの人達大変そう
    • 中国人やべーな

経緯

なぜそんなことになったかというと、特に理由はなくひょんなことからチートプログラムを手に入れる機会があったのでせっかくだから解析してみるかとなったからです。 そこから現在のチート検知がどのような手法を使って検知しているか、チートを防ぐのがどの程度困難なのかが分かっておもしろかったので、書き残しておこうと思います。

チートの内容

4つのチートが手に入ったのですが、そのうち2つはバージョンが違う同一のものらしいので実質3つです。 そして、そのうち1つがC++で実装されたオートエイム機能があるもので、バイナリのみがあります。 他の2つはアンチリコイルのチートで、ほぼ同じ実装になっており、AutoHotKeyを利用したものでした。

説明するまでもないですが、オートエイムは敵を発見次第自動的に照準を移動させ、敵に照準を合わせ続けるチートで、アンチリコイルは銃の反動をほぼないことにするチートです。

なお、これらのプログラムの動作自体は検証していないので(BANされたくないし)、実際は動作しなかったりBANされたりする程度のものかもしれないです。

オートエイム

C++で書かれたプログラムで、解析対策は一切行われていなかったのでとても解析しやすかったです。 マルウェアと違ってチートは対策側の手に渡ることを必ずしも想定しなくてもいいからでしょうか。 イタチごっこが進んでよりチートが稼げるようになるとその辺の事情も変わってきそうですね。

このチートはAIを使ったチートと銘打たれており、実際画像認識を使用していました。 使われていたのはYoloXという手法の物体認識をする機械学習モデルのようで、こちらのライブラリを使用しているようでした。 画面全体をWindowsAPIを経由してDevice Contextを取得し、そこから画面全体をBitmapとして取得します。 そのBitmapを学習モデルに識別させて対戦相手を認識しているようでした。 その後、NtCreateFileでGHUBのドライバへの制御を取得し、ドライバに対してマウスカーソルを動かす操作をしてエイムを合わせるようになっているようです。

この手法の巧妙なところは、ゲームプログラム自体には一切タッチせずにエイムすべき箇所を識別し、エイム操作をしているところです。 従来のチートでは、ゲームプロセスそのものもにアクセスしたりパケットをキャプチャしたりしてゲームシステム上の情報を取得し、エイムすべき箇所を取得していたようです。 あるいは、Windowsに存在するAPI越しに操作をすることで様々な動きを実現していたと思われます。 つまりアンチチートソフトとしてはゲームのデータを取得しようとする動きや、マウスやキーボードのような機能へのアクセスだけ検知すればよかったのです。 しかし、今回解析したチートの手法はこのような方針では検知できないように思えます(最初に言ったとおり検証していないので普通に検知してくるかもしれないです)。 ゲームプロセスにはアクセスしないため、アンチチートソフトには画面を直接取得する操作と、マウスメーカーのドライバが何らかの機能を発揮していることしか分かりません。 もちろんチートソフトのプロセスをことこまかに観察するようにすれば怪しいと分かりますが、全てのプロセスを厳密にリアルタイムで解析できるかは疑問です。 実際には全然可能かもしれないですが、実際に検知させるわけにもいかないのでそのあたりの判断は難しいです。

ならば画面のキャプチャをしたりする動作や、マウスなどを動かすような動作を検知すればいいではないかとなるかもしれませんが、これには問題があります。 もしそのような基準にした場合、画面のキャプチャをするソフトはチートではありませんがチートとして誤検出されてしまう恐れがあります。 そもそもゲーム配信をする場合はそもそも画面を取得することが前提です。 そういったソフトを一律に禁止するのは不可能でしょうし、画面のキャプチャといった一般的な挙動を基準にするのは難しそうです。 また、まったく正当なソフトウェアを禁止にすればユーザから反発がありますし、他の企業に対する営業妨害にすらなりえます。 例えば、「Logitechのドライバが入っていたらVarolantが起動しないようにしました」ということになったら、Logitechの売上に影響する可能性は否定できないでしょう。

また、公式なメーカーから出されたドライバ越しにカーソルを操作するというのも検知がやや難しそうです。 そういったソフトウェアがマウスに対してある程度の操作を加えるのはありえそうです。 振動や手ぶれへの補正はどうなっているのでしょうか?今後調べてみるのも面白そうです。 こうした公式メーカーのドライバやソフトウェアというのは無数にありそうですし、そういったドライバへの操作を完璧に検知するというのは難しそうです。 ましてや公式メーカー以外に出されているものも多くあり、その使用を制限する正当性はありません。 というよりそもそも、そういった方針でチートを防ぎたいのならコンシューマー機向けに開発すればよいのです。 ただしそうなるとPCシェアの巨大さにタダ乗りした非常に多いユーザ数というメリットは失われます。

オートエイムについては解析した結果以上のようなことが分かりました。 完璧に解析しきったらもう少し技術的に詳細にしてもいいかもしれません。

アンチリコイル

こちらはもっと簡単に実装されていて、AutoHotkeyスクリプトとして主に実装されていました。 hyde.dllというプロセス隠蔽ライブラリを利用してプロセスを隠蔽することで検知を免れているようです。 ゲームにおける各武器ごとの反動パターンがほぼ固定である場合、その武器を発射するたびにその反動パターンと逆にカーソルを動かせば無反動になるという理屈で実現していました。 武器の判定は画面上における色の分布で判定していて、カーソルを動かす操作自体は外部ライブラリにて実装しているようです。 mouse_event経由でカーソルをコントロールしているようで、若干検知されそうな感じがします。 AutoHotkeyはDLLの関数を呼び出す機能があるため、簡単なスクリプトで複雑な機能を呼び出すことができます。 特徴的なのは、音声による読み上げで情報を渡している点です。 配信者や画面共有のさいにバレずに情報を受け渡すためには最良の方法かもしれません。

こちらはやや検知しやすそうなものの、手軽で労力がかかっていません。 反動パターンなどの資料はたいしてアンダーグラウンドでもないようなコミュニティで共有されているようです。 探せばすぐ見つかりますが、探せばすぐに見つかるので載せないようにします。

賢明ならば分かることですが、AutoHotkeyhyde.dllは正当な目的のために使える正当なソフトウェアであり、チートソフトなどではありません。 あくまでその上で動作したり呼び出したりするスクリプトがチートソフトなのです。 それらを使用不可能にしようとしたり制限しようとする愚かな人間が後を断たないので注意事項として書いておくことにします。

その他の情報

これらのチートのうち、ひとつはおおよそ作者と思われる存在を見つけることに成功しました。 こちらリポジトリとコードが一致した。

探せばすぐ見つかりますが、探せばすぐに見つかるので載せないようにします。

とは言ったものの、これに関しては「Apex Cheat」で検索すればすぐに出てくる程度のものであるのでどうせだしちょい出ししておくことにします。 アンチリコイルはまだ影響の少ない方のチートだからというのもありますが、結局は言い訳ですね。

さて、こちらの作者なのですが、驚くことに名前や住所、メールアドレス、所属する会社まで公開しています。 それによると中国在住のようです。 もちろんGitHubに登録できる情報というのは個人が勝手に登録したものであり、その真正性をまったく保証しないものです。 しかし、登録されている会社はオフィシャルなリポジトリを所有しているため、まったく関係のないアカウントが所属登録した場合に通知がいくのではないかと思われます。 この点については仕様をろくに知らないので判断ができませんでした。 とはいえ、おおよそ正しいのではないかという気もします。 向こうではこういった行為はかなり受け入れられているのかもしれません。

以上です。