3 ポイント 投稿者 GN⁺ 2024-05-09 | 1件のコメント | WhatsAppで共有

NES版Tetrisで新たなコード実行方法が発見

  • ハッカーたちが、ゲーム内でNES版Tetrisを再プログラムする方法を発見
  • この方法は、ゲーム終了時のクラッシュを避けたいハイスコア挑戦者に役立つ可能性がある

コード実行の方法

  • NES版Tetrisの"kill screen"を利用し、メモリを操作する複雑な手法によって、未改造のハードウェアとカートリッジで動作するTetrisのバージョンに新しい挙動をコーディングできる
  • Super Mario World、Paper Mario、The Legend of Zelda: Ocarina of Time などのゲームでも、同様の"任意コード実行"グリッチが見つかっている
  • NES版Tetrisに外部コードを導入する基本的な方法は、少なくとも2021年から公に理論化されていた
  • この方法は、Tetrisのハイスコアテーブルを機械語コード命令として読み始める手順を詳しく説明している

コントローラーポートを使った仕組み

  • NES版Tetrisのクラッシュは、ゲームのスコア処理ルーチンがフレーム間で新しいスコアを計算するのに時間がかかりすぎると発生する
  • この遅延が起きると、制御コードの一部が新しいフレーム書き込みルーチンによって中断され、意図しないRAM領域へジャンプして次の命令を探すことになる
  • 日本版コンソールであるファミコン上で動作する際、Tetrisが潜在的な入力を処理する方法のおかげで、プレイヤーはこのジャンプを操作できる

ハイスコアテーブルでコーディングする

  • Displaced Gamers のジャンプ制御手法では、プレイヤーは3つ目のコントローラーで「上」を、4つ目のコントローラーで右、左、下を押し続ける必要がある
  • これにより、ジャンプコードはゲームのハイスコア一覧の名前とスコアを保存するRAM領域へ送られ、プレイヤーが直接操作できるより大きなRAM領域が得られる
  • ハイスコアテーブルの対象部分に"(G"を入れると、ゲームはハイスコアテーブルの別の領域へジャンプするよう強制される
  • ここで名前とスコアが、NES CPU向けのopcodeとして順番に読み込まれ始める
  • ただし、名前入力領域で使える記号は43個、ハイスコアの一部にできる数字は10個しかないため、利用可能なNESのopcode命令のうち一部しかハイスコアテーブルに"コーディング"できない
  • バッテリーバックアップの保存システムがないため、ハッカーはTetrisを起動するたびに、これらのハイスコアを手動で達成し、複雑な名前を入力しなければならない

GN⁺の見解

  • NES版Tetrisにこのような隠れた挙動があったというのは驚きだ。当時は発見されなかったようで、数十年たった今になって見つかった点が実に興味深い。
  • ファミコンの拡張ポートを活用してこの種のハックが可能だったという点も面白い。任天堂が意図した機能ではないだろうが、NESと比べて機能が豊富なファミコンの特徴が表れているように思える。
  • こうしたバグを利用して、逆にクラッシュを防ぐコードを書き込むという発想も実に巧妙だ。理論上はゲームプレイを継続できるため、ハイスコア挑戦には大きな助けになりそうだ。
  • ただし、この方法を使うにはゲームを始めるたびに複雑な設定が必要になるため、不便そうではある。実際に使うなら、もう少し自動化する方法が必要かもしれない。
  • おそらくこの方法は、普通にゲームを楽しみたい一般ユーザーよりも、ハイスコアに挑戦する愛好家やプログラミングに関心のある人々に訴求しそうだ。広く普及するのは難しそうに見える。

1件のコメント

 
GN⁺ 2024-05-09
Hacker Newsの意見

要約:

  • Strossの小説『Accelerando』に出てくる、「時空の構造をハックしてその下にあるものを見つけ出すこと」が究極のハッキングの目標だという一節を、このエクスプロイトが思い起こさせる。
  • 実用的な目的などまったくなく、ただ面白いからという理由で何かをするハッカー精神を自分が持ち合わせていないことを恥ずかしく思う。
  • NESカートリッジはROMから動作するが、このエクスプロイトではCPUを、ハイスコアテーブルの保存に使われるRAMへジャンプさせている。
  • 誰かがテトリス上でDoomを動かすまでに、どれくらいかかるのだろうと思う。
  • Factorioの中でベルトを使って巨大なコンピュータを作り、セグメンテーションフォルトを起こしてゲームから脱出したくなる。
  • 時間を実にうまく無駄にしたと思う。
  • 古いゲームでACEが発見されるのはとても興味深い。数年前にスーパーマリオワールドでこれを見て、どうしてそんなことが可能なのかに取り憑かれた。
  • 本当に頭のいい人たちが、完全に役に立たないことに大量の時間と労力を注ぎ込むのは素晴らしい。
  • NES版テトリスにコードを注入すること自体には今のところ理由がないかもしれないが、それが本質ではない。何が可能なのか、古いコードや原始的なコンピュータに何をさせられるのかを突き止めることがポイントだ。
  • テトリスがここまで長い間破られなかったことに驚く。これは、ゲームのエンディングやクレジットをできるだけ早く表示させることを目指す、新時代のany%ランの到来を予感させる。
  • 『オカリナ・オブ・タイム』には何年も前からACEエクスプロイトがあった。ゲームメモリを操作し、特定の入口ワープを編集することで、わずか数分で「クリア」できるほど完全に壊されていた。
  • 最も驚くべきなのは、人々がわずかなボタンとアナログスティックだけを使って、手作業でメモリを編集していることだ。
  • 任意コード実行が可能になること自体のほうが、その後で何をするかより常に面白い。
  • ゲームを逆アセンブルして、これらすべてをいつどこで行うのか、その次の命令を入力するためにどこを操作できるのかを突き止めるのは、尊敬に値するレベルの献身だ。
  • 2024年にNES/SNESに時間を費やすのは、任天堂が子どもたちに非倫理的な精神支配や心理的トリックを使ってきた証拠だと感じる。
  • この人たちには才能があり、このプロジェクトを選んだことに合理的な理由はなさそうに見える。