ポケモンクリスタルにおけるバイナリエディタ (ver.20220825)

この記事は旧バージョンです.新しいバージョンは以下のものとなります.
ポケモンクリスタルにおけるバイナリエディタ - flag3833753

簡易版バイナリエディタ導入の方法

まずは簡易版バイナリエディタを導入します.
環境:ポケモンクリスタルでの動作を確認しております.
推奨:任意コード実行可能なソフト (初代でも金銀でも可) と通信交換できること*1
準備:「バグ図鑑」を用いた「最後に読んだメール*2」による任意コード実行環境

わざマシン」を用いた「最後に読んだメール」による任意コード実行環境も可能ですが注意点があります.

準備の詳細は次の動画に丸投げお任せします.「バグ図鑑」の説明も省略します.

以下の手順を踏むと簡易版バイナリエディタが起動します.

  1. ボックスの名前を表 1 の通りにする.
  2. 表 2 と表 3 のメールを用意する.
  3. 表 2 のメールを読んで「バグ図鑑」を起動する.
  4. 表 3 のメールを読んで「バグ図鑑」を起動する.

手順 3. の前にセーブすることをオススメします.
「バグ図鑑」を起動したら「B」で閉じましょう.

表 1

  1. ヘブ空グだ空どグ
  2. だガョベヘワろグ
  3. だグぼダぞヘワろ
  4. グわレろグリググ
  5. だ空ざグわンろぱ
  6. ヅまとヘゴみぴヘ
  7. みボぷヘゴみだつ
  8. ぼヂキづごョの空
  9. がもぜオだい

表 2

がろぜべョぺゾだゴぶづぜセづぜば
ゾだゴにどづぼゴぜマづの

表 3

ヘなづ空てィろなひだヘヂみちぼダ
メに0だガにだにだ空ボデの

簡易版バイナリエディタを起動するとこんな感じになると思います.

左 4 桁がアドレス,右 2 桁がその中身となっています.

文字の表示がおかしいところがあるのですが気にせず使いましょう.
gは A,青色の線は B,携帯マークは C だと思ってください.
特に 9 と g を混同しないように注意しましょう.

注意

初期アドレスは D384 となっています.
これは 9 番目のボックスの 2 文字目「も」と 4 文字目「オ」に対応しています.
この 2 文字を変えることで初期アドレスを変更することができます.
初期アドレスを変えたくなった場合は 9 番目のボックスの名前を変更して表 3 のメールを実行すれば良いです.表 2 のメールを既に実行した場合再度実行しなくても良いです.

簡易版バイナリエディタの操作方法

以下の操作方法でアドレスとその中身を書き換えることができます.
操作方法

A: アドレス+1
B: アドレス-1
↓: 中身+1
↑: 中身-1
→: 中身+10h
←: 中身-10h
Start: 終了

簡易版バイナリエディタを再度起動する場合は表 3 のメールを読んで「バグ図鑑」を起動すれば良いです.表 2 のメールを読む必要はありません.

バイナリエディタを起動するまで

簡易版バイナリエディタを使ってアドレス D2B1 から D383 の中身を後述のものに書き換えて「てあめ」と書かれたメールを読んで「バグ図鑑」を起動すればバイナリエディタが起動できます (この文を読んでいる段階ではまだ書き換えなくて良いです).ただし D2B1 から D383 の領域はセーブ & リセットで 00 に書き換えられてしまうので 3 段階に分けて対策をします.1 段階終わるごとにセーブすることを想定しています.

1. メールの作成

D384 から D3AF の中身を

3E 00 01 21 00 11 00 A6 21 99 D3 CD 9D 2F CD F2 2F CD AD 2F C9
3E 03 01 E8 00 11 B1 D2 21 94 AA CD 9D 2F CD F2 2F 4E CD AD 2F C9 50

に書き換えてください.その後手持ちのポケモン 1 匹目に (任意コード実行などに) いらないメールを持たせ,「てオも」と書かれたメールを読んで「バグ図鑑」を起動してください.

そうすると手持ちのポケモン 1 匹目に持たせたメールの内容が

に変化しています.このようになっていなければコードを見直してください.

2. バイナリエディタの作成

D384 から D398 の中身を

3E 03 01 E8 00 11 94 AA 21 B1 D2 CD 9D 2F CD F2 2F CD AD 2F C9

に書き換えてください.そしてアドレス D2B1 から D383 の中身を後述のものに書き換えてください.長いので一番下に載せています.
その後「てオも」と書かれたメールを読んで「バグ図鑑」を起動してください.

そうするとボックス 9 のデータが書き換えられます.

3. バイナリエディタの起動

「1. メールの作成」のメールを読んで「バグ図鑑」を起動し,「てあめ」と書かれたメールを読んで「バグ図鑑」を起動してください.
打ち間違いがなければバイナリエディタが起動できます.

起動できない場合はリセットしてください.「1. メールの作成」のメールを読んで「バグ図鑑」を起動し,その後簡易版バイナリエディタを起動して D2B1 から D398 のコードの修正をしてください.修正後は「てオも」「てあめ」の順にコードを実行することでバイナリエディタが起動できます.

バイナリエディタが起動するとこのようになります.

二重線で囲まれた領域の左 4 桁がアドレス,右 2 桁がその中身となっています.
ゲーム画面の上部にも (16 進数で) 2 桁の数字があるのですが,これは SRAM バンクの数字が表示されています.アドレス A000 から BFFF の中身を扱う際に必要になってきます.

バイナリエディタの操作

初代でのバイナリエディタと殆ど同じですが「SELECT」のみ少し違います.

↓: アドレス+1
↑: アドレス-1
→: アドレス+10
←: アドレス-10
B+↓: アドレス+100
B+↑: アドレス-100
B+→: アドレス+1000
B+←: アドレス-1000
A+↓: 中身+1
A+↑: 中身-1
A+→: 中身+10
A+←: 中身-10
SELECT+↓: バンク+1
SELECT+↑: バンク-1
SELECT+→: バンク+10
SELECT+←: バンク-10
SELECT+A: 指しているアドレスを実行
START: 終了

「SELECT+A」は不用意に押すとフリーズする可能性が高いので気をつけましょう.

注意

D2B1 から D383 のアドレスを用いてバイナリエディタを作成しているので,
この部分をバイナリエディタでいじると壊れるので注意してください.

「1. メールの作成」のメールをアップデートする

「1. メールの作成」のメールを手持ちのポケモン 1 匹目に持たせてください.
そしてバイナリエディタを開くとバンク 00 のアドレス A615 から A618 の中身は

C9 50 00 00 

になっています.これを

C3 B1 D2 50

に書き換えてください.そうすると手持ちのポケモン 1 匹目が持っているメールが書き換えられます.このメールを読んで「バグ図鑑」を実行するとバイナリエディタを起動することができます.こうすることで (「てあめ」のメールを使わずに) 1 つのメールだけでバイナリエディタを起動することができます.

わざマシン」を用いた「最後に読んだメール」による任意コード実行環境について

基本的には上記の手順とほぼ同様です.ただし表 3 のメールは

ョぶゃやてィろなひだヘヂみちぼダ
メに0だガにだにだ空ボデの
としてください.特に先頭 4 文字が変わります.またバイナリエディタを作る際 D2B1 から D2B4 の部分は

AF 3C E0 D4

とし D2C1 から D2C6 の部分は

00 00 00 00 00 00

としてください.「わざマシン」を使って簡易版バイナリエディタ及びバイナリエディタを起動するとこんな感じになります.

コード

WRA1:D2B1 CD C5 32         call 32C5
WRA1:D2B4 00               nop  
WRA1:D2B5 11 C0 4D         ld   de,4DC0
WRA1:D2B8 21 00 90         ld   hl,9000
WRA1:D2BB 01 22 3E         ld   bc,3E22
WRA1:D2BE CD C6 0D         call 0DC6
WRA1:D2C1 CD 3B 0E         call 0E3B
WRA1:D2C4 CD 49 0E         call 0E49
WRA1:D2C7 21 00 DA         ld   hl,DA00
WRA1:D2CA CD 1F D3         call D31F
WRA1:D2CD E5               push hl
WRA1:D2CE 54               ld   d,h
WRA1:D2CF 5D               ld   e,l
WRA1:D2D0 3E F8            ld   a,F8
WRA1:D2D2 83               add  e
WRA1:D2D3 5F               ld   e,a
WRA1:D2D4 38 01            jr   c,D2D7
WRA1:D2D6 15               dec  d
WRA1:D2D7 06 12            ld   b,12
WRA1:D2D9 FA 94 D4         ld   a,(D494)
WRA1:D2DC 21 A9 C4         ld   hl,C4A9
WRA1:D2DF CD 9D 2F         call 2F9D
WRA1:D2E2 CD 12 D3         call D312
WRA1:D2E5 3E 7C            ld   a,7C
WRA1:D2E7 22               ldi  (hl),a
WRA1:D2E8 7A               ld   a,d
WRA1:D2E9 CD 12 D3         call D312
WRA1:D2EC 7B               ld   a,e
WRA1:D2ED CD 12 D3         call D312
WRA1:D2F0 3E 7F            ld   a,7F
WRA1:D2F2 22               ldi  (hl),a
WRA1:D2F3 1A               ld   a,(de)
WRA1:D2F4 CD 12 D3         call D312
WRA1:D2F7 36 7C            ld   (hl),7C
WRA1:D2F9 3E 0C            ld   a,0C
WRA1:D2FB 85               add  l
WRA1:D2FC 6F               ld   l,a
WRA1:D2FD 30 01            jr   nc,D300
WRA1:D2FF 24               inc  h
WRA1:D300 1C               inc  e
WRA1:D301 20 01            jr   nz,D304
WRA1:D303 14               inc  d
WRA1:D304 05               dec  b
WRA1:D305 20 DE            jr   nz,D2E5
WRA1:D307 CD AD 2F         call 2FAD
WRA1:D30A 21 4B C5         ld   hl,C54B
WRA1:D30D 36 ED            ld   (hl),ED
WRA1:D30F E1               pop  hl
WRA1:D310 18 B8            jr   D2CA
WRA1:D312 F5               push af
WRA1:D313 CB 37            swap a
WRA1:D315 CD 19 D3         call D319
WRA1:D318 F1               pop  af
WRA1:D319 E6 0F            and  a,0F
WRA1:D31B C6 F6            add  a,F6
WRA1:D31D 22               ldi  (hl),a
WRA1:D31E C9               ret  
WRA1:D31F CD 1B 35         call 351B
WRA1:D322 F0 A9            ld   a,(ff00+A9)
WRA1:D324 5F               ld   e,a
WRA1:D325 CB 5F            bit  3,a
WRA1:D327 28 02            jr   z,D32B
WRA1:D329 C1               pop  bc
WRA1:D32A C9               ret  
WRA1:D32B CB 77            bit  6,a
WRA1:D32D 28 04            jr   z,D333
WRA1:D32F 3E FF            ld   a,FF
WRA1:D331 18 19            jr   D34C
WRA1:D333 CB 7F            bit  7,a
WRA1:D335 28 04            jr   z,D33B
WRA1:D337 3E 01            ld   a,01
WRA1:D339 18 11            jr   D34C
WRA1:D33B CB 67            bit  4,a
WRA1:D33D 28 04            jr   z,D343
WRA1:D33F 3E 10            ld   a,10
WRA1:D341 18 09            jr   D34C
WRA1:D343 CB 6F            bit  5,a
WRA1:D345 28 04            jr   z,D34B
WRA1:D347 3E F0            ld   a,F0
WRA1:D349 18 01            jr   D34C
WRA1:D34B AF               xor  a
WRA1:D34C CB 53            bit  2,e
WRA1:D34E 28 0D            jr   z,D35D
WRA1:D350 CB 43            bit  0,e
WRA1:D352 28 01            jr   z,D355
WRA1:D354 E9               jp   hl
WRA1:D355 E5               push hl
WRA1:D356 21 94 D4         ld   hl,D494
WRA1:D359 86               add  (hl)
WRA1:D35A 77               ld   (hl),a
WRA1:D35B E1               pop  hl
WRA1:D35C C9               ret  
WRA1:D35D CB 43            bit  0,e
WRA1:D35F 28 0E            jr   z,D36F
WRA1:D361 F5               push af
WRA1:D362 FA 94 D4         ld   a,(D494)
WRA1:D365 CD 9D 2F         call 2F9D
WRA1:D368 F1               pop  af
WRA1:D369 86               add  (hl)
WRA1:D36A 77               ld   (hl),a
WRA1:D36B CD AD 2F         call 2FAD
WRA1:D36E C9               ret  
WRA1:D36F CB 4B            bit  1,e
WRA1:D371 28 03            jr   z,D376
WRA1:D373 84               add  h
WRA1:D374 67               ld   h,a
WRA1:D375 C9               ret  
WRA1:D376 CB 7F            bit  7,a
WRA1:D378 28 05            jr   z,D37F
WRA1:D37A 85               add  l
WRA1:D37B 6F               ld   l,a
WRA1:D37C D8               ret  c
WRA1:D37D 25               dec  h
WRA1:D37E C9               ret  
WRA1:D37F 85               add  l
WRA1:D380 6F               ld   l,a
WRA1:D381 D0               ret  nc
WRA1:D382 24               inc  h
WRA1:D383 C9               ret  

バイナリ

CD C5 32 00 11 C0 4D 21 00 90 01 22 3E CD C6 0D
CD 3B 0E CD 49 0E 21 00 DA CD 1F D3 E5 54 5D 3E
F8 83 5F 38 01 15 06 12 FA 94 D4 21 A9 C4 CD 9D
2F CD 12 D3 3E 7C 22 7A CD 12 D3 7B CD 12 D3 3E
7F 22 1A CD 12 D3 36 7C 3E 0C 85 6F 30 01 24 1C
20 01 14 05 20 DE CD AD 2F 21 4B C5 36 ED E1 18
B8 F5 CB 37 CD 19 D3 F1 E6 0F C6 F6 22 C9 CD 1B
35 F0 A9 5F CB 5F 28 02 C1 C9 CB 77 28 04 3E FF
18 19 CB 7F 28 04 3E 01 18 11 CB 67 28 04 3E 10
18 09 CB 6F 28 04 3E F0 18 01 AF CB 53 28 0D CB
43 28 01 E9 E5 21 94 D4 86 77 E1 C9 CB 43 28 0E
F5 FA 94 D4 CD 9D 2F F1 86 77 CD AD 2F C9 CB 4B
28 03 84 67 C9 CB 7F 28 05 85 6F D8 25 C9 85 6F
D0 24 C9

*1:レポートバグを使えば通信交換できなくても任意コード実行できるらしいのですが執筆者は試したことがありません.

*2:この記事ではメールの 1 文字目から実行するものについて書いています.31 文字目から実行する場合は「だっ」や「18 DF」を適切に補えば同じ手順でできます.