ポケットモンスターシリーズのバグ技についてまとめます。

概要

エメラルドで穴抜けの紐を使って好きなマップにワープします。
今回は例としてたんじょうのしまにワープします。

ボックス内アイテムを利用して任意コードを実行しています。

準備

ボックス内にこのアイテムを並べます。
場所アイテムコード個数
40個目0x203A512個
41個目0x301A18689個
42個目0x600848624個
43個目0x56C8518個
48個目0x030021813個
49個目0x0E00255個
50個目0x0008いくつでも



適当なポケモンに技0x642Dを覚えさせます。
SectionIDの先頭が10になるようにレポートを調整します。

バトルアニメをオン、あなぬけのヒモを用意します。

実行

適当なダンジョンに入りポケモンとバトルします。
技0x642Dを使い倒す


バトル終了後にあなぬけのヒモを使いダンジョンから脱出します。


解説

技のアニメーションをみることで任意のコードを発動させています。
任意コード実行(ACE :Arbitrary code execution)とは簡単にいうとゲーム内のデータからスクリプトを作り起こしていることで、この現象自体は決してチートや改造ではありません。

今回の例はあなぬけのヒモの脱出先の2byteを書き換えるコードを作りました。

技0x642Dのアニメーションは0x0E005555になっています。
このアドレスはセーブデータのボックス内のアイテムの48個目からのコードとなっています。

0x0E005555 :03 35 55 00 0E FF 00 08

になるようにボックスに道具を預けます。
c03のスクリプト
03 XX XX XX XX YY ZZ 08
XX :飛ぶアドレス
YY :Z軸の操作?
ZZ :モーションの個数
08 :アニメーションを終了させる
飛ぶアドレスはボックス内でなくとも好きなアドレスを指定できます。
今回は同様にボックス内アイテムと同じ箇所(0x0E005535)に設定しました。

0x0E005534 :3A 20 00 02 1A 30 01 49 08 60 F0 BD C8 56 06 02

になるようにボックスに預けます。
203A mov r0, #0x3A
0200 lsl r0, r0, #0x08
301A add r0, #0x1A
4901 ldr r1, [$0E005540] (=$020656C8)
6008 str r0, [r1, #0x0]
0x20656C8はあなぬけのヒモの脱出するマップを指定するアドレスであります。
ここにたんじょうのしまのマップIDとNoである1A 3Aを入力しています。

石の洞窟で行った場合は00 15 FF 00が1A 3A 00 00に書き変わります。

技0x642Dの詳細
名前の長さ :191桁
頭文字 :00( )
威力 :52
命中率 :193
PP :62
確率 :51
タイプ :34
追加効果 :38 (一撃必殺)
一撃技の成功の判定には命中率が使われ確率は関係ないです。
0x0E005555になる技はいくつかあるがもっとも安定して使えるのがこの技でした。

SectionIDとはセーブデータの名前のようなものであり、エミュレータのメモリビュアーの0x0E000000から見ることができます。
3世代のセーブデータは14個のセッションにわけられています。(ここの詳細は割愛)
0~13までのセッションは2回レポートするたびに2回進みます。
つまり、奇数ズレを起こしていた場合は絶対に成功することがないです。
例 :
0 1 2 3 4 5 6 7 8 9 10 11 12 13
とセッションが並んでいた場合に2回レポートすると
12 13 0 1 2 3 4 5 6 7 8 9 10 11
となる
これらの準備を終えたらバトルにはいり技アニメーションからスクリプトを発動させます。
あなぬけのヒモを使い脱出すればたんじょうのしまへいけます。

実機での可能性

外部ツールを使わずにこの方法を再現することは限りなく不可能に近いです。
要因として
・アイテムを用意することが難しい
・SetionIDを確認する術がない
・RAMでアドレスが変動するため常に1/32のランダム要素がつきまとう
ことがあげられます。

ただしエミュでメモリビュアーなどを使いながら行うことは十分にできます。

アドレスのまとめ

今回のバグ技で参考になりうるアドレスをまとめます。
アドレス内容サイズ
0x02025B44ボックス内アイテムアイテムコード2byte 個数2byte
0x020656C8あなぬけのヒモのマップの指定先マップID1byte マップNo1byte 座標?1byte?
0x082772F8技アニメーションがまとめられている4byte
0x0E005555技0x642Dのアニメーション

そのほか

便利なファイルやluaスクリプト

SetionIDを表示させます(超適当で汚いことは許して・・・)
function Setion_ID()
	ID0  = memory.readbyte(0x0E000FF4)
	ID1  = memory.readbyte(0x0E001FF4)
	ID2  = memory.readbyte(0x0E002FF4) 
	ID3  = memory.readbyte(0x0E003FF4) 
	ID4  = memory.readbyte(0x0E004FF4) 
	ID5  = memory.readbyte(0x0E005FF4) 
	ID6  = memory.readbyte(0x0E006FF4) 
	ID7  = memory.readbyte(0x0E007FF4) 
	ID8  = memory.readbyte(0x0E008FF4) 
	ID9  = memory.readbyte(0x0E009FF4) 
	ID10 = memory.readbyte(0x0E00AFF4) 
	ID11 = memory.readbyte(0x0E00BFF4) 
	ID12 = memory.readbyte(0x0E00CFF4) 
	ID13 = memory.readbyte(0x0E00DFF4) 

	gui.text(5,150,string.format("%d %d %d %d %d %d %d %d %d %d %d %d %d %d",ID0,ID1,ID2,ID3,ID4,ID5,ID6,ID7,ID8,ID9,ID10,ID11,ID12,ID13))
end
gui.register(Setion_ID)


アニメーションのアドレス65536個
https://ux.getuploader.com/almond/download/9
管理人のアップローダよりダウンロードしてください

動画

解説がなく垂れながしではありますが実際にバグ技を行っている動画を作りました。
https://youtu.be/KG4X_l7FOos

このページへのコメント

ふんいきで

1
Posted by のり 2019年12月21日(土) 08:54:28 返信

技0x642Dはどう覚えさせるのですか?

4
Posted by もも 2019年07月05日(金) 19:33:19 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます