2 điểm bởi GN⁺ 2024-12-09 | Chưa có bình luận nào. | Chia sẻ qua WhatsApp
  • Nhờ đĩa CD image game Sega Channel tháng 9/1996 được công bố vào năm 2024, giờ đây có thể thực sự trích xuất dữ liệu game và menu từ image phát sóng khoảng 60MB
  • Sega Channel là dịch vụ thuê bao tháng phát lặp lại các game Genesis qua mạng cáp, và người dùng chơi bằng cách để adapter tìm game mong muốn trong vòng lặp dữ liệu liên tục rồi tải xuống
  • Chuỗi tạo image gồm MENUMAKR, PKSPREAD và NSF; bước đột phá trong phân tích đến từ việc NSF.EXE vẫn còn symbol debug phụ trách mã hóa cuối cùng
  • Quá trình khôi phục được thực hiện bằng cách trước hết viết một chương trình C cho ra đầu ra giống hệt NSF, sau đó dùng decoder theo chiều ngược để tách file và giải nén nén .SA để thu được ROM Genesis tiêu chuẩn
  • Nội dung được trích xuất bao gồm các game độc quyền của Sega Channel như ChessmasterKlondike, các bản build mới, ROM có gắn watermark, cùng ROM menu và ROM mô tả game; tất cả đều đã có thể chạy trong emulator

Bối cảnh dịch vụ Sega Channel và file image

  • Sega Channel là dịch vụ game on-demand hoạt động từ tháng 6/1994 đến tháng 6/1998
    • Bản phát hành toàn quốc diễn ra vào tháng 12/1994
    • Tùy nhà cung cấp cáp, người dùng thường trả khoảng 10–15 USD mỗi tháng để truy cập thư viện khoảng 50 game Sega Genesis mỗi tháng
    • Số thuê bao cao nhất của dịch vụ vào khoảng 250.000 người
  • Người đăng ký nhận một băng adapter kết nối với Genesis, và adapter này nối vào dây truyền hình cáp
    • Khi khởi động, nó tìm tín hiệu Sega Channel và tải menu game
    • Việc tải menu thường mất khoảng 20 giây
    • Khi chọn game, game sẽ được tải vào RAM của adapter trong khoảng 1 phút
    • Game đã tải hoạt động như một băng game bán lẻ thông thường
  • Khi tắt nguồn hoặc nhấn nút menu trên adapter, game đã tải sẽ bị xóa
    • Dữ liệu lưu vẫn được giữ lại miễn là người dùng không tải game khác
  • Ngoài game bán lẻ, Sega Channel còn có mục Test Drives
    • Người dùng có thể chơi các phiên bản giới hạn thời gian hoặc giới hạn nội dung của game trước khi phát hành
    • Cũng có những game chỉ được cung cấp trên Sega Channel

Cách image phát sóng được tạo và phân phối

  • Nhân viên Sega Channel chọn lineup game hàng tháng và các nội dung như mẹo chơi, hướng dẫn, tin tức, fanart số
  • Sau đó nội dung được chuyển cho Foley Hi-Tech
    • Foley Hi-Tech tạo đồ họa và hoạt ảnh cho menu game, rồi chèn nội dung hàng tháng
    • Kết quả là một file image game có kích thước khoảng 60MB
  • Image game được ghi ra CD và gửi tới cơ sở uplink vệ tinh ở Denver, Colorado
    • CD được lắp vào máy chủ game uplink
    • Máy chủ liên tục phát dữ liệu game theo vòng lặp qua vệ tinh
    • Các cable headend trên khắp nước Mỹ nhận tín hiệu vệ tinh rồi chuyển tiếp cho thuê bao
  • Trong môi trường mà nhà cung cấp truyền hình cáp không thể nhận dữ liệu từ phía thuê bao, phát vòng lặp liên tục đã quyết định cách dịch vụ tương tác
    • Khi người dùng chọn game, adapter sẽ tìm đúng dữ liệu game đó trong luồng dữ liệu Sega Channel
  • Image game khoảng 60MB được truyền ở khoảng 12Mbps bằng 2 carrier 6Mbps
    • Nếu không có vấn đề tín hiệu, người dùng có thể chơi game đã chọn trong một vòng lặp dữ liệu
    • Menu có các bản sao lặp lại trong luồng dữ liệu để tải nhanh hơn

Phát hiện đĩa CD image game tháng 9/1996

  • Vào tháng 11/2024, người dùng diễn đàn Sonic Retro RisingFromRuins khi kiểm tra một đống thiết bị PC đã mua từ lâu đã phát hiện đĩa CD image game Sega Channel tháng 9/1996
  • Anh đăng ảnh CD và tải lên bản sao file image game trên đĩa
  • Mục tiêu phân tích là trích xuất dữ liệu từ file image để xác định xem có game độc quyền hay game prototype nào hay không
  • Ban đầu file image được kiểm tra bằng hex editor
    • Các game Genesis có header ASCII tiêu chuẩn, và dự kiến cả mẹo game lẫn hướng dẫn tải xuống cũng có thể đọc được
    • Nhưng trong file thực tế không thấy chuỗi ký tự nào có thể đọc được
    • Điều đó làm tăng khả năng file image đã bị scramble hoặc mã hóa

Chuỗi tạo image được tìm thấy từ CD công cụ phát triển

  • Một đầu mối quan trọng là vào năm 2017, người dùng tdijital đã công bố đĩa CD sao lưu tài liệu phát triển Sega Channel của Foley Hi-Tech
    • Trên CD này từng xác nhận được bản contest của Primal Rage, game đố vui Sega Channel bản Nhật và các ROM demo menu từ tháng 12/1994 đến tháng 1/1996
    • Tuy vậy, bản thân các công cụ phát triển vẫn chưa được phân tích sâu
  • Thay vì reverse engineer mã tải xuống ở phía Genesis, hướng tiếp cận được chọn là reverse engineer các công cụ tạo ra image game
  • Quy trình tạo image gồm ba bước
    • MENUMAKR: thêm game, mô tả, tin tức, art, nhạc... để tạo binary menu và file script MENUSPIN.BAT
    • PKSPREAD: chương trình do Scientific Atlanta tạo ra, dùng để kiểm tra nội dung MENUSPIN.BAT và xuất PMAP.DAT
    • NSF: dùng PMAP.DAT để mã hóa các file đầu vào và tạo file image game cuối cùng
  • Scientific Atlanta là công ty thiết bị cáp đã hợp tác với Sega trong việc sản xuất thiết bị phát sóng Sega Channel và băng adapter
  • Đối tượng phân tích trọng tâm là NSF.EXE, chương trình tạo file image cuối cùng

Reverse engineering NSF.EXE

  • NSF.EXE được biên dịch ở chế độ debug, tắt tối ưu hóa và vẫn chứa symbol trong file thực thi
    • Đây là chương trình được biên dịch bằng Borland C++ 4.1
    • IDA Pro không tự nhận diện symbol debug, nên phải xem symbol trong Turbo Debugger rồi chuyển thủ công
  • Thay vì viết decoder ngay, trước hết đã viết một chương trình tương đương với NSF.EXE
    • Nếu có thể tạo ra đầu ra giống hệt từng byte với image do DOS NSF.EXE tạo ra, có thể coi là đã hiểu đúng thuật toán
    • Một file image game thử nghiệm được tạo để hiện thực khớp đầu ra
  • Sau một ngày làm việc và vài buổi tối debug, tác giả đã viết được chương trình C cho ra đầu ra giống NSF.EXE
    • Cách làm là mở đồng thời IDA và Visual Studio, rồi hiện thực sao cho bám sát assembly nhất có thể
    • Mục tiêu không phải tạo ra binary biên dịch giống hệt bản gốc
    • Việc hiện thực dùng khai báo C99 và kiểu stdint.h, nên có thể sẽ không biên dịch nguyên trạng bằng Borland C++ 4

Cách mã hóa truyền dẫn của NSF

  • Hàm GetData của NSF lấy từ PMAP.DAT file đầu vào cho từng packet, vị trí trong file và metadata Sega Channel
    • Metadata bao gồm ID file và thời lượng chơi của các bản demo giới hạn thời gian
    • Sau đó nó đọc các chunk 246 byte từ file dữ liệu
  • Hàm LoadFrame gắn header vào trước packet dữ liệu và đảo tất cả các byte dữ liệu
    • Việc đảo byte có thể là xử lý phục vụ truyền dữ liệu hoặc để che nội dung packet
    • Ở giữa dữ liệu game có chèn mã sửa lỗi BCH và bit parity
    • Kết quả là dữ liệu 246 byte được mở rộng thành 288 byte
  • Header chứa nhiều trường
    • GameTimeSyncGameTimeBit truyền giá trị giới hạn thời gian chơi ở mức bit
    • ServiceID thường là 1 và có thể liên quan đến Express Games
    • FileID định danh duy nhất từng file trong image game, và menu luôn là file 0
    • Address cho biết adapter sẽ tải file vào vị trí nào trong RAM
    • Cũng có HeaderCRCHeader Copy
  • Hàm InterLeave chia packet thành các chunk 450 bit rồi xáo trộn các bit trong từng chunk
    • Có vẻ đây là xử lý nhằm phân tán đều hơn các burst error để cơ chế sửa lỗi hoạt động tốt hơn
  • Quá trình này lặp theo đơn vị 10 packet
    • 10 packet được gom thành frame 2880 byte
    • Frame được ghi ra đĩa bằng cách đan dữ liệu như 2 byte đầu của packet 0, rồi 2 byte đầu của packet 1, v.v.
    • Cùng cách đó tiếp tục cho đến khi toàn bộ file image được tạo xong

Giải mã và giải nén

  • Sau khi hiểu được cách NSF hoạt động, tác giả đã viết chương trình decoder để đảo ngược quá trình
    • Decoder trích xuất các file dữ liệu riêng lẻ từ image
  • Đầu ra đầu tiên của decoder không phải dữ liệu ROM Genesis hợp lệ
    • Lý do là dữ liệu game đã được nén trước khi truyền
  • Công cụ nén ROM là GAMEEDIT.EXE trong CD của Foley Hi-Tech
    • Không cần phải reverse engineer lại chính công cụ này
    • Người dùng GitHub Octocontrabass trước đó đã reverse engineer định dạng nén .SA
  • Dùng công cụ unsa của Octocontrabass để giải nén file .SA thành file ROM tiêu chuẩn

Các game và nội dung tìm thấy trong image tháng 9/1996

  • Kết quả nổi bật nhất là 2 game độc quyền của Sega Channel được phát trong tháng 9/1996
    • Chessmaster: game cờ vua từng có trên nhiều nền tảng trong thập niên 1990 nhưng không có trên Genesis
    • Klondike: game solitaire do Sega đặt làm riêng cho Sega Channel và được lập trình bởi David Crane, người nổi tiếng với Pitfall
  • Các game trong image được chia thành nhiều nhóm
    • Nội dung độc quyền: Chessmaster, Klondike, Olympic Summer Games - Test Drive, Sega Channel Game Guide
    • Bản build mới: Bugs Bunny in Double Trouble, OutRunners, Super Volleyball, World Series Baseball '96
    • Mục chỉ khác các bản dump hiện có ở phần padding: Flashback, Phantasy Star II, The Punisher
    • Bản dump hiện có được thêm watermark: Alex Kidd in the Enchanted Castle, Ecco - The Tides of Time, Sonic & Knuckles...
    • Nhiều game trùng khớp với các bản dump hiện có: Castlevania - Bloodlines, Streets of Rage 2, ToeJam & Earl, X-Men, Ys III...
  • Black Squirrel của Sonic Retro đã tìm ra cách chạy menu tháng 9/1996 trong emulator
    • Cách làm là sao chép các byte 0-0x1003FF từ ROM băng demo Sega Channel, rồi nối dữ liệu menu của image game vào phía sau
    • Chức năng tải xuống không hoạt động, nhưng vẫn có thể duyệt menu
  • Nội dung cuối cùng là ROM mô tả game
    • Nó trông như một ROM Genesis thông thường, nhưng khi chạy trong emulator chỉ hiện màn hình đen
    • Nguyên nhân là nó không được link với địa chỉ gốc 0 như băng game thông thường, mà theo mốc 0x100000
    • Có vẻ nó được tạo ra để chạy trực tiếp trong bộ nhớ adapter của Sega Channel
    • Khi thêm số 0 sau header để mã căn chỉnh với vector của header, ROM này đã chạy được trong emulator
    • Sau khi chạy, nó hiển thị menu dành cho nhà phát triển với tên nội bộ của từng game
  • Qua quá trình này, toàn bộ nội dung trong file image game cuối cùng đã có thể chạy được trong emulator

Chưa có bình luận nào.

Chưa có bình luận nào.