2 pontos por GN⁺ 2024-12-09 | Ainda não há comentários. | Compartilhar no WhatsApp
  • Graças ao CD de imagem de jogos do Sega Channel de setembro de 1996, revelado em 2024, passou a ser possível extrair de fato jogos e dados de menu de uma imagem de transmissão de cerca de 60 MB
  • O Sega Channel era um serviço por assinatura mensal que retransmitia repetidamente jogos de Genesis pela rede de TV a cabo, e o usuário jogava baixando o título desejado quando o adaptador o encontrava no loop contínuo de dados
  • A cadeia de criação da imagem passava por MENUMAKR, PKSPREAD e NSF, e a grande pista para a análise foi que o NSF.EXE, responsável pela codificação final, ainda continha símbolos de depuração
  • A restauração seguiu o fluxo de criar primeiro um programa em C que gerasse a mesma saída do NSF, depois separar os arquivos com um decodificador em ordem inversa e por fim descompactar os arquivos .SA para obter ROMs padrão de Genesis
  • Entre os conteúdos extraídos estavam os jogos exclusivos do Sega Channel Chessmaster e Klondike, novas builds, ROMs com marca d'água, além de ROMs de menu e de descrições dos jogos, todos em estado executável em emuladores

Contexto do serviço Sega Channel e dos arquivos de imagem

  • O Sega Channel foi um serviço de jogos sob demanda operado de junho de 1994 a junho de 1998
    • O lançamento nacional ocorreu em dezembro de 1994
    • Dependendo da operadora de TV a cabo, normalmente pagava-se entre US$ 10 e US$ 15 por mês para acessar uma biblioteca mensal de cerca de 50 jogos de Sega Genesis
    • O pico de assinantes do serviço ficou em torno de 250 mil pessoas
  • O assinante recebia um cartucho adaptador conectado ao Genesis, e esse adaptador era ligado ao cabo de TV
    • Ao iniciar, ele procurava o sinal do Sega Channel e baixava o menu de jogos
    • O download do menu normalmente levava cerca de 20 segundos
    • Ao selecionar um jogo, ele era baixado para a RAM do adaptador em cerca de 1 minuto
    • O jogo baixado funcionava como um cartucho de varejo comum
  • Ao desligar o aparelho ou pressionar o botão de menu do adaptador, o jogo baixado era apagado
    • Os dados de gravação eram mantidos desde que o usuário não baixasse outro jogo
  • O Sega Channel também incluía uma seção Test Drives além dos jogos de varejo
    • Nela era possível jogar versões com tempo limitado ou conteúdo restrito de jogos antes do lançamento
    • Também existiam jogos oferecidos apenas no Sega Channel

Como a imagem de transmissão era criada e entregue

  • A equipe do Sega Channel selecionava a line-up mensal de jogos e conteúdos como dicas, manuais, notícias e fanarts digitais
  • Depois disso, o conteúdo era enviado para a Foley Hi-Tech
    • A Foley Hi-Tech produzia os gráficos e animações do menu de jogos e inseria o conteúdo mensal
    • O resultado era um arquivo de imagem de jogos com cerca de 60 MB
  • A imagem de jogos era gravada em CD e enviada para a instalação de uplink via satélite em Denver, Colorado
    • O CD era instalado no computador servidor de jogos do uplink
    • O servidor retransmitia continuamente os dados dos jogos em loop via satélite
    • Os headends de TV a cabo por todo os Estados Unidos recebiam o sinal do satélite e o repassavam aos assinantes
  • Em um ambiente em que a operadora de TV a cabo não podia receber dados dos assinantes, a transmissão em loop contínuo definiu a forma de interação do serviço
    • Quando o usuário escolhia um jogo, o adaptador localizava os dados correspondentes no fluxo de dados do Sega Channel
  • A imagem de jogos de cerca de 60 MB era transmitida a aproximadamente 12 Mbps usando 2 portadoras de 6 Mbps
    • Se não houvesse problemas de sinal, o usuário conseguia jogar o título escolhido dentro de um ciclo do loop de dados
    • O menu tinha cópias duplicadas no fluxo de dados para permitir download mais rápido

Descoberta do CD de imagem de jogos de setembro de 1996

  • Em novembro de 2024, o usuário RisingFromRuins, do fórum Sonic Retro, encontrou o CD de imagem de jogos do Sega Channel de setembro de 1996 ao revisar um lote de equipamentos de PC comprado há muito tempo
  • Ele publicou fotos do CD e enviou uma cópia do arquivo de imagem de jogos do disco
  • O objetivo da análise era extrair os dados do arquivo de imagem para verificar se havia jogos exclusivos ou protótipos de jogos
  • No início, o arquivo de imagem foi examinado com um editor hexadecimal
    • Jogos de Genesis têm cabeçalhos ASCII padrão, e esperava-se que dicas de jogos e manuais baixáveis também pudessem ser lidos
    • Na prática, não apareciam strings legíveis no arquivo
    • Isso reforçou a possibilidade de o arquivo de imagem estar embaralhado ou criptografado

A cadeia de criação da imagem encontrada no CD de ferramentas de desenvolvimento

  • Uma pista importante veio de um CD de backup de materiais de desenvolvimento do Sega Channel da Foley Hi-Tech, divulgado em 2017 pelo usuário tdijital
    • Nesse CD já haviam sido identificados a versão de concurso de Primal Rage, um jogo de quiz do Sega Channel japonês e ROMs de demonstração de menu de dezembro de 1994 a janeiro de 1996
    • As próprias ferramentas de desenvolvimento, porém, ainda não haviam sido analisadas a fundo
  • Em vez de fazer engenharia reversa do código de download do lado do Genesis, foi escolhida a abordagem de fazer engenharia reversa das ferramentas que criavam a imagem de jogos
  • O fluxo de criação da imagem tinha três etapas
    • MENUMAKR: adicionava jogos, descrições, textos de notícias, arte, música etc. e gerava o binário de menu e o script MENUSPIN.BAT
    • PKSPREAD: programa feito pela Scientific Atlanta que validava o conteúdo de MENUSPIN.BAT e gerava PMAP.DAT
    • NSF: usava PMAP.DAT para codificar os arquivos de entrada e gerar o arquivo final de imagem de jogos
  • A Scientific Atlanta era uma empresa de equipamentos para TV a cabo que colaborou com a Sega na produção do equipamento de transmissão do Sega Channel e do cartucho adaptador
  • O principal alvo da análise foi o NSF.EXE, que gerava o arquivo de imagem final

Engenharia reversa do NSF.EXE

  • O NSF.EXE havia sido compilado em modo de depuração, com otimizações desativadas, e os símbolos também estavam incluídos no executável
    • Era um programa compilado com Borland C++ 4.1
    • Como o IDA Pro não reconheceu automaticamente os símbolos de depuração, eles foram consultados no Turbo Debugger e transferidos manualmente
  • Em vez de escrever imediatamente um decodificador, primeiro foi criado um programa equivalente ao NSF.EXE
    • Se fosse possível gerar uma saída idêntica byte a byte à imagem produzida pelo NSF.EXE do DOS, isso indicaria que o algoritmo havia sido entendido corretamente
    • Foi criada uma imagem de jogo de teste e a implementação foi ajustada até que a saída coincidisse
  • Depois de um dia de trabalho e vários fins de noite depurando, foi escrito um programa em C que produz a mesma saída do NSF.EXE
    • A implementação foi feita mantendo IDA e Visual Studio abertos ao mesmo tempo e tentando ficar o mais próximo possível do assembly
    • O objetivo não era reproduzir um binário compilado idêntico ao original
    • Como a implementação usa declarações em C99 e tipos de stdint.h, é possível que ela não compile diretamente no Borland C++ 4

O esquema de codificação de transmissão do NSF

  • A função GetData do NSF obtém de PMAP.DAT o arquivo de entrada por pacote, a posição dentro do arquivo e metadados do Sega Channel
    • Entre os metadados estão o ID do arquivo e o tempo jogável de demos com limite de tempo
    • Depois disso, ela lê blocos de 246 bytes do arquivo de dados
  • A função LoadFrame adiciona um cabeçalho à frente do pacote de dados e inverte todos os bytes de dados
    • A inversão de bytes pode ser um processamento relacionado à transmissão ou uma forma de ocultar o conteúdo do pacote
    • No meio dos dados do jogo são inseridos códigos de correção de erro BCH e bits de paridade
    • Como resultado, 246 bytes de dados se expandem para 288 bytes
  • O cabeçalho contém vários campos
    • GameTimeSync e GameTimeBit transmitem em nível de bit os valores de limitação de tempo do jogo
    • ServiceID normalmente é 1 e pode ter relação com Express Games
    • FileID identifica de forma única cada arquivo dentro da imagem de jogo, e o menu é sempre o arquivo 0
    • Address indica em que posição da RAM o adaptador deve baixar o arquivo
    • Também estão presentes HeaderCRC e Header Copy
  • A função InterLeave divide o pacote em blocos de 450 bits e embaralha os bits de cada bloco
    • Isso parece servir para distribuir de forma mais uniforme erros em rajada, ajudando a correção de erro a funcionar melhor
  • Esse processo se repete em unidades de 10 pacotes
    • Os 10 pacotes são agrupados em um frame de 2880 bytes
    • O frame é gravado em disco intercalando os dados, como os 2 primeiros bytes do pacote 0, depois os 2 primeiros bytes do pacote 1, e assim por diante
    • O mesmo procedimento continua até a geração do arquivo de imagem completo

Decodificação e descompressão

  • Depois de entender o funcionamento do NSF, foi escrito um programa decodificador que reverte o processo
    • O decodificador extrai os arquivos de dados individuais da imagem
  • A primeira saída do decodificador não era um conjunto válido de dados de ROM de Genesis
    • Isso acontecia porque os dados dos jogos estavam comprimidos antes da transmissão
  • A ferramenta de compressão de ROM era o GAMEEDIT.EXE presente no CD da Foley Hi-Tech
    • Não foi necessário fazer engenharia reversa dessa ferramenta também
    • O usuário do GitHub Octocontrabass já havia feito engenharia reversa do formato de compressão .SA
  • Os arquivos .SA foram descompactados para arquivos ROM padrão usando a ferramenta unsa de Octocontrabass

Jogos e conteúdos encontrados na imagem de setembro de 1996

  • O resultado mais chamativo foram dois jogos exclusivos do Sega Channel transmitidos em setembro de 1996
    • Chessmaster: um jogo de xadrez presente em várias plataformas nos anos 1990, mas não no Genesis
    • Klondike: um jogo de paciência encomendado pela Sega para o Sega Channel e programado por David Crane, conhecido por Pitfall
  • Os jogos dentro da imagem foram classificados em várias categorias
    • Conteúdo exclusivo: Chessmaster, Klondike, Olympic Summer Games - Test Drive, Sega Channel Game Guide
    • Novas builds: Bugs Bunny in Double Trouble, OutRunners, Super Volleyball, World Series Baseball '96
    • Itens que diferem de dumps existentes apenas no padding: Flashback, Phantasy Star II, The Punisher
    • Dumps existentes com marca d'água adicionada: Alex Kidd in the Enchanted Castle, Ecco - The Tides of Time, Sonic & Knuckles etc.
    • Muitos jogos idênticos a dumps já existentes: Castlevania - Bloodlines, Streets of Rage 2, ToeJam & Earl, X-Men, Ys III etc.
  • Black Squirrel, do Sonic Retro, encontrou uma forma de executar o menu de setembro de 1996 em um emulador
    • O método consiste em copiar os bytes 0-0x1003FF da ROM do cartucho de demonstração do Sega Channel e anexar em seguida os dados de menu da imagem de jogo
    • A função de download não funciona, mas o menu pode ser explorado
  • O último conteúdo era uma ROM de descrições dos jogos
    • Ela parecia uma ROM comum de Genesis, mas ao ser executada em um emulador mostrava apenas uma tela preta
    • O motivo era que ela havia sido vinculada com base em 0x100000, e não em 0 como um cartucho comum
    • Parece ter sido feita para rodar diretamente na memória do adaptador do Sega Channel
    • Ao adicionar zeros depois do cabeçalho para alinhar o código aos vetores do cabeçalho, ela passou a funcionar no emulador
    • Após a execução, surgia um menu de desenvolvedor mostrando os nomes internos de cada jogo
  • Com esse processo, tornou-se possível executar em emuladores todo o conteúdo do arquivo de imagem de jogos

Ainda não há comentários.

Ainda não há comentários.