なるほどえたきちのブログじゃねーの

チラ裏雑記帳

ポケモン過去作の解析とか乱数調整とかそこら辺。不定期更新。

日版エメラルド用任意コードのアレコレ

2019/9/30
バグポケ0x085Fの発見や導入コードの最適化等により、この記事で紹介している情報が古くなってきたので新しく導入手順を纏め直しています。
新しくバイナリエディタを導入したいという方はこちらの記事の手順で導入してください。
bzl.hatenablog.com

 

 

最近Emでの任意コード実行が話題になってるような気がするので便乗して少し遊んでみました。
コード載せてダラダラ語る前に何やったか見せた方が早そうなのでまずはこの動画を見てください。

 

大体察しはつくと思いますがバイナリエディタです。(挙動が怪しぎるが)
動画では単純なイベントスクリプトの実行程度で終わっていますが理論上はこんなこともできてしまいます。割と何でもありです。(音量注意)

今回はこのバイナリエディタの起動方法を解説したいと思います。
当たり前ですが3世代ポケモンのメモリ構造が頭に入っていないとこれが起動できても使い物にならないので有識者以外には推奨できません。

以下説明

 

1)バグ技0x2B5Cを習得したポケモンの生成


バグ技0x2B5Cより簡単な任意コード実行方法が解析できたので新しく導入する方はこちらを参考にした方が安定すると思います。
バグポケ0x085Fの生成とボックスの配置調整が完了したら、ボックス1のボックス名を『うl』に変更してこの記事の手順3)に移ってください。

bzl.hatenablog.com

既に0x2B5Cを使用できるポケモンがいる場合はこの手順を踏む必要はありません。

f:id:BZL:20190716052527p:plain

まずは適当にバルビートを入手します。

f:id:BZL:20190716052800p:plain

ヒワマキシティ左上の民家にいる子供に話しかけます。

f:id:BZL:20190716053006p:plain

プラスル(NN:プラプラ)と交換して貰います。
習得している技を鳴き声のみにし、努力値をH92 A43に調整します。
以下の振り方が個人的には楽だと思います。

マックスアップ×9

タウリン×4

ゴニョニョ×2

ポチエナ×3

 

努力値の調整が終わったらこのプラスルを材料にダブルコラプションを行います。
(タマゴバグは殆どやったことないので詳しい解説は他サイトに投げます)
成功すると以下の画像のようにlv0のラフレシアが生成されます。
このラフレシアは技0x2B5C(べべべべべべ)と技0x0505(読めん)を習得しています。

f:id:BZL:20190716053815p:plain

f:id:BZL:20190716053931p:plain

技0x0505を残したままにしておくと戦闘時にフリーズしてしまうので技1と技4を入れ替えた後に育て屋に預けます。

f:id:BZL:20190716054358p:plain

適当に走り回ってから受け取るとこのような技構成に変化していると思います。

以上で技0x2B5Cの生成は完了です。

 

2)ボックスRAMの編集


今後の作業にあたってバグ技0x2B5Cの成功率(1/32)が障壁になるのでボックスのメモリを改竄して成功率を底上げします。
ボックスの状態を以下の通りに編集します。

 

2019/9/21
コードの最適化、成功率の向上(1/32→3/32)を行いました。

 

 

スクリプト呼び出し用ポケモン

TNの変更が面倒な場合はNNのみで充分です。

NNのみの場合バグ技の成功率は3/32から2/32に下がります。

 

ボックス12/26:NN『てンねうい』TN『てメねうい』

ボックス12/27:NN『てんねうい』

ボックス14/29:空欄

ボックス14/30:空欄

 

ボックス名を以下の通りに変更

ボックス ボックス名
ボックス1 『ワば2らァあmひ』
ボックス2 『アたぐょみ l』
ボックス3 『リでおめつかみぇ』
ボックス4 『アすふさk l』
ボックス5 『ィゅくべるタおべ』
ボックス6 『アノタミBィC』
ボックス7 『うyぬういィ く』
ボックス8 『アいィ く』
ボックス9 『うyぬうは は 』

 

戦闘アニメを『みる』に設定してから戦闘に入り、フリーズせず技が正常終了するまでバグ技0x2B5Cを使用し続けます。
技が成功したらすぐに戦闘終了し、ボックスの内容を確認します。
ボックス12の26-27匹目にダメタマゴが配置されていたら、ボックス1のボックス名を『うl』に変更します。

ボックス14の29-30匹目は常に空欄にするようにしてください。

 

これ以降はバグ技0x2B5Cがほぼ確実に成功するようになります。

 

3)バイナリエディタのデータ書き込み


恐らく一番時間のかかる作業になります。
バグ技0x2B5Cから呼び出される任意コードを使用してバイナリエディタのデータをボックスのRAMに書き込みます。
書き込まれる位置はボックス1の2-13匹目になります。

 

まず以下の通りにボックス名を編集します。 

ボックス ボックス名
ボックス2 『アォめリば l』
ボックス4 『アやめコづ l』
ボックス5 『グねワNゃG l』
ボックス6 『アワNエG l』
ボックス7 『ワNクGミBィC』

 

コード1回の実行につき0x24byteがコピーされます。
バイナリエディタのサイズは0x3C0byteなので合計27回のコード実行が必要になります。
ボックス3、8-14のボックス名は任意コードの実行毎に変更してください。
27回のコード実行が完了したらこのステップは終了です。

 

1回目

ボックス ボックス名
ボックス3 『ついゥはぇぃ も』
ボックス8 『アィ♂ミ」』
ボックス9 『fぶYぴァばおが』
ボックス10 『アアアDばルl』
ボックス11 『アア l99』
ボックス12 『アおふVぴ』
ボックス13 『ァばおがDばムl』
ボックス14 『アアア みUぴ』

 

2回目

ボックス ボックス名
ボックス3 『ついゥはぇぃあも』
ボックス8 『ア l99』
ボックス9 『ァばおがDばノl』
ボックス10 『アアア l99』
ボックス11 『アアくむUぶ』
ボックス12 『アPぴァば』
ボックス13 『 l99けがDば』
ボックス14 『アアアセlOべ』

 

3回目

ボックス ボックス名
ボックス3 『ついゥはぇぃいも』
ボックス8 『ア l99』
ボックス9 『すメSぶくタ リ』
ボックス10 『アアアくム み』
ボックス11 『アアべムミB』
ボックス12 『アィCPぶ』
ボックス13 『 l99たむけい』
ボックス14 『アアアぞね め』

 

4回目

ボックス ボックス名
ボックス3 『ついゥはぇぃうも』
ボックス8 『アMべあィ』
ボックス9 『あぅあも l99』
ボックス10 『アアアあもあも』
ボックス11 『アアあもあも』
ボックス12 『ア l99』
ボックス13 『あもあもあもいぃ』
ボックス14 『アアア l99』

 

5回目

ボックス ボックス名
ボックス3 『ついゥはぇぃえも』
ボックス8 『アあィあぇ』
ボックス9 『せれxW l99』
ボックス10 『アアアあぅあィ』
ボックス11 『アアあぅAぶ』
ボックス12 『アぞもため』
ボックス13 『ついィねあィGイ』
ボックス14 『アアア l99』

 

6回目

ボックス ボックス名
ボックス3 『ついゥはぇぃおも』
ボックス8 『アいぅふぃ』
ボックス9 『あィGイあぅ♀ぶ』
ボックス10 『アアアためつい』
ボックス11 『アア l99』
ボックス12 『アィねあィ』
ボックス13 『あぅ め l99』
ボックス14 『アアアあもあも』

 

7回目

ボックス ボックス名
ボックス3 『ついゥはぇぃかも』
ボックス8 『アあもあも』
ボックス9 『 l99あもあも』
ボックス10 『アアアあもあも』
ボックス11 『アア l99』
ボックス12 『アあもあも』
ボックス13 『いぃあィあぇせれ』
ボックス14 『アアアxWあぅ』

 

8回目

ボックス ボックス名
ボックス3 『ついゥはぇぃきも』
ボックス8 『アあィミび』
ボックス9 『 l996ばFば』
ボックス10 『アアアィ♂ミ」』
ボックス11 『アアャ…ビぷ』
ボックス12 『アりレちむ』
ボックス13 『 l99ッぴァば』
ボックス14 『アアアけがDば』

 

9回目

ボックス ボックス名
ボックス3 『ついゥはぇぃくも』
ボックス8 『ア l99』
ボックス9 『ヲl やんふりリ』
ボックス10 『アアア l99』
ボックス11 『アアあけける』
ボックス12 『アいeたぅ』
ボックス13 『 l990ぅぅヤ』
ボックス14 『アアアそむあぞ』

 

10回目

ボックス ボックス名
ボックス3 『ついゥはぇぃけも』
ボックス8 『アける e』
ボックス9 『たぅ0ぅムヤあゅ』
ボックス10 『アアア l99』
ボックス11 『アアいょあゃ』
ボックス12 『アおわおV』
ボックス13 『えわpWあょns』
ボックス14 『アアア l99』

 

11回目

ボックス ボックス名
ボックス3 『ついゥはぇぃこも』
ボックス8 『アィぷんふ』
ボックス9 『ぇふたゲ l99』
ボックス10 『アアアWゲVェ』
ボックス11 『アアちェっゲ』
ボックス12 『ア l99』
ボックス13 『ダゲゾェアェ み』
ボックス14 『アアア l99』

 

12回目

ボックス ボックス名
ボックス3 『ついゥはぇぃさも』
ボックス8 『アぃツミツ』
ボックス9 『…ツミルえりきV』
ボックス10 『アアアぞ たぃ』
ボックス11 『アアぅコたぃ』
ボックス12 『ア l99』
ボックス13 『ぅイきlミンるむ』
ボックス14 『アアアミエ…ン』

 

13回目

ボックス ボックス名
ボックス3 『ついゥはぇぃしも』
ボックス8 『アれむミエ』
ボックス9 『 l99ァみィぃ』
ボックス10 『アアアぃラ…ュ』
ボックス11 『アア l99』
ボックス12 『アたょいバ』
ボックス13 『 みあゾ l99』
ボックス14 『アアアノぶ ゾ』

 

14回目

ボックス ボックス名
ボックス3 『ついゥはぇぃすも』
ボックス8 『アりレ む』
ボックス9 『 l99 め も』
ボックス10 『アアアミぴィゃ』
ボックス11 『アアァばおが』
ボックス12 『アDばはl』
ボックス13 『たょいバ l99』
ボックス14 『アアア みあゾ』

 

15回目

ボックス ボックス名
ボックス3 『ついゥはぇぃせも』
ボックス8 『アタぶ ゾ』
ボックス9 『りレ む め も』
ボックス10 『アアア l99』
ボックス11 『アアニぴィゃ』
ボックス12 『アァばけが』
ボックス13 『 l99Dばえl』
ボックス14 『アアアえ…ミB』

 

16回目

ボックス ボックス名
ボックス3 『ついゥはぇぃそも』
ボックス8 『ア l99』
ボックス9 『ィC6ばィ♂ミ」』
ボックス10 『アアア l99』
ボックス11 『アアきふリば』
ボックス12 『アおぃョば』
ボックス13 『てsぷぷサぺょギ』
ボックス14 『アアアたみぃぞ』

 

17回目

ボックス ボックス名
ボックス3 『ついゥはぇぃたも』
ボックス8 『ア l99』
ボックス9 『おVネルえりヤV』
ボックス10 『アアアあぃネム
ボックス11 『アアヒlみみ』
ボックス12 『ア l99』
ボックス13 『ぃぞけVネル り』
ボックス14 『アアア l99』

 

18回目

ボックス ボックス名
ボックス3 『ついゥはぇぃちも』
ボックス8 『アヌVあぎ』
ボックス9 ネムセl l99』
ボックス10 『アアアぞみぃぞ』
ボックス11 『アアつVネル』
ボックス12 『ア l99』
ボックス13 『えりいVFづうむ』
ボックス14 『アアアくぞるシ』

 

19回目

ボックス ボックス名
ボックス3 『ついゥはぇぃつも』
ボックス8 『アあぅるエ』
ボックス9 『えりぴV l99』
ボックス10 『アアアりネ リ』
ボックス11 『アアりムばl』
ボックス12 『アィみぃぞ』
ボックス13 『そVネル l99』
ボックス14 『アアアえりえV』

 

20回目

ボックス ボックス名
ボックス3 『ついゥはぇぃても』
ボックス8 『アFづうむ』
ボックス9 『 l99くぞるシ』
ボックス10 『アアアあぐ ぐ』
ボックス11 『アア l99』
ボックス12 『アosネル』
ボックス13 『えりとW l99』
ボックス14 『アアアたみ あ』

 

21回目

ボックス ボックス名
ボックス3 『ついゥはぇぃとも』
ボックス8 『アぃぞうV』
ボックス9 『るルたぅるムよl』
ボックス10 『アアアみみ あ』
ボックス11 『アア l99』
ボックス12 『アぃぞえV』
ボックス13 『えみるルたぐるム』
ボックス14 『アアアひlあみ』

 

22回目

ボックス ボックス名
ボックス3 『ついゥはぇぃなも』
ボックス8 『ア l99』
ボックス9 『ぃぞおVりネるル』
ボックス10 『アアア l99』
ボックス11 『アアあミたl』
ボックス12 『アいみぃぞ』
ボックス13 『 l99ちVぎふ』
ボックス14 『アアアよぴァば』

 

23回目

ボックス ボックス名
ボックス3 『ついゥはぇぃにも』
ボックス8 『ア l99』
ボックス9 『けがDばァsやぶ』
ボックス10 『アアア むあミ』
ボックス11 『アアおlァば』
ボックス12 『アけがDば』
ボックス13 『 l99trミB』
ボックス14 『アアアィCFば』

 

24回目

ボックス ボックス名
ボックス3 『ついゥはぇぃぬも』
ボックス8 『ア けけせ』
ボックス9 『いそゼ  l99』
ボックス10 『アアア いう 』
ボックス11 『アア えお 』
ボックス12 『ア l99』
ボックス13 『っぇ くシょ く』
ボックス14 『アアア l99』

 

25回目

ボックス ボックス名
ボックス3 『ついゥはぇぃねも』
ボックス8 『アぶめ く』
ボックス9 『リギこく l99』
ボックス10 『アアア bうい』
ボックス11 『アアシYうい』
ボックス12 『アどXうい』
ボックス13 『ネYういフYうい』
ボックス14 『アアア l99』

 

26回目

ボックス ボックス名
ボックス3 『ついゥはぇぃのも』
ボックス8 『ア   い』
ボックス9 『たv かとn  』
ボックス10 『アアアっv か』
ボックス11 『アア l99』
ボックス12 『アVv か』
ボックス13 『ねご く l99』
ボックス14 『アアアワボのく』

 

27回目

ボックス ボックス名
ボックス3 『ついゥはぇぃはも』
ボックス8 『アゾも う』
ボックス9 『 l99トグこく』
ボックス10 『アアアわそ う』
ボックス11 『アア l99』
ボックス12 『アアアアア』
ボックス13 『アアアアアアアア』
ボックス14 『アアアアアアア』

 

4)バイナリエディタ実行コードの設定


 

f:id:BZL:20190716073547p:plain

バイナリエディタを起動するためのコードになります。

このコードを呼び出した戦闘の終了直後にバイナリエディタが起動します。

ボックス ボックス名
ボックス2 『アォめリば l』
ボックス3 『ついィはちべみぅ』
ボックス4 『アリめヂ  l』
ボックス5 『さkすぶせべいふ』
ボックス6 『アむぇそぱ l』
ボックス7 『せFしぶ むあタ』
ボックス8 『アGタあむ l』
ボックス9 『あメあぅだメうべ』
ボックス10 『アあチミBィC』
ボックス11 『アア Vうい』
ボックス12 『アりぃ も』
ボックス13 『ぎせ うらい』

 

起動環境が整ったら後は好きなように遊んでください

 

おまけ


イベントスクリプトの実行


0x03000E40 <- 0x01
0x03000E41 <- 0x02
0x03000E44 <- 0x00000000(word)
0x03000E48 <- イベントスクリプトのアドレス(word)
0x03000E38 <- 0x00 ※このアドレスの上書きは必ず最後に行う