1 poin oleh GN⁺ 2024-07-15 | 1 komentar | Bagikan ke WhatsApp
  • RTS tahun 2001 Emperor: Battle for Dune mengalami 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 ke Game.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 untuk WOLAPI.DLL, hingga UI launcher Win32, semuanya ditangani dari instalasi sampai eksekusi

Titik Macet Emperor: Battle for Dune

  • Emperor: Battle for Dune adalah game strategi real-time buatan Westwood Studios tahun 2001, dan merupakan sekuel dari Dune 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.exe milik game ini bukan file eksekusi game yang sebenarnya, melainkan wrapper tipis yang menjalankan Game.exe
  • Jika Game.exe dijalankan langsung, tidak terjadi apa-apa, sehingga proses inisialisasi yang dilakukan Emperor.exe harus 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.exe membuat mutex dan handle anonymous file mapping, memproses data yang dibaca dari Emperor.dat, lalu menyalinnya ke mapping
  • Proses induk mengirim pesan Windows ke ID thread utama proses anak yang diperoleh melalui CreateProcessA untuk meneruskan nilai handle file mapping
    • 0xBEEF digunakan 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.exe untuk 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 LoadLibrary dan buffer path DLL ke CreateRemoteThread agar DLL dimuat di proses target
    • Saat DllMain DLL dijalankan, kode patch ikut berjalan
  • 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, lalu FlushInstructionCache dipanggil 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 memproses SC_MESSAGE_YOUR_DETAILS, dump Wireshark menunjukkan bahwa perintah GAMEOPT keliru dikirim ke semua pemain

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::EndScene
    • EndScene dipanggil sekali di akhir frame, sehingga cocok untuk menghitung delay dan membuat thread sleep
    • Pointer EndScene tidak diekspor langsung, jadi pemanggilan DirectDrawCreateEx dan IDirect3D7::CreateDevice di-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.net ada server yang tampaknya dioperasikan penggemar, dan pada saat penulisan, tampaknya server itu juga memiliki akses ke entri DNS asli game servserv.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, bukan PRIVMSG
    • Sinkronisasi pengaturan game menggunakan pesan GAMEINFO yang 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
    • .cab adalah format arsip yang mirip zip, dan Windows memiliki antarmuka untuk mengekstraknya
  • Penerapan patch resmi terakhir, v1.09, lebih rumit
    • Cara mengekstrak EM109EN.EXE begitu 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
  • EM109EN.EXE mengekstrak DLL tertanam sebagai file sementara, memuatnya, lalu menjalankan fungsi RTPatch32@12 di dalam DLL
    • RTPatch adalah 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.DLL adalah COM class library, dan Emperor membuat objek COM di dalam DLL dengan CoCreateClass
  • 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 DllGetClassObject secara 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

 
GN⁺ 2024-07-15
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

    • Tepatnya, tulisan ini bukan tentang Dune 2, melainkan Emperor: Battle for Dune
    • Seperti yang sudah ditunjukkan orang lain, ini mungkin sekuel dari Dune 2 yang sedang Anda pikirkan
      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
    • Saya selalu menganggap The Settlers(https://en.wikipedia.org/wiki/The_Settlers_(1993_video_game)) sebagai game strategi real-time pertama
      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
    • Dawn of War adalah contoh bagus strategi real-time yang keluar dari paradigma penambangan mineral yang klasik
    • Mungkin pada akhirnya memang akan mengarah ke sana juga. Sejarah cukup banyak bersandar pada pola “petani sebagai basis sumber daya, penguasa sebagai ahli strategi”
      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

    • Sepertinya itu karena alasan lain. Tujuannya mungkin bukan tersambung ke internet dial-up, melainkan menelepon langsung ke modem lain
      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?

    • CS2 dianggap oleh sebagian orang sebagai downgrade dari CS:GO. Saya juga melihatnya begitu
      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
    • CS2 diunggah dengan application ID yang sama dengan CS:GO, tetapi merupakan game yang sepenuhnya dibuat ulang dengan engine baru. Itu bukan rebranding
    • Berbeda dari CS:GO lama berbasis Source 1, CS2 menggunakan engine Source 2 dengan renderer DX11 atau Vulkan
  • 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

    • Arsitektur RISC akan mengubah segalanya
  • 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

    • Penasaran apakah bisa berjalan di Wine
  • Terkait hal ini, ada game strategi real-time Dune modern di Steam
    https://store.steampowered.com/app/1605220/Dune_Spice_Wars/

    • Agak sulit menyebut ini strategi real-time. Ini lebih dekat ke game 4X, dengan tempo lambat dan pertempuran yang tidak terlalu penting
    • Terlepas dari orang-orang yang menyebut Spice Wars sebagai 4X, yang sebenarnya paling mendekati strategi real-time Dune modern adalah Homeworld: Deserts of Kharak
  • “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