Sega Channel oyun imajı dosya biçiminin tersine mühendisliği
(infochunk.com)- 2024’te kamuya açılan Eylül 1996 Sega Channel oyun imajı CD’si sayesinde, yaklaşık 60 MB’lık yayın imajından oyun ve menü verilerini gerçekten çıkarmak mümkün oldu
- Sega Channel, Genesis oyunlarını kablo ağı üzerinden döngü halinde tekrar tekrar yayınlayan aylık abonelikli bir hizmetti; kullanıcılar, adaptörün sürekli veri döngüsü içinde istedikleri oyunu bulup indirmesiyle oynuyordu
- İmaj oluşturma zinciri MENUMAKR, PKSPREAD ve NSF’ten oluşuyordu; son kodlamayı yapan NSF.EXE’de debug sembollerinin kalmış olması analiz için bir dönüm noktası oldu
- Geri yükleme, NSF ile aynı çıktıyı üreten bir C programı yazıldıktan sonra ters yönde çalışan bir decoder ile dosyaların ayrılması ve standart Genesis ROM elde etmek için .SA sıkıştırmasının açılması akışıyla ilerledi
- Çıkarılan içerikler arasında Sega Channel’a özel Chessmaster ve Klondike oyunları, yeni build’ler, watermark eklenmiş ROM’lar, menü ve oyun açıklaması ROM’ları vardı; hepsi emülatörde çalıştırılabilir hale geldi
Sega Channel hizmetinin ve imaj dosyasının arka planı
- Sega Channel, Haziran 1994’ten Haziran 1998’e kadar işletilen bir isteğe bağlı oyun hizmetiydi
- Ülke çapında lansmanı Aralık 1994’te yapıldı
- Kablo operatörüne bağlı olarak genellikle aylık 10-15 dolar karşılığında her ay yaklaşık 50 Sega Genesis oyunu içeren bir kütüphaneye erişilebiliyordu
- Hizmetin ulaştığı en yüksek abone sayısı yaklaşık 250 bin düzeyindeydi
- Abonelere Genesis’e takılan bir adaptör kartuşu veriliyor, bu adaptör de kablo TV hattına bağlanıyordu
- Açılışta Sega Channel sinyalini arıyor ve oyun menüsünü indiriyordu
- Menü indirme işlemi genellikle yaklaşık 20 saniye sürüyordu
- Bir oyun seçildiğinde oyun yaklaşık 1 dakika içinde adaptör RAM’ine indiriliyordu
- İndirilen oyun, normal perakende kartuş gibi çalışıyordu
- Güç kapatıldığında veya adaptördeki menü düğmesine basıldığında indirilen oyun siliniyordu
- Kayıt verileri, kullanıcı başka bir oyun indirmediği sürece korunuyordu
- Sega Channel’da perakende oyunların yanı sıra Test Drives bölümü de vardı
- Çıkış öncesi oyunların süre sınırlı veya içerik sınırlı sürümleri oynanabiliyordu
- Yalnızca Sega Channel’da sunulan oyunlar da bulunuyordu
Yayın imajının oluşturulma ve iletilme biçimi
- Sega Channel çalışanları aylık oyun listesini; oyun ipuçları, kılavuzlar, haberler ve dijital fan art gibi içerikleri seçiyordu
- Ardından içerikler Foley Hi-Tech’e iletiliyordu
- Foley Hi-Tech oyun menüsü grafiklerini ve animasyonlarını hazırlıyor, aylık içeriği ekliyordu
- Ortaya çıkan sonuç yaklaşık 60 MB boyutunda bir oyun imajı dosyasıydı
- Oyun imajı CD’ye yazılıyor ve Colorado Denver’daki uydu uplink tesisine gönderiliyordu
- CD, uplink oyun sunucusu bilgisayarına kuruluyordu
- Sunucu oyun verilerini uydu üzerinden sürekli döngü halinde yayınlıyordu
- ABD genelindeki kablo headend’leri uydu sinyalini alıp abonelere aktarıyordu
- Kablo TV operatörlerinin abonelerden veri alamadığı bir ortamda, hizmetin etkileşim biçimini sürekli döngü yayını belirliyordu
- Kullanıcı bir oyun seçtiğinde adaptör, Sega Channel veri akışı içinde ilgili oyun verisini buluyordu
- Yaklaşık 60 MB’lık oyun imajı, 2 adet 6 Mbps carrier kullanılarak yaklaşık 12 Mbps hızla iletiliyordu
- Sinyal sorunu yoksa kullanıcı seçtiği oyunu tek bir veri döngüsü içinde oynayabiliyordu
- Daha hızlı indirilebilmesi için menünün yinelenen kopyaları veri akışına ekleniyordu
Eylül 1996 oyun imajı CD’sinin bulunması
- Kasım 2024’te Sonic Retro forum kullanıcısı RisingFromRuins, uzun süre önce satın aldığı PC ekipmanı yığınını incelerken Eylül 1996 Sega Channel oyun imajı CD’sini buldu
- CD’nin fotoğraflarını paylaştı ve diskteki oyun imajı dosyasının bir kopyasını yükledi
- Analizin amacı, imaj dosyasından verileri çıkararak özel oyun veya prototip oyun olup olmadığını kontrol etmekti
- İlk olarak imaj dosyası bir hex editor ile incelendi
- Genesis oyunlarında standart ASCII header bulunduğu, oyun ipuçları ve indirilebilir kılavuzların da okunabilir olacağı tahmin ediliyordu
- Gerçek dosyada okunabilir string görünmüyordu
- İmaj dosyasının scramble edilmiş veya şifrelenmiş olma ihtimali güçlendi
Geliştirme aracı CD’sinde bulunan imaj oluşturma zinciri
- 2017’de kullanıcı tdijital’in Foley Hi-Tech’e ait Sega Channel geliştirme materyalleri yedek CD’sini yayımlaması önemli bir ipucu oldu
- Bu CD’de Primal Rage yarışma sürümü, Japonya sürümü Sega Channel quiz oyunu, Aralık 1994-Ocak 1996 menü demo ROM’ları gibi içerikler daha önce tespit edilmişti
- Geliştirme araçlarının kendisi ise derinlemesine analiz edilmemişti
- Genesis tarafındaki indirme kodunu tersine mühendislik etmek yerine, oyun imajını oluşturan araçları tersine mühendislik etme yaklaşımı seçildi
- İmaj oluşturma akışı üç aşamadan oluşuyordu
- MENUMAKR: Oyunları, açıklamaları, haber metinlerini, görselleri, müziği vb. ekleyerek menü binary’sini ve
MENUSPIN.BATscript dosyasını oluşturuyordu - PKSPREAD: Scientific Atlanta tarafından yapılmış bir programdı;
MENUSPIN.BATiçeriğini doğruluyor vePMAP.DATçıktısı üretiyordu - NSF:
PMAP.DATkullanarak giriş dosyalarını encode ediyor ve nihai oyun imajı dosyasını oluşturuyordu
- MENUMAKR: Oyunları, açıklamaları, haber metinlerini, görselleri, müziği vb. ekleyerek menü binary’sini ve
- Scientific Atlanta, Sega Channel yayın ekipmanları ve kartuş adaptörü üretiminde Sega ile çalışan bir kablo ekipmanı şirketiydi
- Analizin ana hedefi, nihai imaj dosyasını oluşturan NSF.EXE idi
NSF.EXE tersine mühendisliği
- NSF.EXE debug modunda derlenmişti, optimizasyon kapalıydı ve semboller executable içine dahil edilmişti
- Program Borland C++ 4.1 ile derlenmişti
- IDA Pro debug sembollerini otomatik tanımadığı için semboller Turbo Debugger’da kontrol edilip elle taşındı
- Doğrudan decoder yazmak yerine önce NSF.EXE’ye eşdeğer bir program yazıldı
- DOS NSF.EXE’nin ürettiği imajla byte düzeyinde aynı çıktıyı üretebiliyorsa algoritmanın doğru anlaşıldığı kabul edilebilirdi
- Bir test oyun imajı dosyası oluşturuldu ve çıktı eşleşecek şekilde implemente edildi
- Bir günlük çalışma ve birkaç akşamlık debugging sonunda NSF.EXE ile aynı çıktıyı veren bir C programı yazıldı
- IDA ve Visual Studio birlikte açık tutularak assembly’ye olabildiğince yakın uyarlama yöntemi izlendi
- Orijinalle aynı derlenmiş binary’yi oluşturmak hedeflenmedi
- Implementasyonda C99 deklarasyonları ve
stdint.htipleri kullanıldığı için Borland C++ 4’te olduğu gibi derlenmeyebilir
NSF’nin iletim için kullandığı encoding yöntemi
- NSF’nin
GetDatafonksiyonuPMAP.DATiçinden paket başına giriş dosyasını, dosya içi konumu ve Sega Channel metadata’sını alıyordu- Metadata; dosya ID’si ve süre sınırlı demolarda oynanabilir süre gibi bilgileri içeriyordu
- Ardından veri dosyasından 246 byte’lık chunk okuyordu
LoadFramefonksiyonu veri paketinin başına header ekliyor ve tüm veri byte’larını ters çeviriyordu- Byte inversion, veri iletimiyle ilgili bir işlem veya paket içeriğini gizlemeye yönelik bir işlem olabilir
- Oyun verisinin ortasına BCH hata düzeltme kodu ve parity bit’leri ekleniyordu
- Bunun sonucunda 246 byte veri 288 byte’a genişliyordu
- Header’da çeşitli alanlar yer alıyordu
GameTimeSyncveGameTimeBit, oyun süre sınırı değerini bit düzeyinde iletiyorduServiceIDgenellikle 1’di ve Express Games ile ilişkili olma ihtimali vardıFileID, oyun imajı içindeki her dosyayı benzersiz biçimde tanımlıyordu; menü her zaman dosya 0’dıAddress, adaptörün dosyayı RAM’de nereye indireceğini gösteriyorduHeaderCRCveHeader Copyde dahildi
InterLeavefonksiyonu paketleri 450 bit’lik chunk’lara ayırıyor ve her chunk’ın bit’lerini karıştırıyordu- Bunun burst hatalarını daha dengeli dağıtarak hata düzeltmenin iyi çalışmasını sağlamaya yönelik bir işlem olduğu düşünülüyor
- Bu süreç 10 paketlik birimler halinde tekrarlanıyordu
- 10 paket 2880 byte’lık frame olarak gruplanıyordu
- Frame, paket 0’ın ilk 2 byte’ı, paket 1’in ilk 2 byte’ı şeklinde verileri ördükten sonra diske yazılıyordu
- Aynı işlem tüm imaj dosyası oluşturulana kadar sürüyordu
Decode etme ve sıkıştırmayı açma
- NSF’nin davranışı anlaşıldıktan sonra, süreci ters yönde geri alan bir decoder programı yazıldı
- Decoder, imajdan tekil veri dosyalarını çıkarıyordu
- Decoder’ın ilk çıktısı geçerli Genesis ROM verisi değildi
- Çünkü oyun verisi iletimden önce sıkıştırılmıştı
- ROM sıkıştırma aracı Foley Hi-Tech CD’sindeki
GAMEEDIT.EXEidi- Bu aracın kendisini yeniden tersine mühendislik etmeye gerek kalmadı
- GitHub kullanıcısı Octocontrabass, .SA sıkıştırma biçimini zaten tersine mühendislik etmişti
- Octocontrabass’ın
unsaaracıyla.SAdosyalarının sıkıştırması açılarak standart ROM dosyaları elde edildi
Eylül 1996 imajından çıkan oyunlar ve içerikler
- En dikkat çekici sonuç, Eylül 1996’da yayınlanan Sega Channel’a özel 2 oyun oldu
- Chessmaster: 1990’larda birçok platformda bulunan, ancak Genesis’te olmayan satranç oyunu
- Klondike: Sega’nın Sega Channel için sipariş ettiği ve Pitfall ile bilinen David Crane’in programladığı solitaire oyunu
- İmaj içindeki oyunlar birkaç kategoriye ayrıldı
- Özel içerik: Chessmaster, Klondike, Olympic Summer Games - Test Drive, Sega Channel Game Guide
- Yeni build’ler: Bugs Bunny in Double Trouble, OutRunners, Super Volleyball, World Series Baseball '96
- Mevcut dump’lardan yalnızca padding bakımından farklı olanlar: Flashback, Phantasy Star II, The Punisher
- Watermark eklenmiş mevcut dump’lar: Alex Kidd in the Enchanted Castle, Ecco - The Tides of Time, Sonic & Knuckles vb.
- Mevcut dump’larla eşleşen çok sayıda oyun: Castlevania - Bloodlines, Streets of Rage 2, ToeJam & Earl, X-Men, Ys III vb.
- Sonic Retro’dan Black Squirrel, Eylül 1996 menüsünü emülatörde çalıştırmanın bir yolunu buldu
- Sega Channel demo kartuş ROM’unun
0-0x1003FFbyte’larını kopyalayıp oyun imajının menü verisini arkasına ekleme yöntemiydi - İndirme işlevi çalışmıyor, ancak menü gezilebiliyordu
- Sega Channel demo kartuş ROM’unun
- Son içerik oyun açıklaması ROM’u idi
- Normal bir Genesis ROM gibi görünüyordu, fakat emülatörde çalıştırıldığında yalnızca siyah ekran gösteriyordu
- Nedeni, normal kartuş gibi adres 0 baz alınarak değil, 0x100000 baz alınarak link edilmiş olmasıydı
- Sega Channel adaptör belleğinden doğrudan çalıştırılmak üzere yapılmış gibi görünüyordu
- Header’ın arkasına sıfırlar eklenip kodun header’daki vector’larla hizalanması sağlanınca emülatörde çalıştı
- Çalıştırıldıktan sonra her oyunun dahili adının görülebildiği geliştirici menüsü belirdi
- Bu süreç sonucunda oyun imajı dosyasındaki tüm içerikler emülatörde çalıştırılabilir hale geldi
Henüz yorum yok.