پروژه جذاب مهندسی معکوس: اجرای قابلیت چندنفره (Co-op) روی بازی کلاسیک Wing Commander پس از یک دهه تلاش — Show HN: After a decade of reversing, I got co-op working in DOS Wing Commander
خلاصه
یک برنامهنویس با بیش از یک دهه مهندسی معکوس بازی کلاسیک Wing Commander در داسباکس، موفق شد قابلیت بازی دونفره و هماهنگسازی شبکه را به آن اضافه کند. این پروژه با ترکیب تکنیکهای دستکاری حافظه، هوک کردن توابع و فناوریهای مدرنی مانند WebRTC و Emscripten، امکان اجرای بازی در مرورگر را فراهم کرده است.
بازیهای قدیمی دوران DOS خاطرات زیادی برای توسعهدهندگان نسلهای قبل رقم زدهاند. یکی از این عنوانهای شاهکار، بازی فضایی Wing Commander است که بسیاری از گیمرها آرزوی تجربه آن به صورت دونفره (Co-op) را داشتند. یک طراح نرمافزار به همراه برادرش پس از حدود یک دهه تلاش مستمر و مهندسی معکوس، توانستند این رویای قدیمی را به واقعیت تبدیل کنند و امکان پرواز همزمان دو بازیکن در ماموریتهای بازی را فراهم سازند.
زمینه و چالشهای اولیه حافظه
همهچیز از سال ۲۰۱۵ و بازی کردن این عنوان در DOSBox شروع شد. نویسنده متوجه شد که کل وضعیت بازی احتمالاً در یک سگمنت داده کوچک جا میشود. هدف اولیه، پیدا کردن آدرس حافظه مختصات سهبعدی (X, Y, Z) فضاپیمای بازیکن و بالگرد (Wingman) بود تا بستههای شبکه بتوانند کنترل فضاپیمای دوم را به دست بگیرند.
برای پیدا کردن این آدرسها در حجم عظیمی از بایتها، نویسنده از روشهای هوشمندانهای استفاده کرد:
- خالی کردن صحنه از سایر موجودیتها و پرواز در فضایی خالی برای جلوگیری از تغییرات اضافی در حافظه.
- گرفتن اسنپشات از حافظه در حالت سکون و مقایسه آن با لحظه حرکت با کمک ابزارهای بررسی تفاوت حافظه (مثل
vbindiff). - پیدا کردن خوشه تغییرات و استفاده از دیباگر DOSBox برای نوشتن مستقیم مقادیر و جابجایی فضاپیما در محیط بازی.
جالب اینجاست که در بررسی ساختار دادهها، مشخص شد توسعهدهندگان اصلی بازی اسلات شماره 0x3D را به دوربین اختصاص داده بودند که احتمالاً یک شوخی طنزآمیز درباره گرافیک سهبعدی نوپای آن زمان بوده است.
تزریق کد و هوک کردن توابع
نوشتن ساده مقادیر در حافظه جهانی برای شبیهسازی شلیک لیزر یا موشک کافی نبود؛ بنابراین تیم توسعهدهنده مجبور شد توابع اصلی خود بازی را فراخوانی کند. چالش بزرگ اینجا بود که کامپایلر Borland از سیستم Overlay برای بارگذاری پویای فایلهای C++ استفاده میکرد و آدرسها ثابت نبودند.
حل این مسئله نیازمند ساخت یک Trampoline یا استاب پرش بود:
- استفاده از رشتههای متنی موجود در حافظه (مانند پیامهای خطا) به عنوان مکان موقت برای اجرای کدهای تزریقشده.
- مدیریت دقیق پشته (Stack) و رجیسترها تا بازی متوجه دخالت بیرونی نشود.
- اصلاح ساختار قاب پشته (BP/SP) تا مکانیزم بررسی Overlay در کامپایلر Borland دچار خطا نشده و بازی کرش نکند.
معماری شبکه و انتقال به وب
در سال ۲۰۱۷، یک پروتکل شبکه مبتنی بر TCP و پیامهای Protocol Buffers پیادهسازی شد تا موقعیت فضاپیماها، رویدادهای شلیک و آسیبها در هر فریم همگامسازی شوند. همچنین برای مدیریت شناسهها بین سرور و کلاینت، نگاشتهای دقیقی نوشته شد تا اشیاء موقت مثل سیارکها به درستی در بازی ظاهر شوند.
اگرچه این پروژه تا سالها به صورت محلی و خانوادگی اجرا میشد، اما دردسرهای راهاندازی شبیهساز و تنظیم پورتها مانع از اشتراکگذاری آن با دیگران بود. در سال ۲۰۲۶، با پیشرفت فناوریهای وب، این پروژه جان تازهای گرفت:
- ایجاد ابزار lobbylink: یک سیستم لابی سبک به زبان Go برای مدیریت اتصالهای همتابههمتا (P2P) از طریق WebRTC.
- استفاده از سرور STUN/TURN (مانند coturn) برای عبور از فایروالها.
- کامپایل کردن بازی برای وب با استفاده از Emscripten و ادغام آن با فایلهای نصبی GOG.
چرا این پروژه برای مهندسان نرمافزار جذاب است؟
این پروژه یک کلاس درس عملی در زمینههای زیر است:
- تسلط بر مهندسی معکوس باینریهای قدیمی و دیباگ حافظه در معماری x86.
- درک عمیق مدیریت حافظه و ساختارهای پشته در کامپایلرهای قدیمی مانند Borland C++.
- پل زدن میان فناوریهای باستانی DOS و وب مدرن (WebAssembly و WebRTC) برای زنده کردن نرمافزارهای منسوخشده.
نسخه تحت وب این بازی جذاب هماکنون برای تست در دسترس علاقهمندان قرار دارد و بازیکنان میتوانند با داشتن نسخه قانونی بازی، فایلهای آن را در مرورگر رها کرده و به تجربه چندنفره بپردازند.
این مطلب بهصورت کاملاً خودکار و با هوش مصنوعی از مقالهٔ اصلی و بحث هکرنیوز تهیه شده و ممکن است خطا داشته باشد. حقوق مطلب اصلی متعلق به نویسندهٔ آن است. قوانین و گزارش مشکل