メカニズムやソフトウェアモジュールをプログラムして、自分の意志で実行できるようにするのはとてもクールです。2018年の終わりにも同じような考えで、私は自分で完全に制御されるWoWサーバーを自分で作りたいと思っていました。MANGOSのC ++ソースコードを研究した結果、MMO RPGサーバーが最初から最後までどのように機能するかを理解しなければ、このようなアイデアをすべて取り入れて実装することはできないという結論に達しました。そして、この目的のために、私は自分のエンジンを実装することにしました。ゼロから。
そもそも、最初はドキュメントのソースコードしかありませんでした。私はフォーラムを少しずつ検索して、私の多くの質問に対する答えを探しました(この点で、MANGOSコミュニティへの大きな敬意、非常に敏感なチーム)。試行錯誤の末、ログインサーバーの最初のプロトタイプを実装し、キャラクター選択画面にたどり着くまでに、合計で数か月かかりました。
つまり、ログインサーバー(WoWクライアントでの認証など)は、SRPアルゴリズムを使用して構築されています。アルゴリズムの説明は記事の範囲を超えていますが、要するに、サーバーにパスワードを送信せずにユーザーを識別できるため、パスワードを(キャッシュされた形式でも)サーバーに保存することはできません。さらに望ましい。
Worldサーバーの暗号化アルゴリズムは、クライアントごとに異なる可能性があります(WoW 3.3.5aサーバーのソースコードを簡単に調べたときに、この結論を出しました)。私はWoWバージョン2.4.3用のサーバーを開発していました。そこではシーザー暗号のようなものが使われています。多くの場合(ソースで)、HeaderCryptまたはWowcryptという名前を見つけることができます。
バージョン2.4.3では、最初の6バイトが暗号化されます。Worldサーバー上の各パケットのサイズ(2)とオペコード(4)(最初のパケットを除く)。したがって、パケット(スニフ)を傍受すると、どのオペコードに送信されるかを判断できなくなります。また、パケットが大きい場合は、複数に分割できます。パケットをバッファから正しく取り出すには、最初の2バイト(サイズ)が必要です。
サーバーにログインするプロセスは、次のように簡単に説明できます。
Login SRP (session key), / (crypto key). "send auth request" (. ). auth response, - , . Auth response - , crypto key. - .
World - , , ( ), (size) (opcode) >= size, ( ) size . . Update Packet. .
. - , ( ) . .
-, Python 3 (asyncio + SQLAlchemy). , SQLAlchemy - , , - ( ). .
-, . ( ) (manager), , : Item, Player, Unit .. .. Player, PlayerManager, . . , MANGOS ( C++, ). - SQLAlchemy - , . , , .
-, - handler - . . () ( + - ), .
-, MANGOS , ( ?). (, ). , - , , ( blizzlike) WoW.
, , .
,
/
/
/ (/)
-
MMO RPG , (, Login + World , - , - ..), , (, web , ). ( ). .
, , , . , , . .