日本版ポケモンクリスタルでの任意コード実行
金銀での任意コード実行や海外版クリスタルでのわざマシンを使った任意コード実行に関しては情報があるが、日本版クリスタルについてはほとんどなかったので実行可能な環境構築を行った。
金銀についてはVC金銀 任意コード実行 まとめや理解できなくても出来る任意コード実行解説【ポケモン金銀ver】を見るとよい。
海外版についてはCrystal arbitrary code execution guide with setups for all three methodsとThe newcomer and experienced user's guide to G/S/C Arbitrary Code Execution!に解説がある
日本版クリスタルでは昔のポケモンの裏技を語る【アネ゛デパミ゛】 14 [無断転載禁止]©2ch.netにバグ図鑑の方法がある。また、日本版クリススタルのRTAで使われた方法の解説がNew Japanese Pokémon Crystal speedrun route (test: 43 minutes in game time)にある。どちらの方法も副作用があるよう(前者は図鑑がバグる、後者は結構メモリを破壊しているらしい)なので副作用がない方法を確立したかった。
本記事の方法はGBASP上で確認している。VCなどでは未確認である。
この記事に書いてあることの実行は自己責任でお願いします。この記事に書いてあることを実行して発生したいかなる損害に対しても一切責任を負いません。
準備
必要なものは次の通り
しんぴのまもりはミニリュウ(レベル43)かパウワウ(レベル47)、ラプラス(レベル50)のいずれかから遺伝させる。ロコンから遺伝できて習得レベルがレベル25と低いがクリスタルでは出現せず、緑か銀で捕まえるかピカチュウの景品交換するしか入手方法はない。ロコンを輸送できるなら輸送するのが一番早い。また、ミニリュウとパウワウは進化させると習得が遅くなるので注意。
ピンクのリボンは火曜日に29ばんどうろでもらう。または、ラジオとうのロケット団の事件が解決した後クルミからもらう。
バグポケモンの入手
- 15匹ポケモンが入っていて一度も20匹以上預けたことのないボックスを用意する。
- 1匹も入っていないボックスに切り替える。
- いらないポケモンを預ける
- ボックスを変えるで15匹入っているボックスを選び
- 「ポケモンレポートに かきこんでいます でんげんを きらないで ください」が完全に表示されたらすぐに電源を切る。
再開し、ボックスの中身を見てバグっていたら成功。失敗したら2. からやり直す。
ボックスの中身が空ならタイミングが早く、ポケモンがコピーされていたまたはボックスが切り替わっていたらタイミングが遅い。
メモリの書き換え+実行用わざマシン15の入手
手持ちのポケモンを次のようにする
ボックス名を次のように変更する
ボックス1→がれぜデぼわづメ
ボックス2→ぼゆづぼてづがり
ボックス3→ぜケぼほづてムわ
ボックスはバグポケのいるボックスに変更する。
どうぐポケットの1番目をまんたんのくすり、2番目をいらない道具にする。
ポケモンセンター前でレポートを書き、リセットする。
再開したら次のように操作する。
- ポケモンセンターに入る
- カウンターまで前進する
- 壁まで右に進む
- PCの前まで前進する
- リュックを開き、まんたんのくすりにカーソルを合わせメニューを閉じる
- PCを起動し、マサキのパソコンを選ぶ
- ポケモンをあずけるを選びヌオーのようすをみる
- Aまたは右を押しわざを表示する
- 閉じたらオニスズメにカーソルを合わせる
- 戻ってポケモンをつれていくを選ぶ
リュックを開き、どうぐの2番目がわざマシン15になっていれば成功。これで任意コードの実行準備が整った。
実行方法
ボックス名による実行
手持ちの2番目にピンクのリボンをもたせたしんぴのまもりを覚えたヌオーを置き、どうぐからわざマシン15を使うと実行できる。
メール本文による実行
手持ちの2番目にハイパーボールをもたせたミルクのみを覚えたヌオーを置き、メールにコードを書き、そのメールを読んでからわざマシン15を使うと実行できる。
ボックス1を「がわぜりぼみづの」にしてボックス名によるコード実行をすればヌオーの2個目の技がミルクのみに変化するので技を並び替えて持ち物を変えれば使い分けることができる。
いずれの場合もしんぴのまもりまたはミルクのみは技の一番目に置くこと。
コード例
作ったコードをいくつか紹介する。最適化はしてないのでいいコードだとは思わないほうがよい。ちなみに金銀で使えるコードは基本的にクリスタルでは使用できない。金銀や海外版だとポケモンや道具などの情報を保存してるアドレスが異なるので持ち物や技、コードが異なるためである。
1匹目なつき度マックス個体値4F努力値65535ポイントマックス
がわぜたぼ9づづづづづづづづづづ
づづづづづづづの
アイテム1個目の個数255に
がりぜクぼ9づの
1匹目の技1を道具1個目の個数に対応する技に変更
がりぜクごがわぜレづの
1匹目の持ち物を道具1個目の個数に対応する技に変更
がりぜクごがわぜルづの
おまけ
わざマシン15をわざマシンポケット以外の場所から実行するとFA10/DA10に飛んでスクリプトが実行される。DA10を書き換えれば以降は通常プレイではおそらく変更されない。つまり、わざマシン15をわざマシンポケットに入れつつDA10以降をうまくコード実行できるように書き換えればよい。ちなみにわざマシン17でも可能である。この場合はDA47を書き換える。
実行環境構築ではDA10からの3バイトの値を書き換える+どうぐポケットにわざマシン15を入れることを行っている。
ld h,DAh
ld l,12h
ld a,DCh
ldd (hl),a
ld a,D5h
ldd (hl),a
ld a,C3h
ldd (hl),a
ld h,D8h
ld l,88h
ld a,CEh
ldd(hl),a
jp DC9Fh ;ボックスコードここまで
dec de
ret
DC9Fは2匹目の手持ちの見た目でDCA0が3匹目の手持ちの見た目である。バグポケモンを用いた方法だとdeをデクリメントしてからリターンしないとフリーズした。そのためボックスコード実行後に手持ち二匹目に飛ぶ必要があった。dec deに対応する文字がなかったのでオニスズメを使った。そしてリターンするためにアンノーンを置いた。
実行後は
DA10:C3
DA11:D5
DA12:DC
となる。
これが表すのは
jp DCD5h
DCD5にジャンプしてコードを実行する。
ちなみにDCD5は手持ち2番目のポケモンの種族、DCD6は手持ちポケモン2番目の持ち物、DCD7は手持ちポケモン2番目の1つ目の技である。
しんぴのまもりを覚えたヌオーにピンクのリボンをもたせると
jp DB68h
となりボックス1の1文字目に飛ぶ。
ミルクのみを覚えたヌオーにハイパーボールをもたせると
jp D002h
となり読んだメールの1文字目に飛ぶ。
DA10-DA12をC3 68 DBにしてDA47-DA49をC3 02 D0に書き換えればわざマシン15を使ってボックス名コードを実行、わざマシン17を使ってメール本文コードを実行とすることもできる。
この場合はヌオーを置く必要もなくなる。が、02や68に対応する文字が打てないので書き換えるのが面倒。少なくとも環境構築の時点では無理だと思われる。
機械語と命令の対応は<Gameboy (LR35902) OPCODESまたは任意コードニモニック表を、図鑑ナンバー、文字、持ち物、技との対応は内部コードを見るとよい。