Reverse Engineering des Ultima Online-Demoservers von 1998
(draxinar.github.io)- OUO ist ein Projekt, das den Demoserver von
Ultima Onlineaus dem Jahr 1998 vollständig reverse-engineert hat und dabei etwa 5.000 Funktionen aus einem MSVC-x86-Binary disassembliert und in portables C99 übertragen hat UoDemo.exewar eine eigenständige Demo, die der ersten Veröffentlichung vonUltima Online: The Second Agebeilag, und enthielt sowohl den Client als auch den vollständigen, auf Windows portierten Servercode samt Daten- Jede Funktion wurde auf Instruktionsebene mit dem Original-Binary verglichen; nach der Anpassung von Klassenhierarchie und vtable-Layout erfolgte die manuelle Übersetzung so, dass derselbe Kontrollfluss, dieselben Struktur-Layouts und dieselben Verzweigungen wie im Original erhalten blieben
- Die Rekonstruktion liegt nahe am echten Live-Servercode von
Ultima Onlineaus der Mitte des Jahres 1998, enthält aber mit Tags gekennzeichnete Korrekturen für Stabilitätsprobleme wie Abstürze, Overflows und nicht initialisierte Variablen sowie für Gameplay-Probleme wie Skillanstieg und Spawn-Dichte - Die ursprüngliche Demo unterstützte nur Client 1.25.33, die Rekonstruktion unterstützt jedoch Clients von 1.25.30 bis 5.0.9.1 unabhängig von Verschlüsselung und sucht zudem nach Server-Datendateien aus den Jahren 1997 bis 2003
Herkunft und Umfang der Demo-Dateien
- Jede Funktion wurde auf Instruktionsebene mit dem Original-Binary verglichen; nach zehn Jahren sporadischer Arbeit konnte das Projekt dank jüngster LLM-Fortschritte abgeschlossen werden
UoDemo.exeträgt das Datum 1998-09-02, und die Serverdaten wurden am 2. Juni 1998 von einem Produktionsserver extrahiert- Für die Demo wurden einige Funktionen durch Stubs ersetzt und die spielbare Karte auf die Insel Ocllo reduziert, ansonsten handelte es sich um echten Produktionsservercode, der Mitte 1998 im Live-Betrieb von
Ultima Onlinelief Ultima Onlinewar ein 1997 von Origin Systems Inc. entwickeltes MMORPG und gehörte zu den frühen kommerziell erfolgreichen MMORPGs- Der Client lief unter Windows, während die Server, die sogenannten „shards“, auf mehreren Solaris-Maschinen liefen; die Weltkarte war regional aufgeteilt
- Die Demo bot eine einfache Quest auf der Insel Ocllo, bei der ein Drache getötet werden musste, und war so aufgebaut, dass grundlegende Spielmechaniken wie Dialog, Handel und Kampf erkundet werden konnten
- Mehrere
UO-Serveremulatoren nutzten Teile dieser Demo wieder, aber bis heute gab es keinen vollständig reverse-engineerten Fall UoDemo.exewurde mit Microsoft Visual C++ 5.0, also Visual Studio 97, kompiliert und zielte auf einen C++-Dialekt vor C++98
Methode des Reverse Engineering
-
Disassemblierung und Symbolschätzung
- Für die Disassemblierung wurde radare2 verwendet
- Symbolnamen wurden aus dem experimentellen Linux-Port des
UO-Clients 1.25.37 abgeleitet, der C++-Symbole enthielt
-
Manuelle Übertragung nach C99
- Jede Funktion wurde von Hand in C99 übersetzt, wobei derselbe Kontrollfluss, dieselben Struktur-Layouts und dieselben Verzweigungen wie im Original-Binary erhalten blieben
- Abweichungen betreffen tatsächliche Bugfixes der Demo oder Plattformanpassungen und sind im Quellcode markiert
-
Verifikationsverfahren
- Der C-Build wurde erneut mit
r2disassembliert und mit dem Original verglichen - Eine Funktion galt erst dann als abgeschlossen, wenn beide Ergebnisse übereinstimmten
- Hilfsfunktionen wurden nur für wiederkehrende Inline-Muster verwendet und nur dann eingesetzt, wenn sie sich wieder zu demselben Code wie die Inline-Version expandieren ließen
- Der C-Build wurde erneut mit
-
Wiederherstellung der Klassenhierarchie
- Eine der wichtigsten frühen Aufgaben war die exakte Rekonstruktion der Klassenhierarchie
- Die zentrale Hierarchie war
CEntity (0x10) -> CResourceEntity (0x1C) -> CItem (0x50) -> CContainer (0x5C) -> CMobile (0x37C) -> CPlayer (0x458) - Der virtuelle Dispatch erfolgte über vtable-Slots, zum Beispiel war
vtable[0x18]IsPlayer,[0xD0]IsMobileund[0xE4]IsNPC - Nachdem dieses Layout feststand, ließ sich der Großteil des Binarys relativ direkt übersetzen
Ergebnis der Rekonstruktion und Unterschiede zum Original
- Das Ergebnis kommt einer nahezu perfekten Replik des
Ultima Online-Servers von 1998 sehr nahe, weist aber einige Unterschiede auf - Gegenüber dem Originalcode wurden Stabilitätsprobleme wie Abstürze, Overflows und nicht initialisierte Variablen behoben
- Auch Gameplay-Probleme wie Skillanstieg, die Richtung von fame/notoriety und Spawn-Dichte wurden korrigiert
- Jede Änderung ist im Quellcode mit Tags versehen, sodass beim Vergleich mit
UoDemo.exeexakt nachvollzogen werden kann, was warum geändert wurde - Einige Funktionen wie das Spawn-System und das Decay-System waren defekt und wurden für die Demo-Veröffentlichung möglicherweise teilweise deaktiviert oder durch Stubs ersetzt
- Der Code für diese Funktionen war noch vorhanden, doch die Live-Callsites waren nicht erreichbar; durch separates Dekompilieren und erneutes Verbinden des Dispatchs konnten sie wieder funktionsfähig gemacht werden
- Einige Daten fehlten, etwa dass die Spielweltkarte nur die Insel Ocllo enthielt
- Es wurde eine vollständige Tool-Suite zur Bearbeitung des Serverdatenformats erstellt und damit Türen, Schilder, Dekorationen, Teleporter, Fallen, Kisten und Spawn-Positionen des restlichen Welteninhalts vollständig rekonstruiert
Erhalten gebliebenes Ökosystemsystem
- Das berühmte, später eingestellte ecology system war mit unterbrochenen Funktionsaufrufen zwar deaktiviert, aber im Code weiterhin vorhanden
- Das Räuber-, Beute- und Aasfressersystem wurde wieder verbunden, sodass nun zu sehen ist, wie Wölfe Kaninchen jagen oder Krähen Gegenstände fressen
- Wegen fehlender exakter Daten wurde jedoch nicht das vollständige Ressourcen- und Produktionssystem implementiert
- Als Hintergrundmaterial sind Raph Kosters Texte zum
UO-ecology system sowie zumUO-Ressourcensystem 1, 2, 3 verlinkt
Zusatzfunktionen und Client-Kompatibilität
- Die von OSI im Februar 1999 hinzugefügten Skills Meditation, Stealth und Remove Trap wurden neu eingebaut
- Einige frühe Spuren dieser Funktionen waren bereits im Code vorhanden
- Die meisten neuen Funktionen lassen sich beim Start über den Parameter
-featuresein- oder ausschalten - Da dem Demoserver ein Account-System vollständig fehlte, wurde es auf Basis einer Vermutung, wie die ursprünglichen Entwickler es umgesetzt hätten, in leicht modernisierter Form neu implementiert
- Der ursprüngliche Demoserver unterstützte nur Client 1.25.33, wurde aber so erweitert, dass er alle Clients von 1.25.30 bis 5.0.9.1, also bis 2007-03-27, unabhängig von Verschlüsselung unterstützt
- Da es über die Jahre hinweg fünf vollständig unterschiedliche Verschlüsselungsverfahren gab, musste jedes einzelne aus den Client-Binaries reverse-engineert werden
32-Bit-Original und 64-Bit-Standard-Build
- Das Original-Binary war 32-Bit, der heutige Standard-Build zielt jedoch auf 64-Bit ab
- Die Klassenhierarchie bildet die ursprüngliche C++-Vererbung über eingebettete C-Strukturen nach
- Dadurch kann ein
CMobile*an Stellen übergeben werden, an denen einCContainer*benötigt wird - Da die größere Pointer-Breite unter 64-Bit die Position vererbter Felder verschieben kann, wurden einige Strukturen absichtlich gepolstert, damit Vererbung und vtable-Layout sowohl unter 32-Bit als auch unter 64-Bit zum Binary passen
Öffentliche Ressourcen
- https://github.com/draxinar/ouo: Code
- https://github.com/draxinar/rundir: auf
UoDemo.datbasierende Daten, Modifikationen, vervollständigte Daten und neue Funktionen - https://uo.serpent-isle.com/: Test Center, kein echter shard, sondern eine Umgebung zum Testen einer sehr originalgetreuen Nachbildung des
Ultima Online-Servers von 1998 - UO:98: Projekt von Batlin und Derrick, das 2016 die Inspiration für den Beginn dieser Arbeit lieferte
OUObefindet sich noch in einem frühen Stadium und kann weiterhin Probleme enthalten- Gefundene Probleme können als Issue gemeldet werden; Beiträge sind ebenfalls willkommen
Aufruf an die Ultima-Online-Community
- Wer Dateien wie
dynamic0.mul,dynamic0.bkp,regions.txtoderresbank.mulvom ursprünglichenUltima Online-Server aus der Zeit von 1997 bis 2003 besitzt, wird gebeten, sie bereitzustellen dynamic0.mulunddynamic0.bkpsind Server-Speicherdateien,regions.txtenthält Spawn-Definitionen undresbank.mulist eine Ressourcendefinitionsdatei- Es erscheint unwahrscheinlich, dass die Originaldateien
dynamic0.muloderdynamic0.bkpvollständig verschwunden sind - Es gibt bereits Werkzeuge, um Spielerdaten aus
dynamic0.mulzu entfernen und die Dateien anschließend unter Wahrung der Privatsphäre zu verteilen - Diese Dateien sind von großem Wert, um die Inhalte der
Ultima Online-Welt mit sehr hoher Genauigkeit zu rekonstruieren
1 Kommentare
Hacker-News-Kommentare
Falls jemand die Dateien dynamic0.mul, dynamic0.bkp, regions.txt und resbank.mul vom ursprünglichen Ultima-Online-Server hat, wäre ich wirklich dankbar, wenn er sie schicken könnte
Das sind Server-Savegames, Spawn-Definitionen und Ressourcendefinitionsdateien aus etwa 1997–2003, und besonders dynamic0.mul oder dynamic0.bkp dürften an mehreren sicheren Orten gesichert worden sein, also sind sie vermutlich nicht vollständig verschwunden
Diese Dateien sind äußerst wertvoll, um die Inhalte der Ultima-Online-Welt sehr genau nachzubilden
Wirklich großartig. Schon seltsam, dass ich das genau in dem Moment sehe, in dem ich gerade den alten Ultima-Spielesoundtrack höre
Ich frage mich, ob in Erwägung gezogen wurde, die Disassemblierung in dem im Original verwendeten C++-Dialekt vor C++98 zu schreiben und den ursprünglichen Compiler als Ziel zu nehmen
Ich habe schon Binärdateien disassembliert, die auf Vintage-Systemen liefen, und wenn es möglich gewesen wäre, hätte ich wohl die ursprüngliche Toolchain angepeilt. Das ist eine ziemlich interessante philosophische Frage
Als letzter überlebender Entwickler von eqclassic fand ich das sehr interessant zu lesen, hatte aber auf eine tiefere Geschichte gehofft, wie die Werkzeuge verwendet wurden und wie der Gesamtprozess aussah. Trotzdem ein guter Beitrag
Damals gab es noch keine LLMs, aber einige Debug-Symbole aus einer drei Jahre späteren PowerPC-Binärdatei haben ein wenig geholfen
Dateinamen wie packet_handler oder entitylist kommen mir auf merkwürdige Weise bekannt vor :D
Die letzte Hürde besteht darin, praktisch perfekten Netzwerk-Code zu haben, bevor man den Rest aufpoliert, und ich habe dafür bereits Hunderte Stunden verbrannt
Ich habe den Source nur kurz überflogen, aber es scheint komplett TCP-basiert zu sein, ohne einen zusätzlichen Zuverlässigkeitsmechanismus darüberzulegen. Falls das stimmt, wirkt das für ein MMO jener Zeit wie eine ziemlich „langsame“ Entscheidung, was interessant ist
Für Leute, die UO ausprobieren wollen: Das Spiel hat immer noch eine aktive Spielerschaft. Drittanbieter-Server wie UO Outlands liegen näher am ursprünglichen Gameplay, sind nach heutigen MMO-Maßstäben aber ziemlich gnadenlos
Andere Spieler können auftauchen, dich ganken und du kannst deine Ausrüstung verlieren
Gerade jetzt sind auf diesem Server über 2500 Leute online, also ist dort weiterhin sehr viel los
Meine erste echte Programmierleistung war es, eine Ultima-Online-Shard-Website zu bauen
Sie war mit miserablen PHP und HTML gemacht, lief aber danach über 20 Jahre lang. Gute Erinnerungen
Ich war überrascht, dass es rund um UO immer noch eine aktive Community gibt, und dieses Projekt ist auf jeden Fall wirklich großartig
Ich war damals 12 oder 13, also Ende der 90er bis Anfang der 2000er. An den Namen des Emulators erinnere ich mich nicht mehr, aber es war wahrscheinlich POL
Das Ziel des Shards war es, den offiziellen Servern vor UO:Renaissance so nahe wie möglich zu kommen, also haben wir ziemlich viel Arbeit hineingesteckt, damit es wie T2A aussah und sich auch so anfühlte
Ich habe dabei viel gelernt, und nachdem RunUO erschien und um 2003 herum einigermaßen stabil wurde, half ich auch dabei, die Dinge, die wir in POL gebaut hatten, in C#-Code für RunUO zu übertragen, und musste noch mehr lernen, um mitzuhalten
Die Leute, mit denen ich auf diesem Shard zusammenarbeitete, studierten alle Informatik oder arbeiteten bereits als Programmierer, und ich war nur irgendein Kind, das ein paar Skripte schreiben konnte
Ich denke, diese Erfahrung war später entscheidend dafür, Profi zu werden. Meinen ersten Job in einem echten Tech-Unternehmen bekam ich ebenfalls durch eine Empfehlung von einem von ihnen, als dort eine Praktikumsstelle frei wurde
In gewisser Weise verdanke ich meine heutige Karriere UO und privaten Shards
Ich habe allein aus Notwendigkeit mit dem Programmieren angefangen
Ich habe den Namen des Spiels vergessen, aber ich glaube, es war City of Heroes, das ein paar Jahre lang abgeschaltet war und dann eines Tages wieder durch einen privaten Server auftauchte
Auch bei alten Shockwave-Onlinespielen rekonstruieren Nischen-Communities die Server und bauen Shockwave-Runtimes und Decompiler
Weil überall ähnliche Probleme gelöst werden, überschneiden sich die Communities spielübergreifend ;)
Die zweite war das Verändern der Karte, etwa das Entfernen statischer Items und das Hinzufügen neuer Inseln und Gebäude
Die dritte war das Modifizieren von verdata.mul, um neue Animationen und Item-Grafiken hinzuzufügen
Dank Ultima Online auf einem inoffiziellen POL-Server bin ich buchstäblich in die IT gekommen. Davor hatte ich darauf hingearbeitet, Buchhalter zu werden
Dadurch kam ich zum ersten Mal auf IRC und später dann bis zu freenode
Die UO-Emulator-Szene hat mich zur Netzwerkprogrammierung gebracht
Ich habe bei Online-Spielen kaum je ein Beispiel gesehen, das so viele begleitende, emergente und zufällige Gameplay-Mechaniken so gut eingefangen hat
Spätere 3D-MMOs scheinen viele der interessanten Wirtschafts-, Bau- und Erkundungselemente, die UO bot, stark zurückgefahren zu haben
PvP oder Quest-artige Dinge können andere Spiele besser, aber UO blieb faszinierend, und man konnte ganz natürlich zwischen Solo-Spiel, Gruppenspiel und lockeren Interaktionen mit Fremden wechseln – je nachdem, worauf man gerade Lust hatte
Die meisten Menschen wollen so etwas nicht und bevorzugen vorgegebene Schienen
Und die beiden Gruppen, die sich von solchen Spielen am stärksten angezogen fühlen, geraten in eine Dynamik, bei der die eine die andere aus dem Spiel treibt. Dabei ist die zweite Gruppe darauf angewiesen, dass die erste überhaupt spielt
Asheron's Call zum Beispiel hatte eine sehr aktive Mod-Community und inzwischen auch eine Emulator-Szene. Allerdings scheint die Server-Popularität nicht an UO heranzureichen
Shadowbane war stark gildenorientiert, aber es machte Spaß, sich ein bisschen wie ein Gesetzloser zu verhalten und mit zufälligen Leuten oder Gilden PvP zu machen
Abgesehen von WoW, Old School RuneScape und Final Fantasy Online gibt es nicht allzu viel Großes, das sich wirklich zu spielen lohnt
Beeindruckend fand ich die Stelle, an der es darum ging, dass dieses Projekt zehn Jahre lang immer wieder nebenbei lief und dank der jüngsten LLM-Fortschritte nun endlich abgeschlossen werden konnte, obwohl es zuvor endlos wirkte
Ich arbeite auch an einem MFC-C++-Decompilation-Projekt, und für solche Arbeiten sind LLMs absurd nützlich
Früher habe ich Ultima Online gespielt
In letzter Zeit habe ich viel Spaß mit Python-Skripting im TazUO-Spielclient. Es ist zwar eine etwas ältere Python-3-Version, aber immer noch deutlich besser, als Skripte in Razor oder SteamUO zu schreiben
Wenn man auf einem ruhigen Singleplayer-Shard ein bisschen herumprobieren will, fand ich Memento ziemlich gut
Ich habe nach einer spanischen oder französischen lokalisierten Mobilversion der NES-Version von Ultima 4 gesucht. Das gilt auch für die anderen Teile
Ich wünsche mir etwas in der Aufmachung der Pixel Remaster der FF-Serie
Im Moment kann man sie nur per Emulator spielen
Solche textlastigen lokalisierten RPGs sind eine sehr einfache Möglichkeit, eine Fremdsprache „spielerisch zu lernen“, und sie eignen sich auch gut zum Lesen
Es wäre schön, wenn es so etwas gäbe
Ach, UO … wirklich schöne Erinnerungen. Ich war noch nicht alt genug für eine Kreditkarte und bin deshalb mit dem Fahrrad zum Cybersmith in Palo Alto gefahren, um vorausbezahlte Zeit zu kaufen
Früher habe ich ziemlich intensiv auf dem Napa-Valley-Shard gespielt. Nach Catskills habe ich mich nicht getraut
Heute vermisse ich Erfahrungen wie UO, aber ich habe schlicht nicht mehr die Zeit, die man in solche Spiele stecken muss