- RTS tahun 2001
Emperor: Battle for Dunemengalami banyak masalah untuk dijalankan, diinstal, dan dimainkan online di Windows modern, dan EmperorLauncher adalah patch yang menghidupkannya kembali agar bisa dimainkan - Perbaikan utamanya berfokus pada dukungan resolusi tinggi, batas 60 FPS, multiplayer online direct IP, mode kampanye kooperatif, dan bypass prosedur instalasi yang rusak
- Implementasinya terdiri dari launcher pengganti
Emperor.exe, injeksi DLL keGame.exe, patch fungsi Microsoft Detours, hook rendering Direct3D 7, intersepsi winsock, dan server WOL sederhana - Permainan online mengubah struktur P2P lama, port acak, dan NAT punching menjadi tunnel melalui satu koneksi klien→server, sehingga hanya host server yang perlu memikirkan pengaturan jaringan
- Dari penyalinan file CD asli, ekstraksi
.cab, penerapan patch resmi v1.09, bypass registrasi COM untukWOLAPI.DLL, hingga UI launcher Win32, semuanya ditangani dari instalasi sampai eksekusi
Titik Macet Emperor: Battle for Dune
Emperor: Battle for Duneadalah game strategi real-time buatan Westwood Studios tahun 2001, dan merupakan sekuel dariDune 2000- Di sistem modern, masih ada berbagai masalah yang menghalangi permainan
- Tidak bisa berjalan dalam resolusi tinggi yang sesuai dengan layar modern
- Dalam multiplayer, kecepatan simulasi game tidak dibatasi sehingga menjadi terlalu cepat
- Westwood Online(WOL) tidak lagi berfungsi, sehingga multiplayer di luar LAN menjadi sulit
- Kampanye kooperatif adalah fitur khusus online sehingga tidak bisa digunakan di LAN
- Program instalasi yang disertakan di disk rusak
- Berbagai efek visual rusak pada frame rate tinggi di PC modern
- EmperorLauncher adalah patch untuk menyelesaikan masalah-masalah ini, dan file unduhan serta kode sumbernya tersedia publik
Penggantian Emperor.exe dan Inisialisasi Game.exe
Emperor.exemilik game ini bukan file eksekusi game yang sebenarnya, melainkan wrapper tipis yang menjalankanGame.exe- Jika
Game.exedijalankan langsung, tidak terjadi apa-apa, sehingga proses inisialisasi yang dilakukanEmperor.exeharus dianalisis dan direproduksi dalam launcher pengganti - IDA digunakan untuk analisis
- IDA dapat melakukan disassembly file eksekusi dan decompile sebagian kode ke bentuk C
- Pada binary yang sudah kehilangan informasi tipe dan struktur, pemanggilan fungsi dan penggunaan Windows API harus dilacak
- Sebelum menjalankan
Game.exe,Emperor.exemembuat mutex dan handle anonymous file mapping, memproses data yang dibaca dariEmperor.dat, lalu menyalinnya ke mapping - Proses induk mengirim pesan Windows ke ID thread utama proses anak yang diperoleh melalui
CreateProcessAuntuk meneruskan nilai handle file mapping0xBEEFdigunakan sebagai ID pesan kustom- Data file mapping berisi tiga string
"UIDATA,3DDATA,MAPS", dan diteruskan ke kode pemuatan aset game
- Alih-alih mengimplementasikan ulang kode dekripsi secara langsung, sebuah tool dump ditempatkan menggantikan
Game.exeuntuk menyimpan data yang diteruskan ke disk, lalu launcher menjalankan urutan yang sama
Metode Injeksi DLL dan Patch Fungsi
- Untuk menerapkan patch, kode pengguna harus dijalankan di dalam proses
Game.exe, dan untuk itu digunakan metode CreateRemoteThread + LoadLibrary - Prosedur injeksi berjalan dalam urutan berikut
- Mengalokasikan buffer di memori proses target dengan
VirtualAllocEx - Menyalin string path DLL dengan
WriteProcessMemory - Meneruskan alamat
LoadLibrarydan buffer path DLL keCreateRemoteThreadagar DLL dimuat di proses target - Saat
DllMainDLL dijalankan, kode patch ikut berjalan
- Mengalokasikan buffer di memori proses target dengan
- Proses dimulai dalam keadaan suspended lalu DLL diinjeksi untuk memastikan kode berjalan sebelum
main - Microsoft Detours digunakan untuk memodifikasi fungsi yang ada
- Detours mengganti instruksi awal fungsi asli dengan instruksi jump agar panggilan dikirim ke fungsi pengganti
- Instruksi asli yang tertimpa disalin ke memori terpisah, lalu dibuat wrapper yang kemudian melakukan jump ke sisa fungsi asli sehingga pemanggilan fungsi asli tetap memungkinkan
- Karena halaman kode fungsi tidak bisa ditulis demi keamanan, permission harus diubah dengan
VirtualProtect, laluFlushInstructionCachedipanggil setelah modifikasi
Pemulihan Log Debug
- Di dalam binary terdapat panggilan yang tampak seperti log debug, tetapi fungsi target sebenarnya adalah fungsi kosong yang hanya berisi
ret - Tampaknya beberapa fungsi kosong digabungkan menjadi kode yang sama pada build rilis, dan salah satunya adalah debug logger
- Awalnya digunakan heuristik yang menafsirkan argumen pertama sebagai pointer string dan memeriksa apakah itu karakter ASCII yang dapat dicetak
- Akses pointer yang salah ditangkap dan diabaikan dengan exception SEH Windows
- Cara ini cukup bekerja, tetapi masih menyisakan false positive dan false negative
- Selanjutnya, dengan fitur patch IDA dan skrip Python, call site log dipindahkan ke fungsi kosong terpisah
- Sebagian ditemukan dengan heuristik, sebagian dengan pola mem-push konstanta string lalu memanggil fungsi
- Ratusan call site yang tersisa diberi komentar secara manual
- Log yang dipulihkan membantu debugging multiplayer WOL
- Dari log assert
"MyId == INVALID_ID"saat memprosesSC_MESSAGE_YOUR_DETAILS, dump Wireshark menunjukkan bahwa perintahGAMEOPTkeliru dikirim ke semua pemain
- Dari log assert
Patch Grafis Direct3D 7
- Emperor adalah game berbasis Direct3D 7, dan dukungan Direct3D 7 di Windows modern tidak sempurna
- Masalah resolusi tinggi berkaitan dengan batas ukuran tekstur maksimum 2048 pada lapisan wrapper Direct3D 7, dan diselesaikan dengan memanfaatkan kode LegacyD3DResolutionHack dari UCyborg
- Game ini tidak menangani layar selain rasio 4:3 dengan benar
- Rendering-nya sendiri berjalan, tetapi UI rusak seolah-olah diperbesar berlebihan
- Offset rendering mouse dalam game juga meleset tergantung jaraknya dari pusat layar
- Solusinya adalah letterboxing 4:3
- Jika game dijalankan dalam mode windowed, resolusi arbitrer dapat digunakan
- Gaya border jendela dihapus, lalu jendela game dijadikan parent ulang di atas jendela hitam fullscreen
- Mouse capture ditambahkan agar edge scrolling tidak rusak di multi-monitor atau mode windowed
- Batas frame rate disesuaikan ke 60 FPS dengan mem-patch
IDirect3DDevice7::EndSceneEndScenedipanggil sekali di akhir frame, sehingga cocok untuk menghitung delay dan membuat thread sleep- Pointer
EndScenetidak diekspor langsung, jadi pemanggilanDirectDrawCreateExdanIDirect3D7::CreateDevicedi-hook secara berurutan untuk mendapatkan pointer fungsi dari vtable
Multiplayer Online dan Pengganti WOL
- Targetnya adalah multiplayer direct IP yang terhubung hanya dengan port forwarding dan input IP, tanpa lobby atau infrastruktur hosting
- Mode LAN berfungsi, tetapi tidak cocok untuk permainan internet karena mencari server melalui UDP broadcast
- Menu LAN tidak memiliki fitur input IP manual
- Awalnya dicoba metode mem-patch chat LAN untuk menentukan IP, tetapi dihentikan setelah diketahui bahwa kampanye kooperatif hanya tersedia lewat WOL
- Untuk menghidupkan WOL, dua hal diperlukan
- Server master WOL palsu agar game dapat mengetahui harus terhubung ke mana dan game apa yang akan dimulai
- Proxy agar paket game bekerja di atas koneksi direct IP
- Struktur WOL lama memiliki server “mangler” bersama master server, dan mangler tampaknya berperan mengoordinasikan NAT punching
- Server mangler asli sudah hilang, dan game berhenti sambil menunggu respons tersebut
- Dalam patch ini, pemanggilan mangler dihapus
- Emperor menggunakan model networking P2P, membuka koneksi dua arah untuk setiap pasangan pemain dan memilih port acak
- Struktur yang mengharuskan semua klien menerima port terbuka tidak cocok untuk lingkungan internet modern
- Solusinya adalah mengintersepsi fungsi-fungsi winsock dan men-tunnel semua koneksi melalui satu koneksi klien→server
- Pesan yang hendak dikirim klien ke server atau klien lain diintersepsi, dibungkus dengan header, lalu dikirim melalui satu koneksi
- Thread di sisi server menerima pesan dan mendistribusikannya ke tujuan
- Game tetap percaya sedang berjalan seperti P2P, tetapi pada praktiknya hanya host server yang perlu menangani pengaturan jaringan
- Dengan konfigurasi ini, game kampanye kooperatif dapat dibuat dan diikuti
Implementasi Server WOL Sederhana
- Server master WOL memiliki struktur yang mirip server IRC
- Di
xwis.netada server yang tampaknya dioperasikan penggemar, dan pada saat penulisan, tampaknya server itu juga memiliki akses ke entri DNS asli gameservserv.westwood.com- Emperor tidak langsung berjalan dengan baik di xwis, tetapi berguna sebagai referensi untuk membuat dan bergabung ke lobby
- Implementasi server WOL publik handle_wol.cpp dari pvpgn-server juga digunakan sebagai referensi
- Alasan membuat server sendiri adalah karena tidak ada jaminan server eksternal akan terus dipertahankan
- Tujuannya bukan mengoperasikan komunitas kompetitif, melainkan menyediakan fungsi minimum yang diperlukan untuk menjalankan game multiplayer
- WOL memadukan IRC standar dengan perilaku kustom
- Lobby game adalah channel khusus
- Informasi lobby menggunakan topic IRC
- Chat lobby menggunakan
PAGE, bukanPRIVMSG - Sinkronisasi pengaturan game menggunakan pesan
GAMEINFOyang berisi konten non-ASCII
- Implementasi server WOL dasar diselesaikan melalui trial and error, dan meski tidak tangguh jika keluar dari jalur normal, ia berfungsi
Program Instalasi dan Penerapan Patch v1.09
- Program instalasi asli rusak, sehingga pengguna perlu melakukan workaround dengan menyalin isi CD ke hard disk dan menimpa setup alternatif
- EmperorLauncher menyertakan fungsi instalasi yang menyalin file dari CD asli dan mengekstrak file
.cab.cabadalah format arsip yang mirip zip, dan Windows memiliki antarmuka untuk mengekstraknya
- Penerapan patch resmi terakhir, v1.09, lebih rumit
- Cara mengekstrak
EM109EN.EXEbegitu saja dengan 7zip untuk mendapatkan binary terbaru tidak berhasil - Di dalam resource Windows ditemukan resource besar yang tampak memiliki header file eksekusi
- 4 byte pertama resource tersebut adalah ukuran file, dan setelahnya adalah file sebenarnya
- Cara mengekstrak
EM109EN.EXEmengekstrak DLL tertanam sebagai file sementara, memuatnya, lalu menjalankan fungsiRTPatch32@12di dalam DLLRTPatchadalah tool patch binary diff- Dengan merujuk ke tool myRTP, DLL tertanam dimuat dan dijalankan secara langsung
- Karena DLL membaca path dari registry, bukan path instalasi yang diterima sebagai argumen, registry key yang diharapkan dibuat secara palsu untuk menerapkan patch
Penanganan Westwood Online Shared Internet Components
- Instalasi asli memiliki Westwood Online Shared Internet Components secara terpisah dari program utama Emperor
- Jika komponen ini tidak ada, WOL tidak berfungsi, dan file utamanya adalah
WOLAPI.DLL WOLAPI.DLLadalah COM class library, dan Emperor membuat objek COM di dalam DLL denganCoCreateClass- Registrasi COM biasa mendaftarkan CLSID dan path DLL secara system-wide di bawah
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID- Cara ini membutuhkan hak administrator
- Dampaknya meluas ke seluruh sistem, melewati cakupan proses game
- Dalam patch ini, registrasi per-pengguna ditangani menggunakan registry redirect dan
OaEnablePerUserTLibRegistration- Tidak ditemukan cara untuk mendaftarkan class library hanya pada satu proses
- Percobaan menggunakan
DllGetClassObjectsecara langsung tidak berhasil
UI Launcher dan Hasil Akhir
- Tahap terakhir adalah UI launcher sederhana untuk input IP dan perubahan pengaturan dasar
- UI ditulis dengan raw Win32 controls
- Ini cukup untuk UI yang statis dan sederhana, tetapi pengalaman membuat UI Win32 langsung terasa kasar
- Pada akhirnya, EmperorLauncher menjadi tool yang mencakup eksekusi di sistem modern, resolusi tinggi, batas 60 FPS, multiplayer direct IP, kampanye kooperatif, serta instalasi dan penerapan patch
1 komentar
Komentar Hacker News
Game ini punya arti yang cukup besar bagi seluruh genre strategi real-time. Saat orang menyebut strategi real-time, biasanya yang terbayang adalah struktur petani menambang sumber daya lalu melindunginya, dan Dune RTS cukup dekat dengan bentuk awalnya
Namun struktur itu juga terbentuk karena novel aslinya. Kalau tidak, genrenya mungkin bisa berkembang ke arah yang sama sekali berbeda. Misalnya, basis itu sendiri yang menambang sumber daya, sementara lawan mengganggu bangunan sebagai bentuk tekanan, atau imbalan dari penguasaan peta bisa saja berupa hal lain selain akses ke sumber daya
Dune 1 juga ikut meletakkan fondasinya. Awalnya lebih mirip petualangan point-and-click, tetapi menjelang akhir berubah menjadi game yang memuat manajemen dan penambangan sumber daya, produksi pasukan, pertempuran, serta terraforming
Bagian akhirnya benar-benar sulit saya pahami. Tujuannya tampak seperti membuat planet itu kembali hijau, tetapi jika sudah menjadi area hijau, spice tidak lagi muncul. Sementara itu kaisar terus menuntut pengiriman spice yang lebih banyak, dan jika kuota tidak terpenuhi, game over
Bisa jadi besar kemungkinan saya tidak memahaminya dengan benar karena memainkannya saat masih kecil. Saya harus membacanya lagi, tetapi menurut standar sekarang sepertinya game itu tidak menua dengan baik, atau butuh waktu cukup lama untuk dimainkan sampai tamat
Sunting: Saya tidak tahu bahwa Dune 1 dan 2 dirilis pada tahun yang sama. Kalau begitu, pengembangan Dune 2 sudah berjalan, atau mereka membuat engine dan gamenya dalam satu tahun. Bahkan sekarang, ketika indie dan alat pengembangan sudah jauh lebih cepat, itu sulit dibayangkan
Dirilis pada Juni 1993, jadi memang beberapa bulan lebih lambat dari Dune, tetapi jika kedua game itu dikembangkan secara bersamaan, ini bisa jadi contoh beberapa “penemu” yang sampai pada ide yang sama. The Settlers kabarnya dipengaruhi oleh “god game” seperti Populous(https://en.wikipedia.org/wiki/Populous_(video_game)). Pemain memiliki kemampuan seperti dewa, misalnya mengubah medan, tetapi tidak mengendalikan unit secara langsung
Menurut saya bukan hanya Dune, sejarah secara keseluruhan sampai batas tertentu memang begitu
Tulisan yang bagus dan pekerjaan yang hebat. Sekitar 10 tahun lalu saya melakukan hal serupa, sasarannya Tiberian Sun, dan pekerjaannya adalah menambal kode jaringan
Terjun ke kode orang lain seperti ini memberi semacam rasa keterhubungan bersama. Dengan ngeri saya menemukan bahwa ada stack yang benar-benar terpisah untuk permainan via modem. Mereka bukan sekadar mengirim TCP/IP lewat modem
Seseorang pasti menghabiskan berbulan-bulan menulis kode khusus untuk framing, sinkronisasi, penanganan error, dan apa yang harus dilakukan saat koneksi terputus lalu perlu menelepon ulang. Namun ketika game itu pertama dirilis, kode itu sudah hampir tidak berguna
Saya belum pernah memakainya sendiri, tetapi banyak game lama punya opsi seperti itu
Bagus. Bagian ini menarik perhatian saya di tulisan tersebut:
“Westwood Online(WOL) tidak lagi berfungsi, jadi multiplayer tidak bisa dimainkan kecuali lewat LAN”
Saat kecil saya menyukai Command & Conquer, dan saya sedikit tahu tentang Westwood Online dari sisi klien
Kalau ingatan saya benar, setelah WOL ditutup, XWIS.net memberikan banyak dukungan. Penulis mungkin layak menghubungi komunitas kecil pengembang di sana. Meski begitu, sekarang mungkin suasananya benar-benar mulai menghilang
Sepingat saya, pekerjaan yang dilakukan orang-orang XWIS bahkan diakui oleh EA, dan cukup membantu mempertahankan dukungan WOL untuk C&C Renegade
Ada juga proyek FreeRA, yang bisa dibilang merupakan leluhur langsung dari rilis ulang C&C terbaru di Steam dan lainnya. Mereka juga mungkin bisa membantu menghidupkan kembali WOL
Karena WOL dimasukkan sebagai pustaka tersendiri, mengganti pustaka kemungkinan jauh lebih mudah daripada merekayasa balik ulang stack WOL
Sunting: Setelah terus membaca tulisannya, ternyata komponen WOL juga sudah diperbaiki. Lebih bagus lagi
Tulisan yang hebat. Penulisnya terasa seperti orang yang menarik dan pintar, sampai-sampai saya ingin pergi minum bersamanya malam-malam
Saya benar-benar suka penjelasan-penjelasan lipat yang lucu itu, dan semuanya juga berguna. Saat membaca tulisan itu, rasanya seperti memainkan semacam RPG petualangan pilihan; pengalaman yang cukup baru
Selain itu, soal bagian “CS:GO baru dipensiunkan pada 2023”, bukankah CS:GO direbranding menjadi CS2, atau saya salah paham?
Saya pernah mendengar bahwa bahkan PC untuk turnamen pun tidak bisa mempertahankan frame per second yang layak di CS2, padahal perangkat yang sama menjalankan CS:GO dengan sangat baik. Ada banyak laporan pengguna yang membagikan hasil serupa bahkan pada PC berspesifikasi tinggi
Valve ingin CS2 terlihat sebagai kelanjutan dari CS:GO, tetapi alih-alih membuat game yang lebih baik dan menggantikannya secara alami, mereka memaksakan perubahan kepada basis pemain. Karena CS:GO adalah game yang hebat, saya dan orang-orang lain akan merasa pahit untuk sementara waktu
Benar-benar lucu melihat pola bahwa game modern yang penuh iklan, pay-to-win, dan diproduksi massal kalah oleh klasik lama
Dengan bantuan satu peretas saja, audiens bisa menyingkirkan game sampah seperti itu. Dalam media yang bertahan lama, hal-hal bagus dari masa lalu tampaknya pada akhirnya mengalahkan hal-hal biasa-biasa saja dari masa kini
Tulisan yang hebat dan usaha yang hebat. Mungkin saja ini bisa diintegrasikan entah bagaimana dengan pekerjaan kami di CnCNet. Akan bagus kalau datang ke CnCNet dan ikut berdiskusi
“Dilengkapi modem 28.8 BPS”
Itu active matrix. Sejuta warna psikedelik
Tulisan yang sangat menarik dan mendalam. Saya sangat menyukai banyaknya detail dan pengetahuan yang dibagikan tentang cara merekayasa balik dan menambal game terbengkalai seperti ini
Saya pernah melihat game ini di toko barang bekas sekitar rumah, tetapi karena saya hanya pernah memainkan Dune II RTS, saya membiarkannya. Sekarang saya pasti akan mengambilnya
Terkait hal ini, ada game strategi real-time Dune modern di Steam
https://store.steampowered.com/app/1605220/Dune_Spice_Wars/
“Desain UI adalah passion saya”
Benar-benar bagus. Saya merindukan gaya tulisan seperti ini. Dalam banyak hal, ini mengingatkan saya pada tulisan-tulisan blog Steve Yegge