萌えハッカーニュースリーダー

2025/04/10 20:31 Spoofing a Pokemon Trade

出典: https://blog.nitwhiz.xyz/posts/002-pokemon-red-trade/
hakase
博士

やっほー、ロボ子!今日はポケモン赤の通信解析の話じゃ。

roboko
ロボ子

博士、こんにちは。ポケモン赤ですか、懐かしいですね。どんな解析が行われたんですか?

hakase
博士

今回の目的は、ゲームボーイのシリアルケーブル通信を解析して、不正なポケモン交換を可能にすることじゃ!

roboko
ロボ子

不正なポケモン交換ですか!それは少し倫理的に問題があるような…。

hakase
博士

まあまあ、ロボ子。あくまで技術的な探求じゃから。エミュレータはSameBoy、開発言語はGoを使ったらしいぞ。

roboko
ロボ子

SameBoyはC言語で書かれたエミュレータですね。Go言語で通信部分を実装したんですね。どのようにシリアル通信を処理したんですか?

hakase
博士

SameBoyのAPI、`GB_set_serial_transfer_bit_start_callback`と`GB_set_serial_transfer_bit_end_callback`を使って、ビット単位でデータ送受信を処理したらしいぞ。ゲームボーイはシリアルポートでデータの送受信を同時に行うからの。

roboko
ロボ子

ビット単位での処理ですか、大変そうですね。通信プロトコルはどのようになっているんですか?

hakase
博士

まず、リーダーとフォロワーを決めるんじゃ。90フレーム以内に0x01か0x02を受信しないと、ゲームが0x01を送ってリーダーになる。スプーフィングでは、常に0x02を送ってフォロワーになるらしい。

roboko
ロボ子

なるほど。リーダーが乱数シードを送って、トレードブロックを交換するんですね。トレードブロックって、具体的にどんなデータが入っているんですか?

hakase
博士

415バイトのデータで、プレイヤーのパーティ情報が入ってる。データ構造は「Pokémon Data Structure (Generation I)」に準拠してるらしいぞ。

roboko
ロボ子

パーティ情報ですか。ポケモンの種類やレベル、技とかでしょうか。

hakase
博士

そうそう!で、トレードブロックの中に0xFEがあると問題が起きるから、パッチリストを使うんじゃ。

roboko
ロボ子

0xFEですか?なぜ問題になるんですか?

hakase
博士

シリアルケーブルが繋がってない時、0xFEが読み込まれる傾向があるから、それを回避するためらしいぞ。パッチリストは0xFEがある場所のインデックスを記録して、受信側で0xFFに置き換えるんじゃ。

roboko
ロボ子

なるほど、0xFEを避けるための工夫ですね。Go言語では、どのように実装したんですか?

hakase
博士

`binary.Read`と`binary.Write`を使って、バイトデータとGoのデータ構造を相互に変換したらしいぞ。構造体とメソッドを定義して、データのマーシャリング/アンマーシャリング、パッチリストの作成/適用を行ったみたいじゃ。

roboko
ロボ子

`binary.Read`と`binary.Write`は便利ですよね。エンディアンも考慮する必要があったんですね。

hakase
博士

そう!ポケモン第一世代のゲームで使われるカスタムエンコーディングや、ビッグエンディアンにも対応する必要があったみたいじゃ。

roboko
ロボ子

色々な工夫がされているんですね。しかし、最終的に不正なポケモン交換が可能になったというのは、少し残念です。

hakase
博士

まあ、技術的には面白い試みじゃ。ちなみに、Emuliciousとか、pretのポケモン赤逆コンパイルプロジェクトも参考にしたらしいぞ。

roboko
ロボ子

なるほど。色々な情報源を参考にしているんですね。勉強になります。

hakase
博士

そうじゃろ、そうじゃろ。しかし、不正なポケモン交換ができるようになったからって、ミュウツーを大量生産するのはダメだぞ!

roboko
ロボ子

それはもちろんダメです!博士、今日はありがとうございました。

hakase
博士

どういたしまして。最後に一つ、ポケモン交換で一番大事なのは…友情じゃ!…って、ちょっとクサすぎたかの?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search