この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
今回は、オンラインゲームで自分を有利にするチート行為に迫ってみよう
一般的に、チートはゲームをプレイするうえで、自分に有利なように働きかけるパッチやアプリケーションによって行われる。オンラインゲームではないゲームの場合、保存されているセーブデータを書き換えることで、自分のレベルを上げたり、アイテムを増やしたりすることができる。オンラインゲームの場合、そう簡単に行うことはできない。前回説明したように、チートを管理しているゲートウェイが存在しており、送られるパケットの整合性をチェックしており、そう簡単に、通過することはできない。
そもそも、ネットゲーの場合、ユーザのPCにインストールされているアプリは、あくまでもクライアントであり、実際にプレイを行っているのは、接続されたサーバ上になる。このため、どんなにPC上のクライアントを変更しようとも、その過程をチェックしているゲートウェイをだますことができなれば、チート行為は成立しない。
このゲートウェイは、ネットワークセキュリティにおける、IDSやIPSと同等のことを行っていると考えれば良いだろう。通常、やりとりされる通信の内容から、不正を見抜く方法が用いられる。この場合、何らかの方法を用いてチェックサムをチート時も書き換える必要がある。
■ では、具体的にその手法についてみていこう。
チート行為を行うには、大きく分けて2種類の方法がある。1つはメモリを書き換える方法だ。先ほど書いたように、ゲームのデータそのものは、サーバ側に蓄積されている従って、これを直接書き換えることはできない。が、ゲームの仕様上、一時的にクライアントアプリのメモリ空間に持つことがある。これは、高速な回線で通信していれば問題ないが、低速な回線(100kbps以下)では、戦闘中のデータを的確に更新することが出来ず、サーバ内での戦闘とユーザの見ている戦闘が同期しないケースが出るためである。クライアントに保持される内容には激しい戦闘情報やアイテム交換など様々な要素が有り、戦闘が始まる前と終わるときに、サーバとクライアント間でデータが交換される。複数のユーザで的を倒す際も、同様の行為が行われるが、この場合はユーザが敵に対して行った攻撃情報がサーバを介して各ユーザに敵の状態と共に提供される。
このような状況で、注目すべきは、クライアントに保持されるメモリの内容だ。
このメモリの内容は、定期的にチェックされ、改ざんできないようにチェックされている。このチェックは、ユーザの目からすると常に行われているように見えるが、リアルタイムで行われているわけではなく、早い状態だと数μs程度、遅くとも数ms程度で行われている。当然として、この速度はゲーム全体の速度からすれば、かなり遅い「割り込み」であり、これ以外にも様々な「割り込み」が存在する。
■ 今回は、この割り込みについて注目する。
先ほども述べたように、メモリ内の改ざんチェックの割り込みは、ゲーム全体からすると、かなり遅い部類に入る。割り込みタイミングさえわかれば、次の行為を行える。
1.アイテムや経験値、金などが含まれるメモリアエリアを特定する
2.割り込みタイミングを定点観測し、どの時点での割り込みが「もっとも頻繁に行われるか」を確認する
このうち、2.が重要となるので、何度もリトライを繰り返した方が良いだろう。
1は、ゲームによって異なるが、多くの場合は、メモリの相対アドレスは決まっており、そのメモリ内に、確実にアイテムなどの情報はまとまって置かれる。
■ やり方はこうだ。
1のエリアを限定した状態で、1の内容を他のエリアに一度コピーする。
2の割り込みが入った直後に、内容を改ざんする。2の割り込みが入る直前に、コピーした元の内容を書き戻す。書き戻す際には、ゲームで進行した情報は忘れずに加える。
こうすることで、メモリ内部は書き換えられ、ゲーム進行は思いのまま、得られる金や経験値、レベルなどはウハウハである。
とはいえ、これを人間業で行うことは、とうてい無理。そこで、プログラムを書くわけだが、イメージ的にはバッファオーバーフローをしかける事に似ている。
メモリを直接書き換える場合は、「割り込み」の存在を必ず忘れないように!
■ パケットを改ざんする方法
先ほどは「割り込み」との戦いであったが、今度は、ゲームサーバのチートチェッカとの戦いだ。
チートチェッカは、送られてくるパケットの内容が適切であるかをチェックしている。とはいえ、すべてのパケットの内容を一つ一つ確認しているわけではなく、これも割り込みを利用している。クライアントから送信するパケットを改ざんし、送信すればたちどころに「チート行為」と見抜かれてしまう。では、どのようにするかというと、、、
パケットを改ざんしたら、必ず「チェックサムと呼ばれる物も改ざんする。」チェックサムは、そのパケットが正しいかを確認している物であり、内容(数値上の内容)とそのチェックサムさえ一致すれば、チートチェッカは素通りさせてくれる「可能性がある」。あくまでも、可能性であることを忘れてはならない。
こういった行為は、あまり頻繁にやると、「垢バン」される事になりかねない。十分注意されたい。