1998 Ultima Online demo sunucusunun tersine mühendisliği
(draxinar.github.io)- OUO, 1998 tarihli
Ultima Onlinedemo sunucusunu tamamen tersine mühendislikle yeniden oluşturan bir proje; MSVC x86 ikilisindeki yaklaşık 5.000 işlev disassemble edilerek taşınabilir C99 koduna aktarıldı UoDemo.exe,Ultima Online: The Second Ageilk sürümüne dahil edilen bağımsız bir demoydu ve istemciyle birlikte Windows'a taşınmış tam sunucu kodu ve verilerini içeriyordu- Her işlev, özgün ikiliyle komut düzeyinde karşılaştırıldı; sınıf hiyerarşisi ve vtable düzeni eşleştirildikten sonra özgünle aynı kontrol akışı, struct düzeni ve dallanmaları koruyacak şekilde elle dönüştürüldü
- Yeniden oluşturulan sürüm, 1998 ortasındaki gerçek canlı
Ultima Onlinesunucu koduna çok yakın; ancak çökme, taşma ve başlatılmamış değişkenler gibi kararlılık sorunları ile skill artışı ve spawn yoğunluğu gibi oynanış sorunları etiketlenerek düzeltilmiş durumda - Orijinal demo yalnızca istemci 1.25.33'ü destekliyordu; yeniden oluşturulan sürüm ise istemcileri 1.25.30'dan 5.0.9.1'e kadar, şifreleme olsun ya da olmasın destekliyor ve ayrıca 1997~2003 dönemine ait sunucu veri dosyaları isteniyor
Demo dosyasının kaynağı ve kapsamı
- Her işlev özgün ikiliyle komut düzeyinde karşılaştırıldı ve 10 yıla yayılan kesintili çalışmanın ardından süreç yakın dönemdeki LLM gelişmeleri sayesinde tamamlanabildi
UoDemo.exetarihi 1998-09-02, sunucu verileri ise 2 Haziran 1998 tarihli canlı sunucudan alınmıştı- Demo için bazı özellikler stub haline getirildi ve oynanabilir harita Ocllo adasına indirildi; bunun dışındaki kısım, 1998 ortasında gerçek canlı
Ultima Onlineüzerinde çalışan üretim sunucu koduydu Ultima Online, Origin Systems Inc. tarafından geliştirilen 1997 çıkışlı bir MMORPG idi ve ticari olarak başarılı ilk MMORPG'lerden biriydi- İstemci Windows'ta çalışıyordu, sunucular yani “shard”lar birden fazla Solaris makinede çalışıyordu ve harita bölgelere ayrılmıştı
- Demo, Ocllo adasında ejderha öldürmeye yönelik basit bir görev sunuyor ve diyalog, ticaret, savaş gibi temel oyun mekaniklerini deneyimlemeye imkân veriyordu
- Çeşitli
UOsunucu emülatörleri bu demonun bazı parçalarını yeniden kullandı, ancak bugüne kadar tamamen tersine mühendisliği yapılmamıştı UoDemo.exe, Microsoft Visual C++ 5.0 yani Visual Studio 97 ile derlenmişti ve C++98 öncesi bir C++ lehçesini hedefliyordu
Tersine mühendislik yöntemi
-
Disassembly ve sembol tahmini
- Disassembly için radare2 kullanıldı
- Sembol adları, C++ sembolleri içeren deneysel Linux portu
UOistemcisi 1.25.37'den çıkarıldı
-
Elle C99 dönüşümü
- Her işlev, özgün ikiliyle aynı kontrol akışını, struct düzenini ve dallanmaları koruyacak şekilde elde C99'a çevrildi
- Farklı olan kısımlar, demonun gerçek hatalarının düzeltilmesi veya platform uyarlamalarıydı ve kaynakta işaretlendi
-
Doğrulama yöntemi
- C derlemesi yeniden
r2ile disassemble edilip özgünle karşılaştırıldı - Yalnızca iki sonuç eşleştiğinde bir işlev tamamlanmış sayıldı
- Yardımcı işlevler sadece tekrar eden inline kalıplar için kullanıldı ve ancak yardımcı işlev inline sürümle aynı koda yeniden açıldığında kabul edildi
- C derlemesi yeniden
-
Sınıf hiyerarşisinin yeniden kurulması
- İlk aşamada en kritik iş, sınıf hiyerarşisini tam olarak eşleştirmekti
- Temel hiyerarşi
CEntity (0x10) -> CResourceEntity (0x1C) -> CItem (0x50) -> CContainer (0x5C) -> CMobile (0x37C) -> CPlayer (0x458)idi - Sanal dispatch, vtable slotları üzerinden yapılıyordu; örneğin
vtable[0x18]IsPlayer,[0xD0]IsMobile,[0xE4]iseIsNPCidi - Bu düzen netleştikten sonra ikilinin büyük bölümü nispeten doğrudan çevrilebildi
Yeniden oluşturma sonucu ve özgünle farkları
- Ortaya çıkan sonuç, 1998 tarihli
Ultima Onlinesunucusunun neredeyse kusursuz bir kopyasına yakın; ancak bazı farklar var - Özgün koda kıyasla çökme, taşma ve başlatılmamış değişkenler gibi kararlılık sorunları düzeltildi
- Skill artışı, fame/notoriety yönü ve spawn yoğunluğu gibi oynanış sorunları da giderildi
- Her düzeltme kaynakta etiketlendiği için
UoDemo.exeile karşılaştırma yapanlar neyin neden değiştiğini tam olarak görebiliyor - Spawn sistemi ve decay sistemi gibi bazı özellikler bozuktu; demo sürümü için kısmen devre dışı bırakılmış veya stub haline getirilmiş olmaları muhtemel
- Bu özelliklerin kodu duruyordu ancak canlı çağrı noktaları erişilemezdi; ayrı ayrı decompile edilip dispatch yeniden bağlanınca çalıştırılabildiler
- Oyun haritasında yalnızca Ocllo adasının bulunması gibi bazı veriler eksikti
- Sunucu veri formatlarını işlemek için tam bir araç takımı oluşturuldu ve dünyanın geri kalanındaki kapılar, tabelalar, süslemeler, teleportlar, tuzaklar, sandıklar ve spawn konumları tamamen yeniden kuruldu
Geriye kalan ekoloji sistemi
- Emekliye ayrılmış ünlü ecology system, işlev çağrıları kopmuş olsa da kod içinde hâlâ duruyordu
- Yırtıcı, av ve leşçi sistemi yeniden bağlanarak kurtların tavşanları kovalaması veya kargaların eşyaları yemesi yeniden görülebilir hale geldi
- Ancak yeterli doğru veri olmadığından tam kaynak/üretim sistemi uygulanmadı
- İlgili arka plan kaynakları olarak Raph Koster'ın
UOecology system yazısı ileUOkaynak sistemi yazıları 1, 2, 3 bağlantılanıyor
Ek özellikler ve istemci uyumluluğu
- OSI'nin Şubat 1999'da eklediği Meditation, Stealth ve Remove Trap skill'leri yeni sürüme dahil edildi
- Bu özelliklerin bazı erken izleri kodda zaten mevcuttu
- Yeni özelliklerin çoğu başlangıçta
-featuresparametresiyle açılıp kapatılabiliyor - Demo sunucuda hesap sistemi tamamen bulunmadığından, özgün geliştiricilerin bunu nasıl yapmış olabileceği tahmin edilerek hafif modernleştirilmiş bir biçimde yeniden uygulandı
- Orijinal demo sunucusu sadece istemci 1.25.33'ü destekliyordu; ancak bu sürüm, 1.25.30'dan 5.0.9.1'e yani 2007-03-27 tarihine kadarki tüm istemcileri şifrelemeli ya da şifrelemesiz destekleyecek şekilde genişletildi
- Yıllar içinde tamamen farklı beş ayrı şifreleme yöntemi kullanıldığından, her biri istemci ikilisinden tersine mühendislikle çıkarılmak zorunda kaldı
32 bit özgün ve 64 bit varsayılan derleme
- Özgün ikili 32 bittiydi, ancak güncel varsayılan derleme 64 biti hedefliyor
- Sınıf hiyerarşisi, özgün C++ kalıtımını yeniden üretmek için C struct gömme yöntemiyle kuruldu
- Bu sayede
CMobile*,CContainer*beklenen yerlere geçirilebiliyor - 64 bitte pointer genişliği arttığında kalıtılan alanların konumu kayabildiği için, bazı struct'lar hem 32 bit hem 64 bitte kalıtım ve vtable düzeni ikiliyle uyumlu olsun diye bilinçli olarak padding ile ayarlandı
Açık kaynaklar
- https://github.com/draxinar/ouo: kod
- https://github.com/draxinar/rundir:
UoDemo.dattabanlı veriler, düzeltmeler, tamamlanmış veri setleri ve yeni özellikler - https://uo.serpent-isle.com/: Test Center; gerçek bir shard değil, 1998
Ultima Onlinesunucusunun çok sadık bir yeniden üretimini denemeye yönelik ortam - UO:98: Batlin ve Derrick'in projesi; bu çalışmaya 2016'da başlama ilhamını veren kaynak
OUOhâlâ erken aşamada ve sorunlar kalmış olabilir- Bulunan sorunlar issue olarak bildirilebilir, katkılar da memnuniyetle karşılanıyor
Ultima Online topluluğuna çağrı
- 1997~2003 civarına ait özgün
Ultima Onlinesunucusunundynamic0.mul,dynamic0.bkp,regions.txt,resbank.muldosyalarına sahip olanların bunları paylaşması isteniyor dynamic0.mulvedynamic0.bkpsunucu kayıt dosyaları,regions.txtspawn tanımları,resbank.mulise kaynak tanım dosyası- Özgün
dynamic0.mulveyadynamic0.bkpdosyalarının tamamen kaybolmuş olma ihtimali düşük görünüyor dynamic0.muliçinden oyuncu verilerini kaldırarak gizliliği koruyup dağıtıma uygun hale getiren araçlar zaten hazırlanmış durumda- Bu dosyalar,
Ultima Onlinedünyasının içeriğini son derece doğru biçimde yeniden üretmek için büyük değer taşıyor
1 yorum
Hacker News yorumları
Elinde orijinal Ultima Online sunucusunun
dynamic0.mul,dynamic0.bkp,regions.txt,resbank.muldosyaları olan varsa göndermesine gerçekten çok minnettar olurumBunlar yaklaşık 1997~2003 dönemine ait sunucu kayıt oyunları, spawn tanımları ve kaynak tanım dosyaları; özellikle
dynamic0.mulya dadynamic0.bkpbüyük ihtimalle birden fazla güvenli yerde yedeklenmiştir, bu yüzden tamamen kaybolmuş olduklarını varsaymak zorBu dosyalar Ultima Online dünyasının içeriğini çok doğru biçimde yeniden üretmek için son derece değerli
Gerçekten harika. Tam da eski Ultima oyun müziklerini dinlerken bunu görmüş olmam çok ilginç
Disassembly çıktısını orijinalde kullanılan C++98 öncesi C++ lehçesiyle yazmayı ve asıl derleyiciyi hedeflemeyi düşünüp düşünmediklerini merak ediyorum
Eski sistemlerde çalışan binary’leri daha önce disassemble etmiştim; mümkün olsaydı ben de muhtemelen orijinal toolchain’i hedeflerdim. Oldukça ilginç, felsefi bir soru
eqclassic’in hayatta kalan son geliştiricisi olarak bunu ilgiyle okudum ama araçları nasıl kullandıkları ve sürecin genel olarak nasıl ilerlediği hakkında daha derin bir hikâye bekliyordum. Yine de güzel bir yazı
O zamanlar LLM yoktu ama 3 yıl sonraki bir PowerPC binary’sinden çıkan bazı debug symbol’ları vardı, biraz yardımcı olmuştu
packet_handlerya daentitylistgibi dosya adları tuhaf şekilde tanıdık geliyor :DSon eşik, geri kalanı cilalamadan önce fiilen kusursuza yakın bir ağ koduna sahip olmak oluyor; ben buna şimdiden yüzlerce saat harcadım
Kaynağa sadece biraz göz attım ama her şey TCP tabanlı görünüyor; üstüne ayrı bir güvenilirlik mekanizması bindirilmişe benzemiyor. Eğer öyleyse, döneminin MMO’ları için oldukça “yavaş” bir tercih gibi hissettirdiğinden ilginç
UO’yu denemek isteyen biri için hâlâ aktif bir oyuncu kitlesi olan bir oyun. UO Outlands gibi üçüncü taraf sunucular orijinal oynanışa daha yakın ama günümüz MMO’larına alışkın ölçütlerle bakınca oldukça acımasız
Başka oyuncular gelip sizi gank’leyebilir ve ekipmanınızı kaybedebilirsiniz
Şu anda bile o sunucuda 2500’den fazla kişi çevrimiçi, yani hâlâ çok canlı
İlk gerçek programlama başarım, bir Ultima Online shard web sitesi yapmaktı
Berbat PHP ve HTML kullanmıştım ama sonrasında 20 yıldan uzun süre çalıştı. Güzel anılar
UO etrafında hâlâ canlı bir topluluk olması beni şaşırttı ve her durumda bu proje gerçekten harika
O zamanlar 12~13 yaşındaydım, 90’ların sonu ile 2000’lerin başıydı. Emulator’un adını artık hatırlamıyorum ama muhtemelen POL’dü
Shard’ın amacı resmi sunucuları UO:Renaissance öncesi hâline olabildiğince yaklaştırmaktı; bu yüzden T2A gibi görünmesi ve hissettirmesi için epey uğraştık
Çok şey öğrendim; sonra RunUO çıkıp 2003 civarında biraz istikrar kazanınca, POL’de yaptığımız şeyleri RunUO için C# koduna taşımaya da yardım ettim ve ayak uydurmak için daha çok şey öğrenmem gerekti
O shard’da birlikte çalıştığım insanların hepsi ya üniversitede bilgisayar bilimi okuyordu ya da zaten programcı olarak çalışıyordu; ben ise birkaç script yazabilen bir çocuktum
Bence bu deneyim sonradan profesyonel olmamda belirleyici oldu. Gerçek bir teknoloji şirketindeki ilk işimi de o kişilerden biri staj pozisyonu açılınca beni tavsiye ettiği için aldım
Bir bakıma bugünkü kariyerim UO ve özel shard’lar sayesinde oluştu
Programlamaya tamamen ihtiyaçtan başladım
Oyunun adını unuttum ama sanırım City of Heroes’tu; yıllarca kapalı kaldıktan sonra bir gün biri özel sunucuyu yeniden ayağa kaldırdı
Eski Shockwave çevrimiçi oyunları için de niş topluluklar sunucuları yeniden kuruyor, Shockwave runtime’ı ve decompiler’lar geliştiriyor
Benzer sorunları çözdükleri için oyunlar arası topluluklar da birbiriyle örtüşüyor ;)
İkincisi haritayı değiştirmekti; statik öğeleri kaldırıyor, yeni adalar ve binalar ekliyordum
Üçüncüsü ise
verdata.muldosyasını değiştirip yeni animasyonlar ve eşya grafikleri eklemektiResmî olmayan bir POL sunucusunda Ultima Online oynamam sayesinde kelimenin tam anlamıyla BT’ye girdim. Ondan önce muhasebeci olmak için okuyordum
Bu sayede ilk kez IRC’ye girdim, oradan da zamanla freenode’a uzandı
UO emulator sahnesi beni ağ programlamasına yöneltti
Çevrimiçi oyunlar içinde bu kadar çok yan, ortaya çıkan ve tesadüfi oynanış mekaniğini bu kadar iyi yakalayabilen başka bir örnek görmedim
Sonraki 3D MMO’lar, UO’nun sunduğu ilginç ekonomi, inşa ve keşif unsurlarının çoğunu büyük ölçüde azalttı gibi geliyor
PvP ya da görev tarzı içerikleri başka oyunlar daha iyi yapıyor olabilir ama UO hâlâ cezbediciydi; tek başına, grupla ya da yabancılarla hafif etkileşim içinde oynayıp ruh hâline göre bunlar arasında doğal biçimde geçiş yapabiliyordunuz
İnsanların çoğu bunu istemiyor; önceden belirlenmiş raylarda olmayı tercih ediyor
Bir de bu tür oyunlara en çok çekilen iki grup arasında, biri varsa diğerinin oyunu bırakmasına yol açan bir dinamik oluşuyor. Üstelik ikinci grup, ilk grubun oyunda kalmasına ihtiyaç duyuyor
Örneğin Asheron's Call’un mod topluluğu çok hareketliydi ve şimdi bir emulator sahnesi de var. Yine de sunucu popülaritesi UO seviyesinde değil gibi
Shadowbane daha çok guild odaklıydı ama biraz haydut gibi davranıp rastgele kişilerle ya da guild’lerle PvP yapmanın eğlencesi vardı
WoW, Old School RuneScape ve Final Fantasy Online dışında gerçekten uğraşmaya değer çok az şey var
Bu projeyi 10 yıl boyunca aralıklı olarak yürütüp, sonrasında LLM’lerdeki ilerleme sayesinde sonu gelmeyecek gibi görünen işi sonunda bitirebildiğini anlatan kısım etkileyiciydi
Ben de bir MFC C++ decompilation projesi üzerinde çalışıyorum ve bu tür işlerde LLM’ler inanılmaz derecede faydalı
Eskiden Ultima Online oynardım
Son zamanlarda TazUO oyun istemcisinde Python script yazmakla eğleniyorum. Biraz eski bir Python 3 sürümü kullanıyor ama Razor ya da SteamUO’da script yazmaktan çok daha iyi
Sessiz, tek oyunculu bir shard’da bir şeyler denemek isterseniz Memento bana gayet iyi gelmişti
Ultima 4’ün NES sürümünün İspanyolca veya Fransızca yerelleştirilmiş mobil sürümünü arıyordum. Diğer oyunlar için de aynı durum geçerli
FF serisinin Pixel Remaster’ı gibi ele alınmış bir sürüm istiyorum
Şu anda sadece emulator ile oynanabiliyor
Metni bol yerelleştirilmiş RPG’ler, yabancı dili “oynayarak öğrenmek” için çok kolay bir yol ve okumak için de iyi
Böyle bir şeyin yapılmasını isterdim
Ah, UO… gerçekten harika anılar. Kredi kartı yaşında olmadığım için Palo Alto’daki Cybersmith’e bisikletle gidip ön ödemeli süre satın aldığımı hatırlıyorum
Eskiden Napa Valley shard’ında epey ciddi oynardım. Catskills’e gidecek kadar cesur değildim
Bugünlerde UO gibi bir deneyimi özlüyorum ama böyle bir oyuna ayıracak vaktim kesinlikle yok