前書き(2021/12/31):ポケモングリッチ研究の第一人者デテロニー氏による『ダイパ』ACEの解説記事が公開されました。日本勢が開発した実機セットアップやACEの応用例が十全に取り扱われています。実際にACEで遊びたい方はこちらを参照してください。
比較すると、以下の記事は実践ではなく歴史語り(技術の非直線的発展)に重点が置かれています。また海外勢の研究の上に日本勢による追検証が重なり、文章内に多層の混乱が見られますが、敢えて整理していません。歴史的資料として残しておきます。
雑多であるがゆえにレファレンス集・小ネタ集として役立つかもしれません。デテロニー氏の解説記事とほとんど内容・切り口が被っていないことも付記しておきましょう。
グリッチの研究史は面白い、ということが伝われば幸いです。以下、本編。
序(2021/11/22)
2021/11/19にswitch用ソフト『ポケットモンスター ブリリアントダイヤモンド・シャイニングパール』(以下、BDSP)が販売されました。オリジナル版はバグまみれのゲームとして有名ですが*1、リメイク版もバグにあふれた楽しいゲームのようです。ゲーフリの開発力大丈夫かマジで。*2
BDSP発売の直前、とある動画がひっそりと投稿されていました。グリッチハンターたちが最近達成した旧作『ポケットモンスター ダイヤモンド・パール』(以下、DP)における任意コード実行(Arbitrary Code Execution : ACE)の解説動画です。
ポケモンの任意コード実行といえば第一世代『ポケットモンスター ピカチュウ」で遊びつくす次の動画が有名でしょうか。任意コード実行の威力を端的に示す動画でもあります。*3
https://www.youtube.com/watch?v=Vjm8P8utT5g&ab_channel=MrWint
バグポケを捕まえたりエンディングに直行するのはお茶の子さいさいで、テトリスを始めたりゼルダを始めたりマリオを始めたりPortal ED曲「Still Alve」を演奏したり。原理的には実機で再現可能というのが重要です。
第一世代、第二世代ときて、第三世代での任意コード実行が達成されたのが2014年のことでした。
https://www.youtube.com/watch?v=cFS6gsrD-9Y&ab_channel=TheZZAZZGlitch
では第四世代ではどうなのか? バグだらけのゲームだしACEも簡単にできるのか? それともゲームハードがDSに進化しプログラミングもよりセキュアになっている分ACEは困難なのか?
この問いに対する答えが冒頭の動画『Arbitrary Code Execution in Pokémon Diamond and Pearl」です。結論から言うと、ACEは可能であり、その実装は2006/9/28の発売から15年におよぶ苦難の道のりでした。
以下では解説動画を自分なりに解説・抄訳します。副読テキストとしてお使いください。
[重大な注意点/危険な曲がり角]
残念ながら元動画自体に細かい(しかし肝心な)数値に関する誤植がたびたび含まれています。模倣する方は十分注意してください。以下では大枠を記述することを優先し、細かい数値に関してあまり書かないようにします。もし書いてあったとしても裏付けが取れていない数値だと思ってください。
動画投稿者(RETIRE氏)としても「これを見ればASE/ACEが出来るようになる」ところまで持っていくつもりはないのだと思います。あくまで概要をつかむための報告動画なのでしょう。加えてBDSP発売を締め切りとしており、あまり校正する時間がとれなかったらしいです。
とにかく実機で任意コード実行がしたい、セットアップが知りたい、という方は本稿冒頭「前書き(2021/12/31)」や末尾「追記(2021/12/7~2022/3/8)」で紹介した各サイト・テキスト・動画をご覧ください。
ただし仕組みをある程度理解していた方が安全だと思います。そのための解説動画であり、この記事の拙訳です。
- 序(2021/11/22)
- 0:00- ASE
- 0:52- [リタイアトリック]
- 2:26- リタイアトリックの調査
- 4:34- (アルセウスと戦闘するスクリプトの例)
- 5:43- リタイアトリックの仕組み
- 6:41- リタイアトリックによるASE
- 8:21- エミュと実機
- 9:47- [オルトリタイア]
- 11:09- [リタイアトリック再び]
- 13:43- 技術的細部
- 15:06- [アイテムデータの検討]
- 18:42- バトルデータ0x22B5B91への書き込み
- 20:49- 乱数調整の可否
- 22:32- [実装上の問題]
- 24:28-
- 27:49- ASE to ACE
- 28:56- [アイテムデータ参照型ASE/ACEの実際の手順]
- 35:36- (謝辞)
- 訳注
- [reference]
- 余談:任意コード実行(ACE)の広がり
- 追記(2021/12/7~2022/3/8)
0:00- ASE
ポケモンDPのグリッチハンターたちが探していたのは任意スクリプト実行(Arbitrary Script Execution : ASE)でした。ASEとは、ゲーム内のスクリプト言語で記述できるイベントやスクリプトを自在に実行するグリッチのことです。
ACEと比べれば一段格が下がりますが、グリッチとしては十分な威力でしょう。例えば、クレジットワープしたりアイテム・ポケモンを生成したりメモリを任意に上書きすることがASEを通して可能になるはず。
ASEの最近の例としてGC版『ペーパーマリオRPG(英題:Paper Mario: The Thousand-Year Door)』におけるクレジットワープがあります
https://www.youtube.com/watch?v=NhL4O5jsJZs&ab_channel=SolidifiedGaming
0:52- [リタイアトリック]
ASEにせよACEにせよ、一般に2つのことが必要です。
①メモリに「payload = 実行したい命令」を書く
②グリッチでpayload を実行する
さて、ポケモンDPでのASE/ACEを可能にするかもしれない奇妙なグリッチが見つかっていました。「リタイアトリック(Retire Trick)」(2017 by ganix)と呼ばれるものです。
パルパークモードではメニューに「リタイア」というアクションが追加されます。Void(日本語では「なぞのばしょ」とも呼ばれるマップ外の暗黒空間)を通じてこれをパーク外に持ち出すと、その場所のマップスクリプトを参照して様々な現象を起こすのです。
クレジットワープはその中へ含まれます。より有名で印象的なのは、発売から11年年後越しに達成された「なぞのばしょアルセウス」(2017 by ganix)でしょうか。
2:26- リタイアトリックの調査
リタイアトリックの内実はよくわかっていませんでした。Runtimeに4つ未満のスクリプトを実行するマップでのみバグが起こることを除いて
2019年にFlederKiari氏が調査を開始し、中身と正確な効果が判明しました。
[基礎]
それぞれのマップは実行するスクリプトのリストを持っています。各スクリプトには複数の命令が描かれています。例:script xには「~との戦闘を始める」「~というテキストボックスを開く」の2つの命令がある。
スクリプトが実行される直前、offsetと共にメモリにロードされます*4。Offsetは本質的にスクリプトがメモリ内でどこにいるかを示します。
スクリプト実行時、Offsetの番号に従って4byteのアドレスを参照します。これにoffsetの番号を足したアドレスが、ゲームがスクリプトを実行開始するアドレスになります。
4:34- (アルセウスと戦闘するスクリプトの例)
5:43- リタイアトリックの仕組み
リタイアトリックは必ず4番目のマップスクリプトを実行します。では、スクリプトが4つ未満の時どうするのか?
この時、Offset Addressは1番目のスクリプトが実行しているアドレス、Offset Arrayは1番目のスクリプトの中身を見て決定され(本来1byteなのが4byteになってしまう)、これらの和で全く意図されていないところへ飛んでしまいます。
ただし、1番目のマップスクリプトの中身をいじれないので飛ぶ先をいじることもできません。ゲーム内には約530種のマップが存在するので、リタイアトリックで実行できる不正命令は高々530種ということになります。果たして、その中にASEに繋がるものは存在するでしょうか?
6:41- リタイアトリックによるASE
Martmists氏とRETIRE氏はデータがメモリにどのように格納されているかを2週間調査し、リタイアトリックで可能な命令を列挙しました。本質的にoffsetは56種類しかないようです。
その内、マップID390でのリタイアトリックでセーブデータ内のアドレスに飛べることが判明します。そこで管理しているのは世界中のきのみの育成状況で、これは(時間こそかかりますが)プレイヤーが自由に改変できる情報です。
これで(ポケッチの電卓の出力へ飛ぶことにより)理論的にはASEが達成されました。
8:21- エミュと実機
というのは嘘です。エミュではOKなのですが実機で再現できませんでした。実機のセーブデータではクラッシュするメモリ領域を参照して命令を書いていたせいです。*5
このことを踏まえて56種類しかないoffsetを再検討すると、残ったのは0種類でした。
リタイアトリックによるASE/ACEの可能性は潰えます。
9:47- [オルトリタイア]
さて、時は流れ2021年9月、活動を停止していたFlederKiari氏が復帰しました。FlederKiari氏が示唆したのは、「オルトリタイア(Alt-retire)」(2018)というグリッチの可能性です。パルパークモードを不正な場所に持ち出しながら6個のパークボールを使い切って自動リタイアすると、今度は3番目のマップスクリプトを実行するのです。
とある場所でオルトリタイアを行えば、PCで見る殿堂入りのデータを参照することができます。RETIRE氏が2日調査したところ、レベル20(※参照)のポケモンとPID(日本語で「性格値」と呼ばれる4byteの情報。乱数調整可能)によってメモリの任意の場所に飛ぶ命令が書けました。電卓と組み合わせればASEになります。
※:「レベル20」は画面上の十進数より。しかし0x16とも表記され、これを十進数に直すとレベル22のはず。どちらが正しいのか不明。→おそらく22の方が正しい。
ただし、オルトリタイアにおいて捕まえる6匹のポケモンは第三世代のカセットから連れてきたポケモンでないといけません。今回のASEはDSに2つのROMを差して初めて成立するのです。
ここが一番面白いところなのですが
「but many of us felt requiring gen 3 assistance was kind of cheating」(我々の多くは第三世代のカセットを使うのがある種のチート行為だと思ったので)*6、RETIRE氏はもう一度だけリタイアトリックを調査します。
※:オルトリタイアによるASEに関してはセットアップの細部を説明していません。以下で見るようにリタイアトリックの方に重点が置かれます。模倣するならオルトリタイアの方が楽な気はするのですが・・・
11:09- [リタイアトリック再び]
気付きは偶然のことでした。マップID:332と333の2つのマップはマップスクリプトが1つしかありません。以前の調査ではこの極めて特殊な状況で計算ミスがあり、実際のところここでリタイアトリックするとオルトリタイアで参照するアドレスに非常に近くなるのです。やはり殿堂入りのデータに飛びます。
13:43- 技術的細部
技術的問題が2つ。
①対応するマップは「なぞのばしょ」(元wi-fi accessible area)なのですが、英語版ROMだとメニューが開けません(できないことはないが実用的でない)。これは日本語初期版ROMなら回避できるので、以下では日本語初期版ROMに限定します。
②マップに入るとスクリプトが実行され画面が真っ暗になってしまいます(332/333の1番目のマップスクリプトによる効果)。これは0x101を実行することで対処可能です。
結局、次のようにすればよいのです:レベル20 (22?)でとあるPIDを持ったポケモンを用意して30回殿堂入り(※参照)します(30回殿堂入りして特定位置に特定レベル特定PIDのポケモンをおく?)。この後、とある場所でリタイアトリックを行えば電卓で入力した値をpayloadに流し込めるようになります。これでASEが完遂されました。
※:後になって判明したのですが、この「30回」という数値は「estimate」であって、実際のRETIRE氏のセットアップでは28回目/29回目にコードの種を仕込んでいたとか。
ただし、TASでも30回殿堂入りするだけで3時間かかります。以下ではもう少し早い別のセットアップを模索していきましょう。
15:06- [アイテムデータの検討]
殿堂入りのデータではなく、アイテムデータを参照するというのが基本アイディアです。特定のトレーナーと戦うと(なぜか)アイテムデータをセーブデータの参照できる範囲に持ってこれるのです。
「たいせつなもの」「わざマシン」「メール」「きずぐすり」「モンスターボール」とあるうち、後ろ3つによって任意の場所へ飛ぶ命令を書けるかもしれません。問題は調整が難しい前2つです。ここを通過できるか考えます。
ゲーム進行上どうしてもとってしまう6つの「たいせつなもの」のうち、3つのアイテムidはスクリプト命令として読むとクラッシュを誘発してしまいます。
幸運にも、これらを命令そのものではなく「命令に対するパラメーター」として読めるようなアイテムの組み合わせが存在しました。クラッシュは回避可能です。
「わざマシン」のうち「いわくだき(RockSmash)」がクラッシュを誘発します。これも「まもる(Protect)」のわざましんを4つ買うことで回避できます。
残りのアイテム欄で命令を書きます。
「メール」:なし
「きずぐすり」:416個のまひなおし
「モンスターボール」:マスターボール(ダミー)→25個のモンスターボール→339個のスーパーボール
※:モンスターボール0x19=25個としていますが、動画の22:02-を見ると0x1C=28個かもしれません。どちらが正しいか不明。→28個の方が正しいという報告あり。
18:42- バトルデータ0x22B5B91への書き込み
上記のアイテム欄により、0x22B5B91で指定されるバトルデータ内のアドレスへ飛ぶことが可能です。ASE/ACEの手順のうち2番目の「payloadを実行する」はできそうです。
では1番目「payloadをメモリに書きこむ」はどうか。
さて、一般にバトルの最中では戦闘中の行動に依存してメモリに次々と情報が書き込まれていきます。
特定の行動(メニュー開閉など)をしてからポケモンを交代することにより「交代先のポケモンの性格値」と「敵ポケモンの性格値」を並べて0x22B5B91に書くことができます。性格値は乱数調整で自由にいじれるので、ここに「jump (anywhere)」の命令を仕込めます。
[まとめ]
ややこしいので手順を確認しましょう。リタイアトリックでメモリ領域Aを参照します。Aには特定トレーナーとの戦闘によってアイテム欄の情報が書かれており、その中にメモリ領域B=「0x22B5B91で指定されるバトルデータ」へのjump命令が含まれます。メモリ領域B=0x22B5B91には戦闘中の行動によって「jump (anywhere)」の命令が書かれています。
(殿堂入りデータを使う場合、領域Aが殿堂入りデータによって書かれたpayloadで、ここに「jump (anywhere)」を仕込みます。アイテムデータ型は一段階迂遠になっているのです。)
20:49- 乱数調整の可否
アイテムデータ参照型のASE/ACEを行う場合、jump命令を書くための戦闘はセットアップの中盤以降にあり、セットアップの過程でリセットはできないので敵ポケモンの性格値を乱数調整するのはほぼ不可能に思えます。
幸運にも、移動するタイプの伝説ポケモン(実際使うのはクレセリア)は最初の遭遇時に性格値が決定され後に何回遭遇しても性格値は変わりません。よって、セットアップ前に予め調整しておき、クレセリアとの戦闘をセットアップに組み込めばよいのです
以上によりアイテムデータ参照型のASEの見込みが立ちました。
22:32- [実装上の問題]
リタイアトリックを使うのであれば、Voidを通じてパルパークからマップID332 or 333へ行かねばなりません。
バトルデータはメニュー内のどの項目を選んでも(メニューを開くこと自体は問題ない)リセットしても吹っ飛びます。バトルデータに命令を書き込んで以降は単に動き回ることしかできないのです。大丈夫でしょうか?
ここで助けになるのがRETIRE氏が2019年に見つけていた「レッジキャンセル(Ledge Cancel)」というグリッチです。自転車に乗りながらある程度の速度でジャンプします。このとき特定のサブピクセルでメニューを開くと、x座標が見かけからずれていくのです。
24:28-
筆者の英語力と知識の不足により技術的細部がよく分かりません。申し訳ない。
メモ:クレセリアとの遭遇のためにはx座標ずらしとその解除が必要? 特定位置でメニューの「せってい」を選びx座標ずれを解除すると、一時的に草むらと誤認する。1マスでも動けばまたvoid判定に戻るが、ここで方向転換だけでクレセリアにエンカウントすればよい。
つまるところx座標ずらしが必要なのはバトルデータに命令を書き込む前、メニューの項目を選べなくなる前のことなので、微妙に論理が繋がっていない? 細部が分からないせいで筋の通った翻訳ができない・・・
日本のグリッチハンターたちの議論を参照すると、voidでの移動は動的アドレスのせいでかなり困難な実装になるようです。
何はともあれ電卓で任意のスクリプトが実行可能になりました。エンディング直行、ポケモン、アイテム、金の無限増殖。
27:49- ASE to ACE
ASEで実行できるゲーム内のスクリプト言語は十分強い表現力を持っています。しかし、Martmists氏は更に一歩進みました。assembly instructionを上書きすることで、ACEが可能だと。
以上でポケモンDPにおけるACEが証明されました。
28:56- [アイテムデータ参照型ASE/ACEの実際の手順]
①クロガネシティからvoidに。特定の場所でレポートを書いてリセット
②自転車ジャンプを使ってx座標を特定回数(人間は130回、TASなら96回)ずらす。
③218ばんどうろで「ギタリストのジョニー」と戦闘、勝利。
④クレセリアと遭遇(性格値は①以前に調整しておく)。特定の操作を行いポケモン交代。クレセリアを逃走させる。
⑤パルパークへ。リタイアを持ち越す。
⑥約800歩でなぞのばしょ内の特定位置に到着。リタイアトリックを行う。
⑦ポケッチの電卓機能でコード入力開始(33:43-34:55)
⑧win
35:36- (謝辞)
訳注
訳注1:人物を参照するとき、音声は「MAP」なのに画面は「Martmists」と食い違っていることがある?
訳注2:クレジットワープするだけならもっと簡単な方法があるので、ASE/ACE的手法の採用によりRTAやTASが早くなるということは今の所無いと思われます。*7
訳注3:ASEの実機検証はRETIRE氏により確認済みです。(チートはセットアップを簡易化のみに使用)
Here's the verification for the new ASE setup, using cheats to make it faster/easier to test. More stuff is not shown or going on behind the scenes, which will all be explained in the video. Sorry for the profanity at the end, I was quite excited that it worked. pic.twitter.com/BEUqHVQMB1
— RETIRE (@RETIREglitch) 2021年10月9日
訳注4:2021/11/21 RETIRE氏がNPCを使ってSRM(Stale Reference Manipulation)することを考案したらしいです。しばらくは皆BDSPに夢中でしょうが、戻ってきたらこの方面で何か発展があるかもしれません。
[reference]
・DPP Script Commands
DPP Script Commands - Generation 4 - Project Pokemon Forums
第四世代のスクリプト言語一覧。
・RETIREglitch/Pokemon-Research
RETIRE氏が書いたドキュメント。本質的にはこれら全体が「ASE/ACEに関するドキュメント」。
研究者あるあるですが、基礎技術のドキュメントは書いてもそれらを組み合わせた応用技術のドキュメントは書かないかもしれません。「やるだけ」「組み合わせるだけ」「基礎のドキュメントを読み応用の概要を知ってなお手順が分からないようならそもそも挑戦しない方が安全」「書くのが面倒くさい」となるので。一般向けに報告動画も作ってしまったし・・・。今回のASE/ACEぐらい手順が複雑なら手元に何か残している可能性は高そうですが。
・【懐かしの】任意コード実行総合スレ2【バグ】
【懐かしの】任意コード実行総合スレ2【バグ】:ポケモンBBS(掲示板)
記事内でも述べた数値に関する誤植報告は随時反映していこうと思います。
・NEW Alt-RETIRE glitch - new method to catch darkrai/shaymin!
2018年の動画。ASEの前に修得すべき基礎資料。リタイアトリック並びにオルトリタイアについて理論と実践。
これは真似できると思います。ただし細かい数値に関しては英語版ROM限定かも。
余談:任意コード実行(ACE)の広がり
ここ数年で実用的に任意コード/スクリプト実行できるハードの壁を一つ突破した気がします。
N64(1996):ポケモンスタジアム(2017)、時のオカリナ(2019)、マリオストーリー(2021)
GC(2001):ペーパーマリオRPG(2021)、マリオサンシャイン(2021)
「バイナリエディタ」と揶揄される初代ポケモン/ゲームボーイに比べればソフト・ハード共にはるかにセキュアな設計・プログラミングをしているはずなので、ひとえに研究の賜物に思えます。マシンパワーの向上もエミュの精度向上や解析を通じて寄与していたりするかもしれません。あとはコミュニティの発展(人口増加・SNS化)も関係していそうです。
上の欄にはWii(2006)オリジナルの有名ゲームがまだありませんが、これも近い将来ACEされてしまうのでしょうか? それとも世代の壁が大きく立ちふさがるのか?
ポケモンに限ると次はDSの第五世代(BW/BW2)、3DSの第六世代(XY/ORAS)となるわけですが、ASE/ACEについて言及がないか軽く調べてみたところ
第五世代:設計がセキュアでコードが十分暗号化されているので厳しそう。そもそも現時点で大きなバグを聞かない。
第六世代:暗号化に欠陥があるので、可能性があるとすればそこを突くしかない。
といった感じらしいです。両方ともASE/ACE不可能か、可能だとして実現は第六世代が先になるかも。
Red, Blue, Green, Yellow, Gold, Silver, Crystal and Emerald all have native Arbitrary Code Execution. Gen 4 has the Void where you can catch an infinite amount of Arceus (that wasn't even released), Gen 5 is still solid, Gen 6 has major encryption flaws (see meme crypto) 2/?
— MAP (@shinyhunter_map) 2020年10月24日
一つ壁を越え、また一つ壁が見えつつある、という状況でしょうか。
追記(2021/12/7~2022/3/8)
任意コード(スクリプト)実行の新たなセットアップが提唱され、実機での再現性まで確認されました。エメラルドでの任意コード実行、殿堂入り30回など準備は多少必要ですが、十分人間に可能なセットアップです。
遂に実機でダイパの任意コード実行を達成しました
— アダン (@GEN4pomeg) 2021年12月6日
有志研究者の方々に感謝をしてもしきれない… pic.twitter.com/54jP7Rs0jz
方法①:殿堂入りデータを使う方法
(2021/12/10:実質成功率100%になったとか)
方法②:壁紙と殿堂入りデータを使う方法
方法②’:壁紙法のヴァリアント(改善版?)
全体的に、動画の二番目に紹介された「リタイアトリック-殿堂入り参照型」のセットアップの亜種です。更に①と②はvoid突入後同じセットアップになります。
void突入後の移動について新提案(2022/3/8)。「Wrong Warp」の活用。
The Japanese community has actually found the setup I had made for the HOF ASE setup, down to the PID I used. I only spoke a few words about it in my video so I am quite amazed about that. They implemented most of what I did to make it consistent, down to heapspraying.
— RETIRE (@RETIREglitch) 2021年12月8日
(拙訳)
私が作った殿堂入り型ASEのセットアップを(使用した性格値に至るまで)日本のコミュニティは実際に見つけました。私はビデオの中で少ししか話していなかったので、これにはとても驚きました。彼らはヒープスプレー*9まで含め、私が辻褄を合わせるために行ったことのほとんどを実装したのです。
実機なら特定性格値のポケモンは乱数調整よりエメラルドの任意コード実行で用意するのが確実です。
voidにおける移動は「アドレス空間配置のランダム化(ASLR:Address Space Layout Randomization)」が障害になります。DSぐらいのハードになるとセキュリティが厳しめ。つうしんサーチャーが必要になったり成功率が60-80%にとどまるのもASLRのせいです。
RETIRE氏により100%成功するvoid移動法も示唆されました*10が、途中26000歩や12000歩歩く場面があり1時間かかります(①②の方法は最大10000歩で15分程度)。
「リタイアトリック-殿堂入りデータ型」のセットアップについては以上で終わり。
動画の15:06- に扱われている「リタイアトリック-アイテムデータ型」のセットアップも手順通り行えば100%成功します。TASで12分弱。途中のレッジキャンセルも(サブピクセルとか言いつつ)訓練すれば人間にも可能とのこと。ただし目印無しに130回行わなければならないので、結局TAS onlyな気がします。クレセリアの性格値の乱数調整も実機でどのぐらいできるんでしょうか。
[その他の課題]
海外勢は日本語初期版以外のバージョン(海外版・日本語後期版)で任意コード実行をするモチベーションが高いと思います。現状可能なのはオルトリタイアのみ(一応レッジキャンセルを数万回以上行えばリタイアトリックでも可能?)。
最近(2022年2月)「オルトリタイアをエメラルド抜きで行う」ことにより、海外版でも単独ROMでASEが可能になったとか。人間向けセットアップは目下研究中。
https://twitter.com/RETIREglitch/status/1499799730355904519?s=20&t=wZWXxUsKZuZVQDMRBWMj-Q
他の第四世代、プラチナやHGSSでASE/ACEが可能なのかという問にも理論的興味がそそられます。
メモ:ASE/ACEの活用例
ここまでは主にASE/ACEのセットアップの話をしてきましたが、以下ではASE/ACEで何ができるかについて、掲示板やtwitterから理論的に非自明かつ面白そうなのをメモします。個人的備忘録。
「マーキングACE」
→汎用的な書き換えのフレームワーク。掲示板ではポケモン複製も応用として報告されていた。
「簡易メモリエディタ」
「バグ店」
「text viewer」
画面に文字を表示できるようになりました pic.twitter.com/clr3WxW2JD
— てぽん (@TeponPkmn) 2021年12月28日
「DP any% glitched (trades) RTA 」
ポケモンDP any% glitchedの新ルート提案です。現世界記録56:51(2021/12/30, by scoagogo)から30分以上の大幅更新!……ただしチートと改造以外何でもあり(具体的には他ROMでの事前準備)という過激な別レギュで。
類例として時オカを使ったマリオストーリーACEや昨今のドラクエ3 ACE any%が挙げられます。これらと同様speedrun.com等ではどう足掻いてもカテゴリ化できないスピードランになるでしょう。更に、これら2つが他ゲームを使用する際初期状態から始めているのに対して、DP any% glitched (trades) では事前準備も許可します。より先鋭化(悪化?)しているわけです。
事前準備含め計測すると「(エメラルドACE→)ダイパACE→本走」となるので、10時間ぐらいかかりそう。
本ROM起動時から殿堂入りまでのリアルタイムを競う場合、現状最速チャートなのは間違いありません。*11
まだこのチャートを実走している動画は見かけません。any% glitched (trades)の世界記録をとるのは画面の前の君だ!
「フラグ付きアイテムのおすそわけ」
ダイパの任意コードを利用して
— アダン (@GEN4pomeg) 2022年3月4日
プラチナ側にフラグ付きのオーキドの手紙を贈りました
非公式WiFiなんていらなかった…
(画像は全てプラチナ側) pic.twitter.com/HxtFPSN37E
2014年に「ニンテンドーWi-Fiコネクション」が終了してから長らく、第四世代で「オーキドの手紙」等の配信アイテムを新規入手する方法はチートか有志による非公式wi-fiしかありませんでした。
ところが、プラチナでの配信アイテムにダイパでの任意コード実行が使えるのです。
「テトリス」
ダイパでテトリスできました pic.twitter.com/MdAAtODCbp
— てぽん (@TeponPkmn) 2023年1月28日
*1:裏技投稿サイトワザップでの「なぞのばしょ」アルセウス等、詰みになる誤情報が一部の好奇心あふれる子供を泣かせました。なお「なぞのばしょ」アルセウス自体は後述するように2017年に達成されています
*2:どうも開発は外注らしいです。どちらかといえばクオリティコントロール・デバッグの問題。記事執筆後2021/12/02にver1.1.2で大方のバグが修整された模様。
*3:「任意コード実行」と呼ばれるものの中にはちょっとした命令しか実行できないものから本当に「任意」なものまでグラデーションがあります。第一世代はかなりヤバい方です。DPのACE自由度は今後の研究次第でしょうか。
*4:wikpediaより 「計算機科学において、オフセットは配列または他のデータ構造オブジェクトの中の、所定の要素または位置までの、先頭からの距離を示す整数である」
*5:ACEなどメモリ改変のグリッチを探す際、エミュの精度、というよりは理想的でない実機の謎挙動はたびたび問題になります。最近だと時のオカリナのWii VCにおけるSRM(Stale Reference Manipulation)は、逆にエミュで再現されていなかった実機の挙動により道が開けました
*6:言いたいことは分かるけどACEはルール無用だろ
*7:余談:Pokemon Diamond/Pearl Any% の世界記録は57:01(2021/3/6達成)。自転車と探検キッド取るまでの区間走みたいなものなのに1198回走って9回のみ完走。執念が怖い。
*8:『ルーンファクトリー』も2021年頃からかなり怪しい動きをしています。が、界隈の人口が少ないせいか全然話題になっていません。
ルーンファクトリー 新牧場物語 アイテム生成バグ解説 - YouTube
*9:Heap spraying攻撃の手順と原理解説 – 他人の空似
*10:以下はVoidmatrix discordの#glitch_bar参照。冒頭動画の説明文にURLがある
*11:ちなみにACE以前の2020年9月頃、「battle corruption」によっておそらくは同様のチャートが提案されていたようです。