最終更新: pomegjapan 2019年05月07日(火) 10:19:00履歴
技のアニメーションをみることで任意のコードを発動させています。
任意コード実行(ACE :Arbitrary code execution)とは簡単にいうとゲーム内のデータからスクリプトを作り起こしていることで、この現象自体は決してチートや改造ではありません。
今回の例はあなぬけのヒモの脱出先の2byteを書き換えるコードを作りました。
技0x642Dのアニメーションは0x0E005555になっています。
このアドレスはセーブデータのボックス内のアイテムの48個目からのコードとなっています。
0x0E005555 :03 35 55 00 0E FF 00 08
になるようにボックスに道具を預けます。
今回は同様にボックス内アイテムと同じ箇所(0x0E005535)に設定しました。
0x0E005534 :3A 20 00 02 1A 30 01 49 08 60 F0 BD C8 56 06 02
になるようにボックスに預けます。
ここにたんじょうのしまのマップIDとNoである1A 3Aを入力しています。
石の洞窟で行った場合は00 15 FF 00が1A 3A 00 00に書き変わります。
技0x642Dの詳細
0x0E005555になる技はいくつかあるがもっとも安定して使えるのがこの技でした。
SectionIDとはセーブデータの名前のようなものであり、エミュレータのメモリビュアーの0x0E000000から見ることができます。
3世代のセーブデータは14個のセッションにわけられています。(ここの詳細は割愛)
0~13までのセッションは2回レポートするたびに2回進みます。
つまり、奇数ズレを起こしていた場合は絶対に成功することがないです。
あなぬけのヒモを使い脱出すればたんじょうのしまへいけます。
任意コード実行(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のランダム要素がつきまとう
ことがあげられます。
ただしエミュでメモリビュアーなどを使いながら行うことは十分にできます。
要因として
・アイテムを用意することが難しい
・SetionIDを確認する術がない
・RAMでアドレスが変動するため常に1/32のランダム要素がつきまとう
ことがあげられます。
ただしエミュでメモリビュアーなどを使いながら行うことは十分にできます。
今回のバグ技で参考になりうるアドレスをまとめます。
アドレス | 内容 | サイズ |
---|---|---|
0x02025B44 | ボックス内アイテム | アイテムコード2byte 個数2byte |
0x020656C8 | あなぬけのヒモのマップの指定先 | マップID1byte マップNo1byte 座標?1byte? |
0x082772F8 | 技アニメーションがまとめられている | 4byte |
0x0E005555 | 技0x642Dのアニメーション |
SetionIDを表示させます(超適当で汚いことは許して・・・)
アニメーションのアドレス65536個
https://ux.getuploader.com/almond/download/9
管理人のアップローダよりダウンロードしてください
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
https://youtu.be/KG4X_l7FOos
このページへのコメント
ふんいきで
技0x642Dはどう覚えさせるのですか?