Sangat keren memprogram mekanisme atau modul perangkat lunak untuk membuatnya sesuai dengan keinginan Anda. Dengan pemikiran serupa di akhir tahun 2018, saya berpikir bahwa saya ingin membuat server WoW sendiri , yang akan sepenuhnya saya kuasai. Setelah mempelajari kode sumber C ++ untuk MANGOS , saya sampai pada kesimpulan bahwa saya tidak dapat mengambil dan menerapkan semua ide saya seperti ini, tanpa memahami cara kerja server MMO RPG dari awal hingga akhir. Dan untuk tujuan ini, saya memutuskan untuk menerapkan mesin saya sendiri . Dari awal.
Pertama-tama, pada awalnya saya hanya memiliki kode sumber dari dokumentasi. Saya mencari di forum sedikit demi sedikit untuk mendapatkan jawaban atas banyak pertanyaan saya (dalam hal ini - rasa hormat yang besar kepada komunitas MANGOS , - tim yang sangat responsif). Secara total, butuh beberapa bulan sebelumnya, dengan trial and error, saya menerapkan prototipe kerja pertama saya dari server Login - dan bisa sampai ke layar pemilihan karakter.
Singkatnya, Server Login (seperti otentikasi di klien WoW) dibangun di atas penggunaan algoritma SRP . Deskripsi algoritma berada di luar cakupan artikel, tetapi singkatnya, ini memungkinkan Anda untuk mengidentifikasi pengguna tanpa mengirim kata sandi ke server, sehingga kata sandi (bahkan dalam bentuk cache) tidak dapat disimpan di server. Bahkan diinginkan .
Algoritma enkripsi server Dunia kemungkinan besar berbeda dari klien ke klien (saya membuat kesimpulan ini ketika saya mempelajari kode sumber server WoW 3.3.5a secara singkat ). Saya sedang mengembangkan server untuk WoW versi 2.4.3. Sesuatu seperti sandi Caesar digunakan di sana . Meskipun lebih sering (di sumbernya) Anda dapat menemukan nama HeaderCrypt atau Wowcrypt.
Dalam versi 2.4.3, 6 byte pertama dienkripsi: ukuran (2) dan opcode (4) dari setiap paket di server Dunia ( kecuali untuk paket pertama ). Karenanya, jika Anda mencegat sebuah paket (sniff), Anda tidak akan dapat menentukan opcode mana yang akan dikirimi paket tersebut. Dan jika paketnya besar, maka dapat dipecah menjadi beberapa, dan untuk mengeluarkannya dari buffer dengan benar, dibutuhkan 2 byte ( ukuran ) pertama ini .
Proses masuk ke server dapat dijelaskan secara singkat sebagai berikut:
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 , ). ( ). .
, , , . , , . .