1 Punkte von GN⁺ 1 시간 전 | 1 Kommentare | Auf WhatsApp teilen
  • OUO ist ein Projekt, das den Demoserver von Ultima Online aus 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.exe war eine eigenständige Demo, die der ersten Veröffentlichung von Ultima Online: The Second Age beilag, 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 Online aus 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.exe trä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 Online lief
  • Ultima Online war 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.exe wurde 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 r2 disassembliert 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
  • 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] IsMobile und [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.exe exakt 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 zum UO-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 -features ein- 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 ein CContainer* 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.dat basierende 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
  • OUO befindet 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.txt oder resbank.mul vom ursprünglichen Ultima Online-Server aus der Zeit von 1997 bis 2003 besitzt, wird gebeten, sie bereitzustellen
  • dynamic0.mul und dynamic0.bkp sind Server-Speicherdateien, regions.txt enthält Spawn-Definitionen und resbank.mul ist eine Ressourcendefinitionsdatei
  • Es erscheint unwahrscheinlich, dass die Originaldateien dynamic0.mul oder dynamic0.bkp vollständig verschwunden sind
  • Es gibt bereits Werkzeuge, um Spielerdaten aus dynamic0.mul zu 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

 
GN⁺ 1 시간 전
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

    • UO Outlands wirkt besser betrieben als das ursprüngliche UO. Auch der Discord ist ziemlich aktiv und hat ungefähr 20.000 Nutzer
  • 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

    • Bei mir war es ähnlich: Ich half beim Erstellen der Website und verwaltete die Installation des Forums, und später haben mir die Leute, die den Shard betrieben, sogar Teile des Emulator-Codes anvertraut
      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
    • Bei mir fing es damit an, mit einem Hilfstool namens UOInject das Erzschürfen zu automatisieren. Ich glaube, die Sprache war Visual Basic
      Ich habe allein aus Notwendigkeit mit dem Programmieren angefangen
    • Wenn es ein MMO oder ein Online-Spiel war, entstehen private Server-Communities immer wieder aufs Neue
      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 ;)
    • Meine erste echte Programmierleistung war ebenfalls eine Ultima-Online-Shard-Website
      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
    • Meine erste Website war für meine Gilde auf Chesapeake, und mein erstes „echtes Programmier“-Projekt war ein ziemlich zusammengehacktes Skript, um diverse Skills per Makro zu steigern
      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

    • Leider haben sich zwei Dinge als wahr herausgestellt
      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
    • Einige ältere 3D-MMORPGs haben versucht, solche Mechaniken einzubauen
      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
    • Vielleicht gibt es dort eine Chance. Ehrlich gesagt passiert auf dem MMO-Markt momentan nicht besonders viel
      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

    • Ich würde gern wissen, ob LLMs dafür automatisiert eingesetzt werden, und ob lokal oder in der Cloud
  • 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

    • Ich frage mich, warum Catskills ausgeschlossen war. War es anders? Verwechselst du das vielleicht mit Siege Perilous, das ein härteres Regelset hatte?