1 puntos por GN⁺ 2 시간 전 | 1 comentarios | Compartir por WhatsApp
  • OUO es un proyecto que hizo ingeniería inversa completa del servidor demo de Ultima Online de 1998, desensamblando unas 5,000 funciones de un binario MSVC x86 y trasladándolas a C99 portable
  • UoDemo.exe era un demo ejecutable independiente incluido en la primera versión de Ultima Online: The Second Age, y contenía tanto el cliente como el código y los datos completos del servidor portados a Windows
  • Cada función se comparó a nivel de instrucción con el binario original y, tras hacer coincidir la jerarquía de clases y el layout de las vtable, se convirtió manualmente para conservar el mismo flujo de control, layout de estructuras y ramas que el original
  • La restauración está muy cerca del código del servidor en producción de Ultima Online de mediados de 1998, pero corrige problemas de estabilidad como crashes, overflows y variables no inicializadas, así como problemas de jugabilidad como la subida de habilidades y la densidad de spawns, todo marcado con tags
  • El demo original solo soportaba el cliente 1.25.33, pero la restauración soporta clientes desde la 1.25.30 hasta la 5.0.9.1 con o sin cifrado, y además está solicitando archivos de datos de servidor de 1997 a 2003

Origen y alcance de los archivos del demo

  • Cada función se comparó a nivel de instrucción con el binario original, y el trabajo pudo concluirse recientemente gracias a los avances de los LLM tras 10 años de trabajo intermitente
  • UoDemo.exe está fechado 1998-09-02, y los datos del servidor fueron extraídos de un servidor en producción del 2 de junio de 1998
  • Para el demo, algunas funciones fueron stubbeadas y el mapa jugable se redujo a la isla de Ocllo, pero el resto seguía siendo el código del servidor en producción que corría en el Ultima Online real de mediados de 1998
  • Ultima Online fue un MMORPG de 1997 desarrollado por Origin Systems Inc., y uno de los primeros MMORPG comercialmente exitosos
  • El cliente corría en Windows, mientras que los servidores, llamados “shards”, corrían en varias máquinas Solaris, y el mapa estaba dividido por regiones
  • El demo ofrecía una misión simple para matar un dragón en la isla de Ocllo y permitía explorar mecánicas básicas del juego como diálogo, comercio y combate
  • Varios emuladores de servidor de UO reutilizaron partes de este demo, pero hasta ahora no había ningún caso de ingeniería inversa completa
  • UoDemo.exe fue compilado con Microsoft Visual C++ 5.0, es decir, Visual Studio 97, y apuntaba a un dialecto de C++ anterior a C++98

Método de ingeniería inversa

  • Desensamblado y estimación de símbolos

    • Se usó radare2 para el desensamblado
    • Los nombres de símbolos se infirieron a partir del cliente experimental UO 1.25.37 para Linux, que incluía símbolos de C++
  • Conversión manual a C99

    • Cada función fue traducida a mano a C99 para conservar el mismo flujo de control, layout de estructuras y ramas que el binario original
    • Las partes distintas corresponden a correcciones de bugs reales del demo o adaptaciones de plataforma, y están marcadas en el código fuente
  • Método de validación

    • El build en C se volvía a desensamblar con r2 para compararlo con el original
    • Una función solo se marcaba como terminada cuando ambos resultados coincidían
    • Las funciones helper se usaron solo para patrones inline repetidos, y únicamente cuando el helper podía expandirse de nuevo al mismo código que la versión inline
  • Restauración de la jerarquía de clases

    • Al inicio, la tarea más importante fue hacer coincidir con precisión la jerarquía de clases
    • La jerarquía central era CEntity (0x10) -> CResourceEntity (0x1C) -> CItem (0x50) -> CContainer (0x5C) -> CMobile (0x37C) -> CPlayer (0x458)
    • El despacho virtual se hacía mediante slots de vtable; por ejemplo, vtable[0x18] era IsPlayer, [0xD0] era IsMobile y [0xE4] era IsNPC
    • Una vez fijado ese layout, fue posible traducir gran parte del binario de forma relativamente directa

Resultado de la restauración y diferencias con el original

  • El resultado se acerca a una copia casi perfecta del servidor de Ultima Online de 1998, aunque hay algunas diferencias
  • Frente al código original, se corrigieron problemas de estabilidad como crashes, overflows y variables no inicializadas
  • También se corrigieron problemas de jugabilidad como la subida de habilidades, la dirección de fame/notoriety y la densidad de spawns
  • Cada corrección está etiquetada en el código fuente, para que quien compare con UoDemo.exe pueda ver exactamente qué cambió y por qué
  • Algunas funciones, como el sistema de spawn y el sistema de decay, estaban rotas y es posible que se hayan desactivado parcialmente o reemplazado por stubs para lanzar el demo
  • El código de esas funciones seguía presente, pero los puntos de llamada activos no llegaban a ellas; bastó descompilarlas por separado y volver a conectar el despacho para hacerlas funcionar
  • Faltaban algunos datos, como el mapa del juego, que solo incluía la isla de Ocllo
  • Se creó un conjunto completo de herramientas para manipular el formato de datos del servidor y reconstruir por completo puertas, letreros, decoraciones, teleporters, trampas, cofres y ubicaciones de spawn del resto del mundo

Sistemas del ecosistema que seguían presentes

  • El célebre ecology system, ya retirado, seguía presente en el código, aunque con sus llamadas de función desconectadas
  • Al volver a conectarlo, se pudo ver a los lobos perseguir conejos o a los cuervos comer ítems, gracias al sistema de depredadores, presas y carroñeros
  • Sin embargo, por falta de datos precisos, no se implementó el sistema completo de recursos y producción
  • Como material de contexto relacionado, se enlazan el ecology system de UO de Raph Koster y sus textos sobre el sistema de recursos de UO: 1, 2, 3

Funciones adicionales y compatibilidad de clientes

  • Se añadieron las habilidades Meditation, Stealth y Remove Trap, incorporadas por OSI en febrero de 1999
  • Algunos rastros iniciales de estas funciones ya permanecían en el código
  • La mayoría de las funciones nuevas pueden activarse o desactivarse al inicio con el parámetro -features
  • Como el servidor demo no tenía ningún sistema de cuentas, se volvió a implementar en una forma ligeramente modernizada, estimando cómo lo habrían hecho los desarrolladores originales
  • El servidor demo original solo soportaba el cliente 1.25.33, pero se amplió para soportar todos los clientes desde la 1.25.30 hasta la 5.0.9.1, es decir, hasta 2007-03-27, con o sin cifrado
  • Como a lo largo de los años hubo cinco métodos de cifrado completamente distintos, fue necesario hacer ingeniería inversa de cada uno a partir de los binarios de cliente

Original de 32 bits y build predeterminado de 64 bits

  • El binario original era de 32 bits, pero el build predeterminado actual apunta a 64 bits
  • La jerarquía de clases reproduce la herencia original de C++ mediante embedding de estructuras C
  • Gracias a este enfoque, es posible pasar un CMobile* donde se requiere un CContainer*
  • Como al pasar a 64 bits el ancho de los punteros aumenta y puede desplazar la posición de los campos heredados, algunas estructuras se rellenaron intencionalmente para que el layout de herencia y de vtable coincida con el binario tanto en 32 como en 64 bits

Recursos públicos

  • https://github.com/draxinar/ouo: código
  • https://github.com/draxinar/rundir: datos basados en UoDemo.dat, modificaciones, datos completados y nuevas funciones
  • https://uo.serpent-isle.com/: Test Center, no es un shard real sino un entorno para probar una recreación muy fiel del servidor de Ultima Online de 1998
  • UO:98: proyecto de Batlin y Derrick, fuente de inspiración que llevó a iniciar este trabajo en 2016
  • OUO aún está en una etapa temprana y puede seguir teniendo problemas
  • Los problemas encontrados pueden reportarse como issue, y las contribuciones también son bienvenidas

Solicitud a la comunidad de Ultima Online

  • Se solicita a quien tenga los archivos dynamic0.mul, dynamic0.bkp, regions.txt y resbank.mul del servidor original de Ultima Online de alrededor de 1997~2003 que los comparta
  • dynamic0.mul y dynamic0.bkp son archivos de guardado del servidor; regions.txt contiene definiciones de spawn, y resbank.mul es el archivo de definiciones de recursos
  • Parece poco probable que los archivos originales dynamic0.mul o dynamic0.bkp se hayan perdido por completo
  • Ya existen herramientas para eliminar datos de jugadores del archivo dynamic0.mul, preservar la privacidad y luego distribuirlo
  • Estos archivos tienen un gran valor para recrear con mucha precisión el contenido del mundo de Ultima Online

1 comentarios

 
GN⁺ 2 시간 전
Comentarios en Hacker News
  • Si alguien tiene los archivos dynamic0.mul, dynamic0.bkp, regions.txt y resbank.mul del servidor original de Ultima Online, realmente agradecería que me los enviara
    Son archivos de guardado del servidor, definiciones de spawns y definiciones de recursos de alrededor de 1997~2003, y especialmente dynamic0.mul o dynamic0.bkp debieron haberse respaldado en varios lugares seguros, así que es difícil pensar que hayan desaparecido por completo
    Estos archivos son extremadamente valiosos para recrear con mucha precisión el contenido del mundo de Ultima Online

  • Está increíble. Qué curioso verlo justo cuando estaba escuchando el soundtrack de los viejos juegos de Ultima
    Me pregunto si consideraron escribir el resultado del desensamblado en el dialecto de C++ anterior a C++98 que se usaba en el original y apuntar al compilador original
    He desensamblado binarios que corrían en sistemas vintage, y si hubiera sido posible, creo que habría intentado apuntar al toolchain original. Es una pregunta filosófica bastante interesante

  • Como el último desarrollador sobreviviente de eqclassic, lo leí con interés, pero esperaba una historia más profunda sobre cómo usaron las herramientas y cómo fue todo el proceso. Aun así, buen artículo
    En ese tiempo no había LLM, pero ayudó un poco que hubiera algunos símbolos de depuración en un binario PowerPC de 3 años después
    Nombres de archivos como packet_handler o entitylist se sienten extrañamente familiares :D
    La última gran barrera es tener un código de red prácticamente perfecto antes de pulir el resto, y ya he perdido cientos de horas en eso
    Solo revisé un poco el código, pero parece estar basado completamente en TCP, así que no da la impresión de que hayan montado un mecanismo de confiabilidad aparte encima. Si es así, se siente como una decisión bastante “lenta” para un MMO de esa época, lo cual es interesante

  • Para cualquiera que quiera probar UO, sigue siendo un juego con una base de jugadores activa. Servidores de terceros como UO Outlands están más cerca del gameplay original, aunque según los estándares de alguien acostumbrado a los MMO modernos puede ser bastante duro
    Otro jugador puede llegar, gankearte y podrías perder tu equipo
    Incluso ahora hay más de 2500 personas conectadas a ese servidor, así que sigue muy activo

    • UO Outlands se siente mejor operado que el UO original. Su Discord también está bastante activo y tiene como 20 mil usuarios
  • Mi primer logro de programación de verdad fue hacer un sitio web para un shard de Ultima Online
    Usé PHP y HTML horribles, pero siguió funcionando por más de 20 años. Buenos recuerdos
    Me sorprendió que todavía hubiera una comunidad tan activa alrededor de UO y, de cualquier forma, este proyecto está increíble

    • En mi caso, empecé ayudando a hacer el sitio web y administrando la instalación de los foros, y luego la gente que manejaba el shard me confió también parte del código del emulador
      Yo tenía 12 o 13 años, a finales de los 90 y principios de los 2000. Ya no recuerdo el nombre del emulador, pero probablemente era POL
      El objetivo del shard era parecerse lo más posible a los servidores oficiales anteriores a UO:Renaissance, así que se trabajó bastante para que se viera y se sintiera como T2A
      Aprendí muchísimo y después, cuando salió RunUO y hacia 2003 se estabilizó más o menos, también ayudé a migrar a código C# para RunUO lo que habíamos hecho en POL, y para seguir el ritmo tuve que aprender más
      Todos los que trabajaban conmigo en ese shard estudiaban informática en la universidad o ya trabajaban como programadores, y yo era solo un chamaco que sabía escribir unos cuantos scripts
      Creo que esa experiencia fue decisiva para que más tarde me volviera profesional. Incluso conseguí mi primer trabajo en una empresa de tecnología real porque uno de ellos me recomendó cuando salió una vacante de intern
      En cierto sentido, mi carrera actual existe gracias a UO y los shards privados
    • En mi caso, todo empezó automatizando la minería de mineral con una herramienta auxiliar llamada UOInject. Creo que ese lenguaje era Visual Basic
      Empecé a programar por pura necesidad
    • Si era un MMO o un juego en línea, las comunidades de servidores privados aparecen sin parar
      Olvidé el nombre del juego, pero creo que era City of Heroes, y después de haber estado cerrado por años, un día alguien volvió a levantar un servidor privado
      Incluso en viejos juegos en línea de Shockwave hay comunidades de nicho reconstruyendo servidores y creando runtimes de Shockwave y decompiladores
      Como terminan resolviendo problemas parecidos, las comunidades de distintos juegos también se traslapan ;)
    • Mi primer logro de programación de verdad también fue un sitio web para un shard de Ultima Online
      El segundo fue modificar el mapa, quitando ítems estáticos y agregando nuevas islas y edificios
      El tercero fue modificar verdata.mul para agregar nuevas animaciones y gráficos de ítems
      Literalmente entré al mundo de TI gracias a jugar Ultima Online en un servidor POL no oficial. Antes de eso estaba estudiando para ser contador
    • Mi primer sitio web fue para mi guild en Chesapeake, y mi primer proyecto de “programación real” fue armar de forma medio improvisada scripts para subir varias skills con macros
      Por eso entré a IRC por primera vez, y después terminé en freenode
  • La escena de emuladores de UO fue lo que me llevó a la programación de redes
    No recuerdo otro juego en línea que haya capturado tan bien tantos mecanismos de gameplay secundarios, emergentes y accidentales
    Los MMO 3D que vinieron después parecen haber reducido mucho de lo interesante que UO ofrecía en economía, construcción y exploración
    Tal vez otros juegos sean mejores en PvP o en cosas tipo quests, pero UO seguía siendo atractivo y podías pasar naturalmente entre jugar solo, en grupo o tener interacciones ligeras con desconocidos según te diera el ánimo

    • Tristemente, dos cosas resultaron ser ciertas
      La mayoría de la gente no quiere eso y prefiere estar sobre rieles predeterminados
      Y los dos grupos a los que más atraen estos juegos caen en una dinámica donde si uno está presente, el otro termina yéndose del juego. Pero el segundo grupo necesita que el primero juegue
    • Algunos MMORPG 3D viejos sí intentaron meter mecánicas así
      Por ejemplo, Asheron's Call tenía una comunidad de mods muy activa y ahora también tiene una escena de emuladores. Aunque no parece tener la misma popularidad de servidores que UO
      Shadowbane estaba muy centrado en guilds, pero también era divertido andar medio como forajido y hacer PvP contra personas o guilds al azar
    • Tal vez todavía haya una oportunidad ahí. Si soy sincero, ahora mismo no hay mucho movimiento en el mercado de los MMO
      Fuera de WoW, Old School RuneScape y Final Fantasy Online, no hay demasiado que realmente valga la pena jugar
  • Me llamó la atención la parte de que, tras avanzar en este proyecto de forma intermitente durante 10 años, por fin pudo completarse un trabajo que parecía no tener fin gracias a los recientes avances en LLM
    Yo también estoy trabajando en un proyecto de decompilación de MFC C++, y los LLM son ridículamente útiles para este tipo de trabajo

    • Me pregunto si están usando LLM de forma automatizada para este trabajo. También me da curiosidad si es local o en la nube
  • Antes disfrutaba mucho Ultima Online
    Últimamente me estoy divirtiendo haciendo scripting en Python en el cliente de juego TazUO. Es una versión algo vieja de Python 3, pero está mucho mejor que escribir scripts en Razor o SteamUO
    Si quieres probar cosas tranquilamente en un shard de un solo jugador, Memento me pareció una buena opción

  • He estado buscando una versión móvil localizada al español o francés de Ultima 4 para NES. Lo mismo con otros títulos
    Quisiera algo tratado como la serie Pixel Remaster de FF
    Ahora mismo solo se puede jugar con emulador
    Los RPG localizados con mucho texto son una forma muy fácil de “aprender jugando” un idioma extranjero, y también son buenos para leer
    Ojalá existiera algo así

  • Ah, UO… qué grandes recuerdos. Recuerdo ir en bicicleta hasta Cybersmith en Palo Alto para comprar tiempo prepago, porque no tenía edad para tener tarjeta
    Antes jugaba bastante en el shard de Napa Valley. No era lo suficientemente valiente como para ir a Catskills
    Extraño experiencias como UO hoy en día, pero de plano ya no tengo tiempo para dedicarle a un juego así

    • Me da curiosidad por qué no Catskills. ¿Era diferente? ¿No estarás pensando en Siege Perilous, que tenía un conjunto de reglas más difícil?