【ブログリレー】時のオカリナのメモリ書き換えバグ
初めに
今回の記事ではRBAの原理、メモリ構造などについて説明します
Bビンセットについては何も書きません。
もう待ちきれないよ、バグの説明を早く出してくれ
というせっかちな方は前書きなんて見なくていいです
今回は新入生向が読むということで真面目に解析関連の記事を書きます
僕はゲーム解析とかゲームばっかりやっています、興味があれば是非このサークルに入って下さい
特に興味がない人でも今回を気に興味持ってください(提案)
新入生へ
上の文と一部重複してしまうのですがもう一度
僕は基本的にゲームを普通に遊んだり特殊な遊び方をしたりしています
ゲームが大好きという方でその上プログラムに興味があるという方は是非このサークルへ来てください
自分のノートパソコンのスペック
CPU:Core i5-8250U
GPU:UHD Graphics 620
メモリ:8.00 GB
ストレージ:SSD 256GB
ReversBottleAdventure
無数にある時オカのバグのなかでも凶悪度が高いRBAについて解説します。
リバースボトルアドベンチャー (Reverse Bottle Adventure)、通称 RBA
時のオカリナはスタイリッシュ・ボトル。アクションと呼ばれるほどあきびんを酷使します。
ビンアイテムを B にセットすることにより、各ビンアイテムの内部 ID をそのビンとは関係のない場所に上書きするバグ技です。
時オカの動画で空き瓶に何か詰めて怪しいことをしているのを見たことがある人は分かると思います。
まず時オカではC左、C下、C右にアイテムを自由にセットできますが、
Bボタンは剣(たまに釣り竿とか)で固定されています。
しかし、Bボタンを変更するバグを使えばBに空き瓶をセットすることができ、これが全ての元凶です。
そして、時オカではC左、C下、C右のアイテムIDとアイテムがある場所(以下アイテムスロット)の二つあります。
BボタンにもアイテムIDはありますが、アイテムスロットがありません。
アイテムID :セットされているアイテムの番号(例、デクの棒なら0、デクの実なら1)
アイテムスロット:セットされているアイテムがあるスロット番号(例、デクの棒なら0、デクの実なら1)
*アイテムIDとアイテムスロットは必ずしも一致するとは限らない
例、時のオカリナ(アイテム)のアイテムIDは8、アイテムスロットは7
B | C左 | C下 | C右 | C左 | C下 | C右 |
8011B1D0 | 8011B1D1 | 8011B1D2 | 8011B1D3 | 8011B1D4 | 8011B1D5 | 8011B1D6 |
*自分が持っているのがバージョン1.2なのでこのアドレスはv1.2のものです、v1.0、v1.1は知りません。
*すべて1Byteの符号なしデータです、俗に言うU8型(unsigned int 8)
十六進数で見た方が分かりやすい
ここで問題なのは「あきびん」にモノを入れた時の処理です。
例えばC左に「あきびんA」がセットされていた時「あきびんA」があるスロットは18、アイテムIDは20なので
アイテムID | アイテムスロット | |||||
B | 14 | C下 | C右 | 18 | C下 | C右 |
となります
*C右などは省略、あきびんは4つあるのでとりあえずABCDで分けて考える
そしてこの時にあきびんに虫(アイテムID29)を入れると
C左(アイテムID)の値を29に書き換え、C左(アイテムスロット)すなわち
C左のアドレスに3増加した場所を参照しスロット18番目も29に書き換えます。
0x11B1D1(アイテムIDC左) + 0x03 = 0x11B1D4(アイテムスロットC左)
アイテムID | アイテムスロット | スロット18 | |||||
B | 29 | C下 | C右 | 18 | C下 | C右 | 29 |
*[0x]は十六進数を意味します
*通常個別に宣言された変数をアドレスの加算で管理するのはないと思う。
それにもかかわらずアドレスを3加算するという処理がされているので
配列もしくは構造体で定義されていると考えられます。
他の可能性ではコンパイラの仕様の違いが考えられ、この場合は任天堂は悪くないことになりますが
その他に散々やらかしてるので任天堂はドジっ子という事実は変わりません
このアドレスを3加算するという処理、Bボタンにアイテムスロットが無い、アイテムIDとアイテムスロットは必ずしも一致するとは限らない
この3つの現実が協力して時のオカリナを破壊しています。
次にBボタンにあきびん、C右に爆弾(アイテムID2)があるときを考えてみましょう。
アイテムID | アイテムスロット | スロット2 | |||||
20 | C左 | C下 | 2 | C左 | C下 | C右 | 2(爆弾) |
この時Bボタンのあきびんに虫を入れると、
0x11B1D0(BのアイテムID) + 0x03 = 0x11B1D3(C右アイテムスロット) なので次のようになります。
アイテムID | アイテムスロット | スロット2 | |||||
25 | C左 | C下 | 29 | C左 | C下 | C右 | 29(虫) |
なんだこれは・・・。たまげたなあ
これは「C右のアイテムのIDに対応したメモリを書き換えることができる」
ということを意味しています
さらにアイテム欄を書き換える以外にも持ち物の個数、一部のダンジョンのアイテム、持ち物のフラグ、その他諸々変更できます
あーもうめちゃくちゃだよ
実演
今日はスペシャル動画を用意したぜ
終わり
時のオカリナを知らないという方にとっては意味不明だと思います。
もし知っていてもただでさえ意味不明なバグなのに下手くそな説明をしてしまったので訳が分からないという方が多いと思います、そんな方は是非コメントしてください。
新入生は是非一度遊びに来て下さい。
次回は何かポケモンのTASの記事書くらしいですよ…
コメント入力