2005/10/05

AreBackDoorのしくみ

なんか先週あたりからROでステルス移動できるチートツールとかが出回ってGvが大変なことになってたんだとか。

まぁそれのまとめサイトみたいなのがあるのでどんなのかっていうのはそこをとりあえず見てください。

ところで、前のPT侵入バグは正規クライアント上からできる操作によるバグだったわけですが、今回のは普通にチートツールを組んでやらないとできない操作でして、かつ手法はもう確立されてるので根本的な対策がないとどーせ2匹目のどじょうみたいなツールがでてきて意味がないので、まだ穴が塞がってないみたいですけどどうなってるか書いちゃいましょう。…といっても、自分でこれ動かすわけにも行かないので(そこで検証用にAre本体を探してワナいりAreとかをつかむのもバカらしいですよね)、掲示板で得た情報を元にいろいろ推測してるだけですけど、まぁそれなりに信憑性とかはありそう。

で、最初「ステルス移動できるチートツールがある」と聞いて最初の感想が、「え、そんなGM用のInvisibleになれる穴が今更見つかったの?」って感じでして、そりゃ一体どんなパケットを送ったらそんなことができるんだろうと思っていたんですが(でもよく考えたらROのクライアントはGMのAIDのIDナンバリングエリアをクライアント側で保持してるので、そこらへんいじればクライアント側から専用コマンドを送ったりはできそうですけど、さすがにサーバでチェックされてはねられるとは思います)、今回のチートはそんなんじゃ無かったです。つまり、GMの使うInvisible状態とは全く別の次元の話。

具体的にどうなってるかというと、あくまでもGM用のInvisibleではなく「ログインしてるけどマップにはまだいない状態」を作り出すことによって擬似的にInvisibleになってるみたいですね。マップにはまだいない状態というのはどういう事というと、そもそもROの通信はMAP移動時とかテレポ時にはおおざっぱに

  1. クライアントから移動要求(WPやポタ)/テレポ要求が出る、もしくはキャラの初接続など
  2. サーバーから画面切り替えしろよっていうパケットが飛んでくる(0x0091か0x0092)
  3. クライアントからマップロード完了したよっていうパケットを飛ばす(0x007d)
  4. サーバから画面内の情報が色々飛んでくる (とともに、サーバ側でもそのマップにいるキャラのリストに追加されると思われる)

って感じになってまして、3番目のこっちから送るマップロードが終わったよーっていうパケットをチートツールを使って止めている(殺している)というのが今回の穴になっています。

マップロード完了してないのでサーバからは画面内の情報をクライアントへ送りません。これが今回の「自分からも周りの状況が見えない」ということにつながってます。

じゃあなんで周りから見えないのかというと、マップロード完了パケットを送らないのでサーバ側でマップ内に存在するキャラとして登録されてないからです(マップロード完了パケットをサーバが受信すると同時に無敵時間の3/10秒ルールのカウントもはじまります)。

マップ内にいるキャラのリストに追加されてないので、他のキャラが動いたときの通知も飛んできません。そして自分が動いたときの通知も他のキャラに届きません。そして、地面魔法とかルアフ/サイトのあたり判定とかも、リスト内のキャラを全部チェックしてそのキャラが魔法範囲にいるかどうかで決まるので、元々キャラリスト内にいなければ魔法などのスキルとかもあたりません。だからステルス。

かといって、自分が移動する場合はどうもサーバ側でそのマップにいるキャラのリスト内にそのキャラがいるかをチェックせずにデータベースの自分の座標をそのまま移動させてしまうので(ここも穴の一つだけど、まぁ通常利用ならチェックせずにそのマップにいると仮定してよい)、自分の移動はマップロード完了に関係なくできてしまうようです。

で、実際の所本当はこういうことをすると副作用として自分が移動したことも通知されないので、ただ単にマップロード完了パケットを殺すだけでは自分が移動しても自分のクライアントにもその通知情報が来ないんですね。なので今までは実用にならなかったようなのですが、クライアントからサーバに送る自分の移動パケットを元に、その移動パケット(0x0085)に対する移動応答(0x0087)をクライアント側で計算してクライアント内で移動を処理することにより、普通にステルス状態を維持したまま移動をトレースしているみたいです。

もちろん、サーバ側で強烈なラグとかが起こるとクライアント側での計算とサーバ側での実際の移動結果が変わることもあるんですが、少なくともステルス状態なのですべての攻撃はあたらない、つまりヒットストップは起こらないので、かなーりまったりと進んでいけば必ずクリック先への移動は成功します。ここがミソみたいですね。

当然WPにのって次のマップに移動するにはステルス状態を解除してサーバ側のキャラリストに入ってWPを踏んだことにならないと次のマップには移動できません。なので一瞬姿を現す必要はあるらしいですが、また次のマップに進んじゃったらステルス状態なので、ルアフサイトなども意味がないから防衛側はガクガクしながらそのステルスの存在のみを認めなければならない、とそんな感じみたいです。

となれば、実際にステルスを使ってエンペ割ったりせずとも、わざとステルスとわかるように捨てキャラでステルス移動したりして防衛側を陽動して、相手が動揺して手薄になったところを攻め落とす、みたいなテクニックもできるわけですか。ははは、これはずいぶんと知能戦ですね。

とりあえず現状で移動パケットと移動応答パケットは例によってビット演算で迷彩されてるので、今回のAreBackDoorはそこを決め打ちで実装してるらしく次のRagexeパッチが出れば現バージョンは使えなくなりますが(一応それを見越して時限タイマーで今週火曜から使えなくしてるらしいけどしらないや)、根本的な対策はこの「画面切り替えパケットをサーバから送ってからマップロード完了パケットを○秒以内に送ってこないときはそのまま接続切断」みたいなことをしないとダメなんで、クライアントパッチ待ちというよりはサーバメンテナンス待ちって感じですね。

うされもん @acidlemonについて

|'-')/ acidlemonです。鎌倉市在住で、鎌倉で働く普通のITエンジニアです。

30年弱住んだ北海道を離れ、鎌倉でまったりぽわぽわしています。

外部サイト情報

  • twitter
  • github
  • facebook
  • instagram
  • work on kayac