मरे हुए Dune RTS गेम का पुनर्जीवन: EmperorLauncher
(wheybags.com)- 2001 का RTS
Emperor: Battle for Duneआधुनिक Windows पर चलाने, install करने और online खेलने—तीनों में अस्थिर था, और EmperorLauncher एक patch है जो इसे फिर से खेलने लायक स्थिति में लाता है - मुख्य सुधार high-resolution support, 60 FPS limit, direct IP online multiplayer, co-op campaign mode, और टूटे हुए installation process को bypass करने पर केंद्रित हैं
- implementation में
Emperor.exereplacement launcher,Game.exeके लिए DLL injection, Microsoft Detours function patching, Direct3D 7 rendering hooks, winsock interception, और एक सरल WOL server शामिल हैं - online play में मौजूदा P2P, random port और NAT punching structure को single client→server connection में tunnel किया गया, ताकि केवल server host को network settings की चिंता करनी पड़े
- यह original CD files copy करना,
.cabextraction, official v1.09 patch apply करना,WOLAPI.DLLकी COM registration bypass, और Win32 launcher UI—सबको मिलाकर install से run तक संभालता है
Emperor: Battle for Dune कहाँ अटका हुआ था
Emperor: Battle for Dune2001 में Westwood Studios द्वारा बनाया गया real-time strategy game है, औरDune 2000का sequel है- आधुनिक systems पर gameplay में बाधा डालने वाली कई समस्याएँ बची हुई हैं
- आधुनिक screens के अनुरूप high-resolution में run नहीं होता
- multiplayer में game simulation speed सीमित नहीं होती, इसलिए यह बहुत तेज़ हो जाता है
- Westwood Online(WOL) अब काम नहीं करता, जिससे LAN के बाहर multiplayer मुश्किल हो जाता है
- co-op campaign online-only feature है, इसलिए LAN पर इस्तेमाल नहीं किया जा सकता
- disc में शामिल installer टूटा हुआ है
- आधुनिक PC के high framerate पर कई visual effects टूट जाते हैं
- EmperorLauncher इन समस्याओं को हल करने वाला patch है, और download file व source code उपलब्ध हैं
Emperor.exe को replace करना और Game.exe initialization
- game का
Emperor.exeअसली game executable नहीं, बल्किGame.exelaunch करने वाला एक पतला wrapper है Game.exeको सीधे चलाने पर कुछ नहीं होता, इसलिएEmperor.exeजो initialization process करता था उसका विश्लेषण कर replacement launcher में उसे reproduce करना पड़ा- विश्लेषण के लिए IDA का उपयोग किया गया
- IDA executable को disassemble कर सकता है और कुछ code को C जैसी form में decompile कर सकता है
- type information और structure information खो चुके binary में function calls और Windows API usage को trace करना पड़ता है
Emperor.exe,Game.exelaunch करने से पहले mutex और anonymous file mapping handle बनाता है,Emperor.datसे पढ़े data को process करता है और फिर mapping में copy करता है- parent process,
CreateProcessAसे मिले child process के main thread ID को Windows message भेजकर file mapping handle value pass करता है- custom message ID के तौर पर
0xBEEFइस्तेमाल हुआ - file mapping data तीन strings
"UIDATA,3DDATA,MAPS"था, और game के asset loading code को pass किया जाता था
- custom message ID के तौर पर
- decryption code को सीधे reimplement करने के बजाय,
Game.exeकी जगह dump tool रखकर passed data को disk पर save किया गया, फिर launcher में वही sequence perform किया गया
DLL injection और function patching तरीका
- patch apply करने के लिए
Game.exeprocess के अंदर user code run करना ज़रूरी था, और इसके लिए CreateRemoteThread + LoadLibrary तरीका इस्तेमाल किया गया - injection process इस क्रम में चलता है
- target process memory में
VirtualAllocExसे buffer allocate करना WriteProcessMemoryसे DLL path string copy करनाLoadLibraryaddress और DLL path buffer कोCreateRemoteThreadमें देकर target process में DLL load करना- DLL का
DllMainexecute होते ही patch code चलना शुरू करता है
- target process memory में
- process को suspended state में start कर DLL inject किया गया, ताकि
mainrun होने से पहले code execution सुनिश्चित हो - existing functions को modify करने के लिए Microsoft Detours का उपयोग हुआ
- Detours original function के शुरुआती instructions को jump instruction से बदल देता है, ताकि call replacement function में जाए
- overwritten original instructions को अलग memory में copy किया जाता है, और फिर original function के बाकी हिस्से में jump करने वाला wrapper बनाया जाता है, जिससे original function call भी संभव रहता है
- function code pages security के कारण writable नहीं होते, इसलिए
VirtualProtectसे permissions बदलनी पड़ती हैं और modification के बादFlushInstructionCachecall करना पड़ता है
debug log restore करना
- binary के अंदर debug log जैसे दिखने वाले calls थे, लेकिन actual target function सिर्फ
retवाली empty function थी - लगता है release build में कई empty functions को same code में merge कर दिया गया था, और उनमें से एक debug logger था
- शुरुआत में first argument को string pointer मानकर printable ASCII characters हैं या नहीं, यह check करने वाला heuristic इस्तेमाल किया गया
- गलत pointer access को Windows की SEH exception से पकड़कर ignore किया गया
- यह तरीका कुछ हद तक चला, लेकिन false positives और false negatives बचे रहे
- बाद में IDA के patch feature और Python script से log call sites को अलग empty function में shift किया गया
- कुछ को heuristic से खोजा गया, और कुछ को string constant push करने के बाद call करने वाले pattern से खोजा गया
- बचे हुए सैकड़ों call sites पर manually comments लगाए गए
- restored logs WOL multiplayer debugging में मददगार रहे
SC_MESSAGE_YOUR_DETAILSprocess करते समय"MyId == INVALID_ID"assert log देखकर Wireshark dump में पुष्टि हुई किGAMEOPTcommand सभी players को गलत तरीके से भेजा जा रहा था
Direct3D 7 graphics patch
- Emperor Direct3D 7 based game है, और आधुनिक Windows में Direct3D 7 support पूरी तरह perfect नहीं है
- high-resolution issue Direct3D 7 wrapper layer की maximum texture size 2048 limit से जुड़ा था, और UCyborg के LegacyD3DResolutionHack code की मदद से हल किया गया
- game 4:3 ratio के अलावा दूसरी screens को ठीक से handle नहीं कर पाता
- rendering खुद तो होती है, लेकिन UI बहुत ज़्यादा zoomed जैसा टूट जाता है
- in-game mouse rendering offset भी screen center से distance के अनुसार mismatch हो जाता है
- समाधान 4:3 letterboxing है
- game को windowed mode में run करने पर arbitrary resolution इस्तेमाल किया जा सकता है
- window border style हटाया गया, और fullscreen black window के ऊपर game window को फिर से parent किया गया
- mouse capture जोड़ा गया ताकि multi-monitor या windowed mode में edge scrolling न टूटे
- framerate limit के लिए
IDirect3DDevice7::EndScenepatch कर 60 FPS पर set किया गयाEndSceneframe के अंत में एक बार call होता है, इसलिए delay calculate करके thread को sleep कराने के लिए उपयुक्त हैEndScenepointer directly export नहीं होता, इसलिएDirectDrawCreateExऔरIDirect3D7::CreateDevicecalls को क्रम से hook कर vtable से function pointer लिया गया
online multiplayer और WOL replacement
- लक्ष्य lobby या hosting infrastructure के बिना port forwarding और IP input से connect करने वाला direct IP multiplayer था
- LAN mode काम करता है, लेकिन UDP broadcast से server खोजता है, इसलिए internet play के लिए सही नहीं है
- LAN menu में manual IP input feature नहीं है
- शुरुआत में LAN chat को patch कर IP specify करने का तरीका try किया गया, लेकिन co-op campaign WOL-only है यह पता चलने के बाद इसे रोक दिया गया
- WOL को revive करने के लिए दो चीज़ें चाहिए थीं
- game को कहाँ connect करना है और कौन सा game start करना है यह बताने वाला fake WOL master server
- direct IP connection पर game packets को चलाने वाला proxy
- मौजूदा WOL structure में master server के साथ “mangler” server था, और mangler संभवतः NAT punching coordination role निभाता था
- original mangler server गायब हो गया था, और game उसका response इंतज़ार करते हुए रुक जाता था
- patch में mangler calls हटाए गए
- Emperor P2P networking model इस्तेमाल करता है, और हर player pair के लिए bidirectional connection खोलता है व random ports चुनता है
- यह structure सभी clients को open ports receive करने की जरूरत डालता है, इसलिए आधुनिक internet environment के लिए उपयुक्त नहीं है
- समाधान winsock functions को intercept कर सभी connections को single client→server connection में tunnel करना है
- client जिस message को server या दूसरे client को भेजना चाहता है उसे intercept करके header में wrap कर single connection पर भेजता है
- server-side thread message receive कर destination तक distribute करता है
- game अब भी मानता है कि वह P2P की तरह चल रहा है, लेकिन असल में सिर्फ server host को network settings handle करनी पड़ती हैं
- इस configuration से co-op campaign game start और join किया जा सका
सरल WOL server implementation
- WOL master server की structure IRC server जैसी थी
xwis.netपर fan-run जैसा server था, और लिखने के समय game के original DNS entryservserv.westwood.comपर भी access अधिकार होने जैसा दिखता था- Emperor xwis पर वैसे ही ठीक से काम नहीं करता था, लेकिन lobby creation और joining के लिए reference मिला
- public WOL server implementation pvpgn-server का handle_wol.cpp भी reference के रूप में इस्तेमाल हुआ
- खुद का server बनाने का कारण था कि external server के लगातार maintained रहने की guarantee नहीं थी
- लक्ष्य competitive community चलाना नहीं, बल्कि multiplayer game चलाने के लिए जरूरी minimum features देना था
- WOL में standard IRC और custom behavior मिला हुआ है
- game lobby एक special channel है
- lobby information IRC topic का उपयोग करती है
- lobby chat
PRIVMSGके बजायPAGEका इस्तेमाल करती है - game settings synchronization non-ASCII content वाले
GAMEINFOmessages का इस्तेमाल करता है
- basic WOL server implementation trial and error से पूरा हुआ, और normal path से हटने पर मजबूत नहीं है, लेकिन काम करता है
installer और v1.09 patch apply करना
- original installer टूटा हुआ है, इसलिए user को CD contents hard disk पर copy कर replacement setup overwrite करने वाला workaround चाहिए था
- EmperorLauncher में original CD से files copy करने और
.cabfiles extract करने की installation functionality शामिल है.cab, zip जैसा archive format है, और Windows में extraction interface मौजूद है
- आखिरी official patch v1.09 apply करना ज्यादा कठिन था
EM109EN.EXEको 7zip से सिर्फ extract कर latest binary पाने का तरीका काम नहीं करता- Windows resource के अंदर executable header जैसा दिखने वाला बड़ा resource मिला
- उस resource के पहले 4 bytes file size हैं, और उसके बाद actual file है
EM109EN.EXEembedded DLL को temporary file के रूप में extract और load करता है, फिर DLL के अंदर functionRTPatch32@12execute करता हैRTPatchbinary diff patch tool था- myRTP tool को reference बनाकर embedded DLL को directly load और execute किया गया
- DLL argument में मिले install path की जगह registry से path पढ़ता था, इसलिए expected registry key fake बनाकर patch apply किया गया
Westwood Online Shared Internet Components को handle करना
- original installation में Emperor main program से अलग Westwood Online Shared Internet Components है
- इस component के बिना WOL काम नहीं करता, और key file
WOLAPI.DLLहै WOLAPI.DLLCOM class library है, और EmperorCoCreateClassसे DLL के अंदर COM objects बनाता है- सामान्य COM registration
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSIDके तहत CLSID और DLL path को system-wide register करती है- इस तरीके के लिए administrator privileges चाहिए
- यह game process scope से आगे जाकर पूरे system को प्रभावित करता है
- patch में registry redirect और
OaEnablePerUserTLibRegistrationका उपयोग कर per-user registration तरीके से handle किया गया- सिर्फ एक process में class library register करने का तरीका नहीं मिला
DllGetClassObjectको directly इस्तेमाल करने की कोशिश काम नहीं आई
launcher UI और अंतिम परिणाम
- आखिरी step IP input और basic settings बदलने के लिए simple launcher UI था
- UI raw Win32 controls से लिखा गया
- static और simple UI के लिए यह पर्याप्त था, लेकिन directly Win32 UI बनाने का अनुभव rough था
- EmperorLauncher आखिरकार आधुनिक systems पर run, high resolution, 60 FPS limit, direct IP multiplayer, co-op campaign, installation और patch application तक शामिल करने वाला tool बन गया
1 टिप्पणियां
Hacker News की टिप्पणियाँ
इस गेम का real-time strategy genre पूरे तौर पर काफ़ी बड़ा महत्व है। आम तौर पर real-time strategy कहते ही किसान संसाधन खोदते हैं और उनकी रक्षा की जाती है—ऐसी संरचना याद आती है, और Dune RTS उस मूल रूप के काफ़ी करीब था
हालांकि यह ढांचा मूल उपन्यास की वजह से भी ऐसा बना। वरना यह genre बिल्कुल अलग दिशा में जा सकता था। उदाहरण के लिए, base के अपने संसाधन mine किए जाते, और विरोधी इमारतों को परेशान करके pressure बनाता; या map control का reward संसाधनों तक पहुंच के बजाय किसी और रूप में हो सकता था
Dune 1 ने भी नींव रखी थी। शुरुआत में यह point-and-click adventure जैसा है, लेकिन आगे चलकर यह resource management और mining, troop production, combat, और terraforming वाला गेम बन जाता है
आख़िरी हिस्सा मुझे बिल्कुल समझ नहीं आया था। लक्ष्य शायद ग्रह को फिर से हरा-भरा बनाना था, लेकिन जैसे ही हरियाली आती, spice निकलना बंद हो जाता। फिर भी Emperor लगातार ज़्यादा spice की delivery मांगता रहता, और quota पूरा न करने पर game over हो जाता था
काफी संभावना है कि बचपन में खेलने की वजह से मैं ठीक से समझ नहीं पाया। दोबारा पढ़ना पड़ेगा, लेकिन आज के हिसाब से शायद यह अच्छी तरह पुराना नहीं हुआ है, या फिर अंत तक खेलने में काफ़ी समय लगेगा
संपादन: मुझे नहीं पता था कि Dune 1 और 2 एक ही साल आए थे। तो या तो Dune 2 की development पहले से चल रही थी, या उन्होंने engine और game एक साल के भीतर बना दिया। आज indie और tools तेज़ हो गए हैं, फिर भी इसकी कल्पना करना मुश्किल है
यह जून 1993 में रिलीज़ हुआ, यानी Dune से कुछ महीने बाद, लेकिन अगर दोनों games साथ-साथ development में थे, तो यह उन मामलों में से हो सकता था जहां कई “inventors” एक ही idea तक पहुंचे। कहा जाता है कि The Settlers पर Populous(https://en.wikipedia.org/wiki/Populous_(video_game)) जैसे “god game” का असर था। इसमें player के पास terrain बदलने जैसी god-like abilities होती हैं, लेकिन units को सीधे control नहीं करता
यह सिर्फ़ Dune में नहीं, बल्कि पूरे इतिहास में कुछ हद तक ऐसा ही दिखता है
अच्छा लेख और शानदार काम है। करीब 10 साल पहले मैंने कुछ ऐसा ही किया था, target Tiberian Sun था और network code patch करना था
किसी और के code में इस तरह कूदने में एक तरह का shared connection महसूस होता है। भयावह बात यह मिली कि modem play के लिए stack पूरी तरह अलग था। वह बस modem के ऊपर TCP/IP भेजना नहीं था
किसी ने महीनों तक framing, synchronization, error handling, connection टूटने पर फिर से call कैसे करना है—ऐसे custom code लिखे होंगे। लेकिन game पहली बार release होने तक ही वह code लगभग बेकार हो चुका था
मैंने खुद इस्तेमाल नहीं किया, लेकिन पुराने games में ऐसे options बहुत होते थे
बढ़िया। लेख में यह हिस्सा ध्यान खींचता है:
“Westwood Online(WOL) अब काम नहीं करता, इसलिए LAN के अलावा multiplayer नहीं हो सकता”
बचपन में मुझे Command & Conquer पसंद था, और client side से Westwood Online के बारे में थोड़ा पता है
अगर मेरी याद सही है, तो WOL बंद होने के बाद XWIS.net ने बहुत support दिया था। लेखक को उस तरफ़ की छोटी developer community से संपर्क करना चाहिए। हालांकि अब शायद वह सचमुच गायब होती जा रही हो
XWIS वालों के काम को EA ने भी मान्यता दी थी, और C&C Renegade में WOL support जारी रखने में वह काफ़ी मददगार रहा था—ऐसा मुझे याद है
FreeRA project भी है, जो Steam आदि पर आए हाल के C&C re-releases का सीधे तौर पर पूर्वज जैसा है। शायद यह भी WOL को फिर चलाने में मदद कर सके
WOL अपने-आप को एक library के रूप में push करता था, इसलिए WOL stack को दोबारा reverse engineer करने की तुलना में library replacement शायद कहीं आसान होगा
संपादन: लेख आगे पढ़ने पर दिखता है कि WOL components भी ठीक किए गए हैं। और बेहतर
शानदार लेख है। लेखक इतना मज़ेदार और समझदार लगता है कि उसके साथ रात में बाहर जाकर एक drink लेने का मन करे
प्यारे collapsible explanations सच में बहुत अच्छे लगे और उपयोगी भी थे। लेख पढ़ते समय ऐसा लगा जैसे कोई choose-your-own-adventure RPG खेल रहा हूं, और यह काफी नया अनुभव था
साथ ही “CS:GO 2023 में ही retire हुआ” वाले हिस्से पर—मुझे लगा था CS:GO को CS2 के रूप में rebrand किया गया है; क्या मैं गलत समझ रहा हूं?
मैंने सुना कि tournament PCs पर भी CS2 में ठीक FPS maintain नहीं हो पा रहा था, जबकि वही hardware CS:GO को शानदार तरीके से चलाता था। high-end PCs पर भी similar results बताने वाली users की reports बहुत हैं
Valve चाहता था कि CS2, CS:GO की continuation लगे, लेकिन उन्होंने बेहतर game बनाकर naturally replace नहीं किया; उन्होंने player base पर बदलाव थोप दिया। CS:GO एक शानदार game था, इसलिए मैं और कई लोग कुछ समय तक कड़वाहट महसूस करेंगे
modern ads से भरे, pay-to-win mass-produced games का पुराने classics से पीछे रह जाना वाकई मज़ेदार setup है
अगर एक hacker भी मदद कर दे, तो audience ऐसे कचरा games को बाहर कर सकती है। durable media में लगता है कि अतीत की अच्छी चीजें अंततः वर्तमान की औसत चीजों को हरा देती हैं
शानदार लेख और शानदार effort है। शायद इसे हमारे CnCNet वाले काम के साथ किसी तरह integrate किया जा सके। CnCNet पर आकर साथ बात करें तो अच्छा होगा
“28.8 BPS modem लगा है” वाह
active matrix है। दस लाख psychedelic colors
बहुत रोचक और गहराई वाला लेख है। ऐसे abandoned game को reverse engineer और patch करने के तरीके पर साझा की गई details और knowledge की मात्रा सचमुच अच्छी लगी
मैंने इस game को मोहल्ले की thrift store में देखा था, लेकिन केवल Dune II RTS खेला था, इसलिए छोड़ आया। अब ज़रूर उठा लूंगा
इसी से जुड़ा, Steam पर एक modern Dune real-time strategy game है
https://store.steampowered.com/app/1605220/Dune_Spice_Wars/
“UI design मेरा passion है” वाह
बहुत अच्छा। ऐसी writing याद आती है। कई मायनों में Steve Yegge के blog posts की याद दिलाती है