この記事は旧バージョンです.新しいバージョンは以下のものとなります.
ポケモン金銀にバイナリエディタを移植したお話 - flag3833753
簡易版バイナリエディタ導入の方法
まずは簡易版バイナリエディタを導入します.
環境:ポケモン金銀での動作を確認しております.クリスタル版には非対応です.
準備:「たいせつポケット」の「わざマシン17」を用いた「最後に読んだメール」による任意コード実行環境*1
準備の詳細は次のブログ,動画にお任せします.Teraman64DD さんの動画だと Part.04 で導入しています.
- 理解できなくても出来る任意コード実行解説【ポケモン金銀ver】 - nakayoshibaddi’s blog
- ポケモン金銀で任意コード実行! ポケモン第二世代任意コード実行講座 Part.01 - YouTube
以下の手順を踏むと簡易版バイナリエディタが起動します.
手順 3. の前にセーブすることをオススメします.
表 1
- ぼヂキづごョの空
- ヘォォグだ空どグ
- だガョベヘえリグ
- だグぼダぞヘえリ
- グわいリグリググ
- だ空ざグわかリぱ
- ヅまてヘぐまぴヘ
- まボぷヘぐまだつ
- がわぜにださ
表 2
ぜゅひゼぼぐづの
表 3
メに0だガにだにだ空ボデの
簡易版バイナリエディタを起動するとこんな感じになると思います.
3 回目の記事になって今まで説明し忘れていたことに気付いたのですが
左 4 桁がアドレス,右 2 桁がその中身となっています.
見ての通り表示がおかしいのですが気にせず使いましょう.
■は A,▲は B,携帯マークは C だと思ってください.
注意
初期アドレスは DCC6 となっています.
これは 9 番目のボックスの 2 文字目「わ」と 4 文字目「に」に対応しています.
この 2 文字を変えることで初期アドレスを変更することができます.
初期アドレスを変えたくなった場合は 9 番目のボックスの名前を変更して表 3 のメールを実行すれば良いです.表 2 のメールを既に実行した場合再度実行しなくても良いです.
簡易版バイナリエディタの操作方法
以下の操作方法でアドレスとその中身を書き換えることができます.
操作方法
B: アドレス-1
↓: 中身+1
↑: 中身-1
→: 中身+10h
←: 中身-10h
Start: 終了
簡易版バイナリエディタを再度起動する場合は表 3 のメールを読んで「わざマシン17」を使用すれば良いです.表 2 のメールを読む必要はありません.
バイナリエディタを起動するまで
簡易版バイナリエディタを使ってアドレス DCC6 から DD92 の中身を後述のものに書き換えます.長いので一番下に載せています.
書き換えたら簡易版バイナリエディタを終了してセーブすることをオススメします.
その後「てにわ」と書かれたメールを読んで「わざマシン17」を使用するとバイナリエディタが起動できます.
二重線で囲まれた領域の左 4 桁がアドレス,右 2 桁がその中身となっています.
ゲーム画面の上部にも (16 進数で) 2 桁の数字があるのですが,これは SRAM バンクの数字が表示されています.アドレス A000 から BFFF の中身を扱う際に必要になってきます.
バイナリエディタの操作
初代でのバイナリエディタと殆ど同じですが「SELECT」のみ少し違います.
↑: アドレス-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」は不用意に押すとフリーズする可能性が高いので気をつけましょう.
戦闘をしても壊れないバイナリエディタの作り方
バイナリエディタをボックスに格納する
上記にもある通り戦闘をするとバイナリエディタが壊れます.戦闘をする度にバイナリエディタを作り直すのは面倒なので対策する必要があります.
まずバイナリエディタでアドレス DD93 から DDA7 の中身を
3E 03 01 CD 00 11 94 AA 21 C6 DC CD 9D 30 CD D6 30 CD AD 30 C9
に書き換えてください.その後 DD93 で「Select+A」を押してください.
そうするとバンク 03 の AA94 から AB60 がバイナリエディタのコードに変化しています.確かめてみてください.
バンク 03 の AA94 から AB60 はボックス 9 のデータが格納されています.
実行用メールを作る
手持ちのポケモン 1 匹目に (任意コード実行などに) いらないメールを持たせてください.
その後バイナリエディタを起動して,バンクを 00 にしアドレス A600 から A616 の中身を
3E 03 01 CD 00 11 C6 DC 21 94 AA CD 9D 30 CD D6 30 CD AD 30 C3 C6 DC
に書き換えてください.そうすると手持ちのポケモン 1 匹目が持っているメールが書き換えられます.このメールを読んで「わざマシン17」を使用するとバイナリエディタが起動されますが,このバイナリエディタは戦闘をしても壊れません.一度敵トレーナーと対戦してみて実際に壊れてないか確かめると良いです.
補足
アドレス A600 から A616 の中身を書き換えることでメールの中身を変えるという手法と取りましたが,他の手法としてはアドレス D8B2 から D8C8 の中身を
3E 03 01 CD 00 11 C6 DC 21 94 AA CD 9D 30 CD D6 30 CD AD 30 C3 C6 DC
に書き換えて「ボックス 1 の名前」による任意コード実行を行うという手法があります.そうすると一々メールを読まなくてもバイナリエディタが起動できます.この手法のデメリットとして,簡易版バイナリエディタを壊してしまうので (バイナリエディタを作成してしまえば簡易版は不要になるのですが) 失敗した場合リカバリが面倒になります.(執筆者はどのアドレスに何が格納されているのかあまり詳しくないので) もしかするともっと格納するのにいいアドレスがあるかもしれません.
参考文献
今回のバイナリエディタを作るにあたって参考にした文献は次の 3 つです.日本語版のポケモン金銀のバイナリエディタに関する動画,記事は (執筆者の調べた限りだと) 最初の 2 つぐらいしかない気がします.
- バイナリエディタ導入編! ポケモン第二世代任意コード実行講座 Part.05【VOICEROID紲星あかり】 - YouTube
- バイナリエディタ(第二世代) - pokemonbug @ ウィキ - atwiki(アットウィキ)
- Glitch City Laboratories Archives - Powerful (but large!) memory editor for G/S - Page 1
pokemonbug @ ウィキさんの記事にもバイナリエディタのコードがあります.こちらは 344 バイトととても長くまた操作が初代でのバイナリエディタと異なります.そのため初代のバイナリエディタを移植するという形でポケモン金銀でもバイナリエディタを使えるようにしました.こちらは 205 バイトとなっています.
pokemonbug @ ウィキさんの記事にあるバイナリエディタは ROM バンクの切り替えもできるようですが,この機能は今回紹介するバイナリエディタの機能にはありません.
コード
WRA1:DCC6 11 B2 4E ld de,4EB2 WRA1:DCC9 21 00 90 ld hl,9000 WRA1:DCCC 01 23 3E ld bc,3E23 WRA1:DCCF CD 76 0E call 0E76 WRA1:DCD2 AF xor a WRA1:DCD3 3C inc a WRA1:DCD4 E0 D6 ld (ff00+D6),a WRA1:DCD6 21 00 DA ld hl,DA00 WRA1:DCD9 CD 2E DD call DD2E WRA1:DCDC E5 push hl WRA1:DCDD 54 ld d,h WRA1:DCDE 5D ld e,l WRA1:DCDF 3E F8 ld a,F8 WRA1:DCE1 83 add e WRA1:DCE2 5F ld e,a WRA1:DCE3 38 01 jr c,DCE6 WRA1:DCE5 15 dec d WRA1:DCE6 06 12 ld b,12 WRA1:DCE8 FA BD D1 ld a,(D1BD) WRA1:DCEB 21 A9 C3 ld hl,C3A9 WRA1:DCEE CD 9D 30 call 309D WRA1:DCF1 CD 21 DD call DD21 WRA1:DCF4 3E 7C ld a,7C WRA1:DCF6 22 ldi (hl),a WRA1:DCF7 7A ld a,d WRA1:DCF8 CD 21 DD call DD21 WRA1:DCFB 7B ld a,e WRA1:DCFC CD 21 DD call DD21 WRA1:DCFF 3E 7F ld a,7F WRA1:DD01 22 ldi (hl),a WRA1:DD02 1A ld a,(de) WRA1:DD03 CD 21 DD call DD21 WRA1:DD06 36 7C ld (hl),7C WRA1:DD08 3E 0C ld a,0C WRA1:DD0A 85 add l WRA1:DD0B 6F ld l,a WRA1:DD0C 30 01 jr nc,DD0F WRA1:DD0E 24 inc h WRA1:DD0F 1C inc e WRA1:DD10 20 01 jr nz,DD13 WRA1:DD12 14 inc d WRA1:DD13 05 dec b WRA1:DD14 20 DE jr nz,DCF4 WRA1:DD16 CD AD 30 call 30AD WRA1:DD19 21 4B C4 ld hl,C44B WRA1:DD1C 36 ED ld (hl),ED WRA1:DD1E E1 pop hl WRA1:DD1F 18 B8 jr DCD9 WRA1:DD21 F5 push af WRA1:DD22 CB 37 swap a WRA1:DD24 CD 28 DD call DD28 WRA1:DD27 F1 pop af WRA1:DD28 E6 0F and a,0F WRA1:DD2A C6 F6 add a,F6 WRA1:DD2C 22 ldi (hl),a WRA1:DD2D C9 ret WRA1:DD2E CD F4 36 call 36F4 WRA1:DD31 F0 AB ld a,(ff00+AB) WRA1:DD33 5F ld e,a WRA1:DD34 CB 5F bit 3,a WRA1:DD36 28 02 jr z,DD3A WRA1:DD38 C1 pop bc WRA1:DD39 C9 ret WRA1:DD3A CB 77 bit 6,a WRA1:DD3C 28 04 jr z,DD42 WRA1:DD3E 3E FF ld a,FF WRA1:DD40 18 19 jr DD5B WRA1:DD42 CB 7F bit 7,a WRA1:DD44 28 04 jr z,DD4A WRA1:DD46 3E 01 ld a,01 WRA1:DD48 18 11 jr DD5B WRA1:DD4A CB 67 bit 4,a WRA1:DD4C 28 04 jr z,DD52 WRA1:DD4E 3E 10 ld a,10 WRA1:DD50 18 09 jr DD5B WRA1:DD52 CB 6F bit 5,a WRA1:DD54 28 04 jr z,DD5A WRA1:DD56 3E F0 ld a,F0 WRA1:DD58 18 01 jr DD5B WRA1:DD5A AF xor a WRA1:DD5B CB 53 bit 2,e WRA1:DD5D 28 0D jr z,DD6C WRA1:DD5F CB 43 bit 0,e WRA1:DD61 28 01 jr z,DD64 WRA1:DD63 E9 jp hl WRA1:DD64 E5 push hl WRA1:DD65 21 BD D1 ld hl,D1BD WRA1:DD68 86 add (hl) WRA1:DD69 77 ld (hl),a WRA1:DD6A E1 pop hl WRA1:DD6B C9 ret WRA1:DD6C CB 43 bit 0,e WRA1:DD6E 28 0E jr z,DD7E WRA1:DD70 F5 push af WRA1:DD71 FA BD D1 ld a,(D1BD) WRA1:DD74 CD 9D 30 call 309D WRA1:DD77 F1 pop af WRA1:DD78 86 add (hl) WRA1:DD79 77 ld (hl),a WRA1:DD7A CD AD 30 call 30AD WRA1:DD7D C9 ret WRA1:DD7E CB 4B bit 1,e WRA1:DD80 28 03 jr z,DD85 WRA1:DD82 84 add h WRA1:DD83 67 ld h,a WRA1:DD84 C9 ret WRA1:DD85 CB 7F bit 7,a WRA1:DD87 28 05 jr z,DD8E WRA1:DD89 85 add l WRA1:DD8A 6F ld l,a WRA1:DD8B D8 ret c WRA1:DD8C 25 dec h WRA1:DD8D C9 ret WRA1:DD8E 85 add l WRA1:DD8F 6F ld l,a WRA1:DD90 D0 ret nc WRA1:DD91 24 inc h WRA1:DD92 C9 ret
バイナリ
11 B2 4E 21 00 90 01 23 3E CD 76 0E AF 3C E0 D6 21 00 DA CD 2E DD E5 54 5D 3E F8 83 5F 38 01 15 06 12 FA BD D1 21 A9 C3 CD 9D 30 CD 21 DD 3E 7C 22 7A CD 21 DD 7B CD 21 DD 3E 7F 22 1A CD 21 DD 36 7C 3E 0C 85 6F 30 01 24 1C 20 01 14 05 20 DE CD AD 30 21 4B C4 36 ED E1 18 B8 F5 CB 37 CD 28 DD F1 E6 0F C6 F6 22 C9 CD F4 36 F0 AB 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 BD D1 86 77 E1 C9 CB 43 28 0E F5 FA BD D1 CD 9D 30 F1 86 77 CD AD 30 C9 CB 4B 28 03 84 67 C9 CB 7F 28 05 85 6F D8 25 C9 85 6F D0 24 C9