NES版テトリス、ファミコン本体もカートリッジも無改造で「再プログラム」に成功

Image:tomeqs/Shutterstock.com

最近のダウンロードソフトと違い、かつてのファミコン(および海外版であるNES)用ROMカートリッジは、一度出荷された後は修正ができない。バグが入ったまま世に出てしまえば、そのバグはソフトに永遠に残り続けるはずだった。

しかし、NES版『TETRIS』がクラッシュする現象を利用して、未改造のハードウェアやカートリッジ上のソフトを「再プログラム」。それにより、新たな挙動をさせることに成功したハッカーが現れた。

過去にも『スーパーマリオワールド』にコントローラーを通じて改造コードを注入し、あり得ない動きをさせるハッキングに成功した事例はあった。これらはゲーム内の特定フレームに複雑なパターンを入力する必要があるため、人間には不可能であり、TAS(エミュレータによる自動操作)により実現していた

YouTubeチャンネルDisplaced Gamersが行ったハッキングは、前提条件が2つある。TETRISをキルスクリーン、つまり内部的にオーバーフロー等のエラーを起こさせてクラッシュさせること。もう1つは、日本の国内版ファミコンを使うことだ。

NES版テトリスの乗っ取りが可能なのは、ゲームのクラッシュ方法が特殊だからだ。ザックリ言えば、ゲーム内でスコアを計算するのに時間がかかりすぎるときに起こる。

それがフレーム間で間に合わない場合、制御コードの一部が新たなフレーム書き込みルーチンにより中断され、次の命令を探すためにRAMの意図しない部分にジャンプしてしまう。そこでゴミデータがコードとして読み込まれ、実行できないためクラッシュするわけだ。

そこで登場するのが、日本のファミコンである。NESとは異なり2つのコントローラが有線接続されていることに加えて、3つ目の拡張ポートが備わっている。ここに、サードパーティ製の追加コントローラが最大2つ(要アダプタ)接続できる仕組みだ。

たまたま、この追加コントローラ入力を処理するためNES版テトリスが使っているRAMの領域は、上述のジャンプルーチンのメモリ位置と一致していた。つまりクラッシュ時、その位置のRAMはコントローラが押したボタンのデータを保持していることになる。

これにより、プレイヤーはクラッシュが起こった後に処理するゲームコードの場所を正確に制御できる可能性がある。

今回のハッキングでは、3つ目のコントローラで上を押し続け、4つ目のコントローラーで右、左、下を押し続ける必要がある(少しハードを改造する必要あり)。そうすることで、ハイスコア一覧の名前とスコアを保持するRAMの領域にジャンプコードが送られ、直接操作できるRAM領域がさらに広くなる。

要するにハイスコアの数字と名前入力エリアを「コード化」している。前者の数字は10種類、後者で使える記号は43種類しかないが、その制約のなか意図通りのコード実行に成功。もっとも、ハイスコアの数字を変える方法は「プレイヤー自らが、実際にそのスコアを出す」以外にない。

さらにNES版テトリスにはバッテリーバックアップもないため、電源を入れるたび、スコアを手動で達成した上で、複雑な名前を入力する必要がある。またハイスコア表のスペースも限られているため、複雑なプログラムを注入する余地はあまりない。だが、Displaced Gamersはそれを巧みに回避する手法も編み出している。

そもそもの大前提である「NES版テトリスをクラッシュさせること」は至難のワザであり、今年初めに13歳少年が人類として初めて達成したことが全世界を騒がすニュースとなっていた。そんな不可能に近い「ゲームを倒す」ことが必須ではあるが、腕に覚えがある方はチャレンジしてみてはいかがだろう。

© 株式会社 音元出版