2 puntos por GN⁺ 2024-12-09 | Aún no hay comentarios. | Compartir por WhatsApp
  • Gracias al CD de imagen de juegos de Sega Channel de septiembre de 1996, publicado en 2024, fue posible extraer y ver realmente datos de juegos y menús desde una imagen de transmisión de unos 60 MB
  • Sega Channel era un servicio de suscripción mensual que transmitía juegos de Genesis en bucle a través de la red de cable, y los usuarios jugaban mediante un adaptador que encontraba y descargaba el juego deseado desde un bucle continuo de datos
  • La cadena de creación de imágenes pasaba por MENUMAKR, PKSPREAD y NSF, y el punto de quiebre para el análisis fue que NSF.EXE, encargado de la codificación final, conservaba símbolos de depuración
  • La restauración se hizo creando primero un programa en C que produjera la misma salida que NSF, luego separando archivos con un decodificador inverso y descomprimiendo la compresión .SA para obtener ROM estándar de Genesis
  • El contenido extraído incluyó los juegos exclusivos de Sega Channel Chessmaster y Klondike, builds nuevas, ROM con marcas de agua, y ROM de menús y descripciones de juegos; todo quedó ejecutable en emuladores

Contexto del servicio Sega Channel y de los archivos de imagen

  • Sega Channel fue un servicio de juegos on demand operado desde junio de 1994 hasta junio de 1998
    • El lanzamiento nacional se realizó en diciembre de 1994
    • Según el operador de cable, normalmente se pagaban 10 a 15 dólares al mes para acceder a una biblioteca mensual de unos 50 juegos de Sega Genesis
    • El pico de suscriptores del servicio fue de alrededor de 250 mil
  • Los suscriptores recibían un cartucho adaptador que se conectaba a la Genesis, y ese adaptador se conectaba al cable de TV
    • Al arrancar, buscaba la señal de Sega Channel y descargaba el menú de juegos
    • La descarga del menú solía tardar unos 20 segundos
    • Al elegir un juego, este se descargaba a la RAM del adaptador durante alrededor de 1 minuto
    • El juego descargado funcionaba como un cartucho comercial normal
  • Al apagar la consola o presionar el botón de menú del adaptador, el juego descargado se borraba
    • Los datos guardados se mantenían siempre que el usuario no descargara otro juego
  • Además de juegos comerciales, Sega Channel también tenía una sección de Test Drives
    • Permitía jugar versiones con límite de tiempo o contenido de juegos antes de su lanzamiento
    • También existían juegos disponibles solo en Sega Channel

Cómo se creaban y entregaban las imágenes de transmisión

  • El personal de Sega Channel seleccionaba la alineación mensual de juegos y contenidos como pistas, manuales, noticias y fanart digital
  • Luego el contenido se entregaba a Foley Hi-Tech
    • Foley Hi-Tech creaba los gráficos y animaciones del menú de juegos e insertaba el contenido mensual
    • El resultado era un archivo de imagen de juegos de unos 60 MB
  • La imagen de juegos se grababa en CD y se enviaba a la instalación de uplink satelital en Denver, Colorado
    • El CD se instalaba en la computadora servidora de juegos del uplink
    • El servidor transmitía continuamente los datos de juegos por satélite en bucle
    • Las cabeceras de cable de todo EE. UU. recibían la señal satelital y la entregaban a los suscriptores
  • En un entorno donde los operadores de TV por cable no podían recibir datos de los suscriptores, la transmisión continua en bucle determinaba la forma de interacción del servicio
    • Cuando el usuario seleccionaba un juego, el adaptador encontraba los datos de ese juego dentro del flujo de datos de Sega Channel
  • La imagen de juegos de unos 60 MB se transmitía a unos 12 Mbps usando 2 portadoras de 6 Mbps
    • Si no había problemas de señal, el usuario podía jugar el juego seleccionado dentro de un solo bucle de datos
    • El flujo de datos incluía copias duplicadas del menú para que pudiera descargarse más rápido

Hallazgo del CD de imagen de juegos de septiembre de 1996

  • En noviembre de 2024, el usuario RisingFromRuins del foro Sonic Retro descubrió un CD de imagen de juegos de Sega Channel de septiembre de 1996 mientras revisaba un lote de equipos de PC que había comprado hacía mucho tiempo
  • Publicó fotos del CD y subió una copia del archivo de imagen de juegos del disco
  • El objetivo del análisis era extraer los datos del archivo de imagen para comprobar si había juegos exclusivos o juegos prototipo
  • Al principio se revisó el archivo de imagen con un editor hexadecimal
    • Los juegos de Genesis tienen un encabezado ASCII estándar, y se esperaba que también pudieran leerse las pistas de juegos y los manuales descargables
    • En el archivo real no se veían cadenas legibles
    • Aumentó la posibilidad de que el archivo de imagen estuviera mezclado o cifrado

Cadena de creación de imágenes hallada en un CD de herramientas de desarrollo

  • Una pista clave fue que en 2017 el usuario tdijital publicó un CD de respaldo de materiales de desarrollo de Sega Channel de Foley Hi-Tech
    • En ese CD ya se habían identificado una versión de concurso de Primal Rage, un juego de trivia japonés de Sega Channel y ROM de demostración de menús de diciembre de 1994 a enero de 1996
    • Las herramientas de desarrollo en sí no habían sido analizadas en profundidad
  • En lugar de hacer ingeniería inversa del código de descarga del lado de Genesis, se eligió hacer ingeniería inversa de las herramientas que creaban la imagen de juegos
  • El flujo de creación de imágenes tenía tres etapas
    • MENUMAKR: agregaba juegos, descripciones, texto de noticias, arte, música, etc., y generaba un binario de menú y el archivo de script MENUSPIN.BAT
    • PKSPREAD: programa creado por Scientific Atlanta que verificaba el contenido de MENUSPIN.BAT y generaba PMAP.DAT
    • NSF: usaba PMAP.DAT para codificar los archivos de entrada y crear el archivo final de imagen de juegos
  • Scientific Atlanta era una empresa de equipos de cable que colaboró con Sega en el equipamiento de transmisión y el cartucho adaptador de Sega Channel
  • El objetivo central del análisis fue NSF.EXE, que creaba el archivo final de imagen

Ingeniería inversa de NSF.EXE

  • NSF.EXE había sido compilado en modo debug, con las optimizaciones desactivadas y con símbolos incluidos en el ejecutable
    • Era un programa compilado con Borland C++ 4.1
    • Como IDA Pro no reconoció automáticamente los símbolos de depuración, se revisaron en Turbo Debugger y se trasladaron manualmente
  • En vez de escribir un decodificador de inmediato, primero se escribió un programa equivalente a NSF.EXE
    • Si podía generar una salida idéntica byte por byte a la imagen creada por el NSF.EXE de DOS, se podía considerar que el algoritmo estaba correctamente entendido
    • Se creó un archivo de imagen de juegos de prueba y se implementó hasta que la salida coincidiera
  • Tras un día de trabajo y varias noches de depuración, se escribió un programa en C que producía la misma salida que NSF.EXE
    • Se implementó con IDA y Visual Studio abiertos en paralelo, ajustándolo lo más posible al ensamblador
    • No se buscó generar el mismo binario compilado que el original
    • Como la implementación usa declaraciones de C99 y tipos de stdint.h, es posible que no compile tal cual en Borland C++ 4

Método de codificación de NSF para transmisión

  • La función GetData de NSF toma desde PMAP.DAT el archivo de entrada por paquete, la posición dentro del archivo y los metadatos de Sega Channel
    • Los metadatos incluyen el ID de archivo y el tiempo jugable de las demos con límite de tiempo
    • Luego lee chunks de 246 bytes desde el archivo de datos
  • La función LoadFrame agrega un encabezado al paquete de datos e invierte todos los bytes de datos
    • La inversión de bytes podría ser un procesamiento relacionado con la transmisión de datos o una forma de ocultar el contenido de los paquetes
    • En medio de los datos de juego se insertan códigos BCH de corrección de errores y bits de paridad
    • Como resultado, los 246 bytes de datos se expanden a 288 bytes
  • El encabezado incluye varios campos
    • GameTimeSync y GameTimeBit transmiten bit a bit el valor del límite de tiempo del juego
    • ServiceID normalmente es 1 y podría estar relacionado con Express Games
    • FileID identifica de forma única cada archivo dentro de la imagen de juegos, y el menú siempre es el archivo 0
    • Address indica en qué parte de la RAM debe descargar el archivo el adaptador
    • También se incluyen HeaderCRC y Header Copy
  • La función InterLeave divide los paquetes en chunks de 450 bits y mezcla los bits de cada chunk
    • Parece un procesamiento destinado a distribuir de forma más uniforme los errores en ráfaga para que la corrección de errores funcione mejor
  • Este proceso se repite en grupos de 10 paquetes
    • 10 paquetes se agrupan en un frame de 2880 bytes
    • El frame se escribe en disco entrelazando los datos, como los primeros 2 bytes del paquete 0, los primeros 2 bytes del paquete 1, etc.
    • El mismo procesamiento continúa hasta que se genera todo el archivo de imagen

Decodificación y descompresión

  • Tras entender el funcionamiento de NSF, se escribió un programa decodificador que revierte el proceso en orden inverso
    • El decodificador extrae archivos de datos individuales desde la imagen
  • La primera salida del decodificador no era datos válidos de ROM de Genesis
    • La razón era que los datos de juego habían sido comprimidos antes de la transmisión
  • La herramienta de compresión de ROM era GAMEEDIT.EXE, dentro del CD de Foley Hi-Tech
    • No fue necesario volver a hacer ingeniería inversa de esa herramienta
    • El usuario de GitHub Octocontrabass ya había hecho ingeniería inversa del formato de compresión .SA
  • Con la herramienta unsa de Octocontrabass se descomprimieron los archivos .SA a archivos ROM estándar

Juegos y contenidos encontrados en la imagen de septiembre de 1996

  • El resultado más destacado fueron 2 juegos exclusivos de Sega Channel transmitidos en septiembre de 1996
    • Chessmaster: un juego de ajedrez presente en varias plataformas en los años 90, pero no en Genesis
    • Klondike: un juego de solitario encargado por Sega para Sega Channel y programado por David Crane, conocido por Pitfall
  • Los juegos dentro de la imagen se clasifican en varias categorías
    • Contenido exclusivo: Chessmaster, Klondike, Olympic Summer Games - Test Drive, Sega Channel Game Guide
    • Builds nuevas: Bugs Bunny in Double Trouble, OutRunners, Super Volleyball, World Series Baseball '96
    • Elementos que solo difieren de dumps existentes por el padding: Flashback, Phantasy Star II, The Punisher
    • Dumps existentes con una marca de agua agregada: Alex Kidd in the Enchanted Castle, Ecco - The Tides of Time, Sonic & Knuckles, etc.
    • Muchos juegos que coinciden con dumps existentes: Castlevania - Bloodlines, Streets of Rage 2, ToeJam & Earl, X-Men, Ys III, etc.
  • Black Squirrel, de Sonic Retro, encontró una forma de ejecutar el menú de septiembre de 1996 en un emulador
    • Consiste en copiar los bytes 0-0x1003FF de la ROM del cartucho demo de Sega Channel y agregar detrás los datos de menú de la imagen de juegos
    • La función de descarga no funciona, pero se puede explorar el menú
  • El último contenido eran ROM de descripciones de juegos
    • Parecían ROM normales de Genesis, pero al ejecutarlas en un emulador solo mostraban una pantalla negra
    • La causa era que no estaban enlazadas con base en la dirección 0 como un cartucho normal, sino con base en 0x100000
    • Parece que fueron creadas para ejecutarse directamente desde la memoria del adaptador de Sega Channel
    • Al agregar ceros después del encabezado para que el código quedara alineado con los vectores del encabezado, se ejecutaron en el emulador
    • Tras ejecutarse, aparecía un menú para desarrolladores donde se veían los nombres internos de cada juego
  • Con este proceso, todo el contenido del archivo de imagen de juegos quedó ejecutable en emuladores

Aún no hay comentarios.

Aún no hay comentarios.