ピカチュウ版で、冒険の途中から任意コード実行環境を構築する

※2023年2月9日に、flag3さんが通信交換無しでバイナリエディタを導入する方法を公開しました。今から任意コード実行環境を構築する場合は、1台で済むリンク先の方法がよいと思われます。

バイナリエディタ導入 毒サファリ・いあいぎりルート ピカチュウ版 - flag3833753

はじめに

初代と第二世代のポケモンでは、自分で書いたプログラムを実行することができます。これを任意コード実行といいます。

初代と第二世代のポケモンで任意コード実行を行う方法として、以下の方法があります*1

赤緑青
5かい、てへ、なかよしバッヂを使用する方法[1][2]
ピカチュウ
はやぶさバッヂを使用する方法[3]
金銀
わざマシン17を使用する方法[4]*2
クリスタル(および金銀)
バグった図鑑のモードを使用する方法[5]*3

上記の方法を実行できるようにするための構築手順について、最初から始める場合の構築手順は、赤緑青[6]・ピカチュウ[3]・金銀[4]・クリスタル[5]で示されています。

また、赤緑青と金銀クリスタルでは、以下の方法で冒険の途中からでも任意コード実行環境を構築することができます。

赤緑青
壁抜けアイテムを使用して任意コード実行に必要な道具を入手する[1]
金銀クリスタル
自転車を持ったポケモンを通信交換で送る[5]

しかし、ピカチュウ版で冒険の途中から任意コード実行環境を構築する方法は、私が知る限り存在していません。

ピカチュウ版では[3]で示されているように、トキワの森のトレーナーに対してfifth法を行うことで任意コード実行環境の構築をしています。これを行うにはそのトレーナーを倒していない必要があり、そのトレーナーを倒している場合は構築できません。また、初代では持ち物の概念がないため、通信交換で道具を送ることもできません*4

青版では上記で示した方法以外に、ステータスを調整したポケモンとバグ技の追加効果を利用した任意コードの実行方法があります[7]。ピカチュウ版で同じようなことができれば、ピカチュウ版でも冒険の途中から任意コード実行環境の構築ができると考え調べたところ、青版と同じ方法ではないもののできることが分かりました。この記事では、ピカチュウ版でバグ技の追加効果を利用することによって冒険の途中からでも任意コード実行環境を構築する方法を説明します。

構築手順

条件

  • ポケモンやしき」か「ななしのどうくつ」に行けること
  • 赤緑青と通信交換できること
  • 使っていないボックスが1つ以上あること

赤緑青で用意するもの

  • 以下の条件を満たすポケモン(A)
    • 通信交換で進化しないポケモン、具体的にはユンゲラーゴーリキー・ゴローン・ゴースト以外のポケモン
    • ぼうぎょ実数値が50020(C364h)、すばやさ実数値が56832~57087(DE00h~DEFFh)
      ※ぼうぎょ実数値は、画面上では「ゥ20」と表示される
    • 覚えている技がわざマシン05のみ

※技やステータスの調整は、セレクトバグ・任意コード実行・バイナリエディタなどで行う。

ピカチュウ版で用意するもの

手順

  1. 通信交換で(A)をピカチュウ版に送る。
    ※送ったあとに(A)をポケモンボックスや育てやに預けてはいけない。引き出すときにステータスの再計算が行われ、調整したステータスが消えてしまう。
  2. 道具をすべてパソコンに預ける。
    ※預けていない道具は手順終了時点で消えるので注意。
  3. ポケモンボックスのニックネームを以下のようにする。
    • v1.0用 ※[8]のニックネームをこの手順用に修正したもの
       01:ョョョョョ
       02:がめぜルべ
       03:づョづぶづ
       04:ぶづよマづ
       05:にマづぜべ
       06:ョオづにカ
       07:づよナづぼ
       08:づにレづざ
       09:よバづにヨ
       10:づよそづぼ
       11:づにッづの
      
    • v1.1~v1.3用 ※[9]のニックネームをこの手順用に修正したもの
       01:ョョョョョ
       02:べがめぜュ
       03:づぶづぶづ
       04:ぶづよマづ
       05:にせづにさ
       06:づよさづそ
       07:にョづよバ
       08:づよノづづ
       09:にねづよー
       10:づの
      
  4. 手持ちポケモンを以下の順に並べる。
    • (v1.0) 先頭2匹は(B)(C)、3匹目以降は(A)を含んだ任意のポケモン
    • (v1.1~v1.3) 先頭は(A)以外、2匹目以降は(A)を含んだ任意のポケモン
  5. ポケモンやしき 地下1階かななしのどうくつに行き、メタモンとエンカウントする(レベルは不問)。
  6. (A)に交代する。交代後はメタモンが(A)に変身する。
  7. わざマシン05を使用する(メタモンわざマシン05を使用することも含む)。わざマシン05が命中し一撃で倒さなかった場合、手持ちの道具が以下のように変化する(v1.0の場合は手持ち1・2匹目の親名も変化する)。
    ※倒してしまった場合は手順5からやり直し。レベルが上った場合は手順1からやり直し。

任意コード実行方法

上記の手順で任意コード実行環境を構築したあとは、以下の方法で任意コード実行ができます。

v1.0の場合

親名が改ざんされた手持ちの2匹のいずれかをボックス5番目に置いてから、はやぶさバッヂを使用します[3]。

v1.1~1.3の場合

パソコンの道具欄9~11番目を以下のようにしてから、はやぶさバッヂを使用します。

Ver1.1~1.3の道具個数については、
09番目:かみなりのいし 99個
10番目:わざマシン22 35個
11番目:わざマシン33 何個でも

の場合は、ボックス1匹目NN
09番目:かみなりのいし 86個
10番目:わざマシン10 35個
11番目:わざマシン33 何個でも
の場合は、手持ち1匹目NNに飛ぶようになっています

[3]

解説

この構築手順は、バグ技「わざマシン05」の不正な追加効果を利用してポケモンボックスのニックネームに書いたプログラムを実行し、任意コード実行環境を構築しています。

追加効果がある技を使用したとき、ダメージを与えたあとに種類に応じて特定のアドレスへジャンプします*7。例えば、ピカチュウ版のv1.3で「どくばり(追加効果02h)」を使用すると、0F:74DFへジャンプします。追加効果のジャンプ先はジャンプテーブルによって指定され、このテーブルに対応した値がジャンプ先となります。例えば、追加効果の値が02hであれば、テーブルの2番目に書かれているアドレスへジャンプします。

バグ技の中には、一撃で倒さないとフリーズするものがあります[10]。これは、追加効果が不正な値となっているためです。この場合は、ジャンプテーブルからはみ出でている部分をジャンプ先として読み込むため、想定外のアドレスへジャンプすることになります。バグ技の使用による想定外のジャンプ先には、WRAM上かつプレイヤーが自由に書き換えられるアドレスが含まれています。ピカチュウ版のバグ技わざマシン05は、そのうちの1つです。

ピカチュウ版におけるわざマシン05の技データを表1に示します(v1.0~v1.3共通)。

表1 ピカチュウ版のわざマシン05の技データ
アニメーション 77h (数字上はオウムがえしと同じ、ただし実際は打撃モーション[10])
追加効果 FAh (不正値)
威力 117
タイプ 0Bh (物理技、表示上はノーマルだがタイプ一致・相性補正はともになし)
命中率 120/256 (約46.9%)
PP 33

ピカチュウ版で追加効果FAhが発生した場合は、アドレスED28hにジャンプします(v1.0~v1.3共通)。アドレスED28hはCD28hのミラーで、相手のポケモンの補正前のぼうぎょ実数値上桁が書き込まれています。また、CD29h・CD2Ahはそれぞれ、相手のポケモンの補正前のぼうぎょ実数値下桁・すばやさ実数値上桁が書き込まれています。

相手のポケモンが変身すると、これらのアドレスの値はその時に出ている自分のポケモンの値となります。そのため、ステータスを調整したポケモンに変身してもらうことで、任意の値を書き込むことができます。

この構築手順では、アドレスED28h~ED2Ahにボックス1番目のニックネーム1文字目のアドレスDE64hにジャンプする命令を書いています。これによりわざマシン05が命中して一撃で倒さなかった場合は追加効果により、ボックスのニックネームに書いた任意コード実行環境を構築するプログラムが実行されます。これにより、任意コード実行環境を構築することができます。

補足

この構築手順では、WRAMのミラー領域を使用しています。そのため、ミラー領域が機能していない環境では、この手順を行うことはできません。ミラー領域が機能していない環境で任意コード実行環境を構築したい場合は、以下の記事を参照してください。
ピカチュウ版で、冒険の途中から任意コード実行環境を構築する(ミラー領域を使用しない方法)

参考文献

[1] taba、【5かい】初代ポケモンの任意コード実行解説動画【なかよしバッヂ】 - ニコニコ動画https://www.nicovideo.jp/watch/sm28475711、2023年1月16日閲覧。

[2] taba、初代ポケモンの任意コード実行解説動画の謝罪と訂正:tabaのブロマガ - ブロマガ、https://web.archive.org/web/20211007040354/https://ch.nicovideo.jp/taba/blomaga/ar995222、2023年1月16日閲覧。

[3] 魚肉、【VC版対応】ポケットモンスターピカチュウ 任意コード実行下準備チュートリアル | 魚肉の雑記帳、http://blog.livedoor.jp/lpt9705/archives/34247654.html、2023年1月11日閲覧。

[4] Teraman64DD、【ポケモン銀】ポケモン第二世代任意コード実行講座 Part.01【VOICEROID紲星あかり】 - ニコニコ動画https://www.nicovideo.jp/watch/sm37261326、2023年1月16日閲覧。

[5] Teraman64DD、【ゲームボーイポケモン第二世代任意コード実行講座 Part.04【VOICEROID紲星あかり】 - ニコニコ動画https://www.nicovideo.jp/watch/sm38101743、2023年1月16日閲覧。

[6] ありす*、【初代ポケモン】なかよしバッヂ導入チャート【任意コード実行】 - Wonderland Seeker、https://alice-wreath.hatenablog.com/entry/2019/10/03/210029、2023年1月16日閲覧。

[7] imationポケモン青 「わざマシン42」を用いた任意コードの実行(バグ) - ニコニコ動画https://www.nicovideo.jp/watch/sm37244526、2023年1月17日閲覧。

[8] 昔のポケモンの裏技を語る【アネ゛デパミ゛】 14 [無断転載禁止]©2ch.net、https://medaka.5ch.net/test/read.cgi/poke/1477904768/87、2023年1月11日閲覧。

[9] 昔のポケモンの裏技を語る【アネ゛デパミ゛】 13、https://tamae.5ch.net/test/read.cgi/poke/1389422437/630、2023年1月11日閲覧。

[10] ROTF、ピカ版 バクわざ目録 | ROTFの覚え書き、https://rollingonthefloor.blog.fc2.com/blog-entry-48.html、2023年1月15日閲覧。

更新履歴

2023年2月3日 公開

2023年2月9日 冒頭に通信交換無しでバイナリエディタを導入するflag3さんの記事へのリンクを追加

*1:これ以外にも方法はありますが、代表的なものを示しています。

*2:13:06~の理論編

*3:16:51~の理論編

*4:ポケモンスタジアム金銀のカラーケースを使用すれば、ピカチュウ版に道具を送ることはできます。ただし、この方法はVC版では無理です。

*5:メモリ上の値はFC 50 C3 82 DE、画面上での表示は「6」

*6:メモリ上の値はF7 50 C3 57 D2、画面上での表示は「1」

*7:「オウムがえし」や「スピードスター」など、一部の技を除く