NoexsによるNintendo Swtichの改造とは

Noexsとは

Githubに載っている説明によればマルチプラットフォームのグラフィカルリモートデバッガーだそうだ。

なんだか横文字がいっぱい並んでいてよくわからない感じなのだが、まあ結局のところチートコードを探すツールだと思ってもらえばよい。

チートコードといえばIPSwitchやEdizonなども挙げられるわけだが、どこが同じでどこが違うのか簡単に解説していこう。

理解が不十分なので間違っていたらすみません。

コードの種類

大雑把に分けてコードは二種類存在します。

ZiT(@ZiT866)氏はより細かく分類して三種類としていますが、まあおおざっぱには二種類みたいなもんです。

ちなみに氏のブログではNoexsを使ったコードサーチについて事細かに解説されているぞ!あとでぼくも検証したいですね!!

メモリアドレスの検索・改変

最も有名な改造がメモリアドレスをサーチして値を変更する類のコードでしょう。

プログラムは実行される際に実行するのに必要なだけのメモリを確保します。

賢いプログラムだと動的に必要なメモリの量を切り替えるのですが、コンシューマゲーム機だと同時にいくつものプログラムが走らないので(多分)毎回固定のメモリを確保しています。

これはまあ簡単にいえばカレンダーにおける予定の確保と一緒で、ゲーム起動時に一週間分の予約を最初に埋めてしまうということですね。

ただ、メモリのどのあたりに容量を確保するかはわかりません。

一週間分の予約は上旬かもしれないし、下旬かもしれんってことよね。

でもなんで毎回メモリの違う場所に予約いれちゃうの?同じ方が楽じゃない?

それは常に同じメモリアドレスを使うとバッファオーバーフロー攻撃をされてシステムが乗っ取られやすくなるからなんよね。その対策としてASLRという仕組みがあるわけで。

ただ、一週間の予定は「一日目がピクニック、二日目がハイキング」のように決まっているので、予約の一日目が何日であるかさえわかればあとは初日からのズレ(経過日数)でその日に何が行われるかは求められます。

例ではピクニックなどを用いましたが、実際のゲームでは「一日目パラメータを読み込む」「二日目にキャラクターのHPを設定する」のような感じで動作しています。

賢い人はもうわかったと思いますが、この二日目のHPを設定するというコードを上書きしてしまえば自分の好きなHPの値を読み込ませることができるようになるわけです。

このとき、初日(先頭アドレス)からのズレのことをオフセットというんだぞ。

要するに、このタイプのコードで必要なものは「プログラムが確保したメモリの先頭アドレス」「オフセット」「書き換えたい値」の三つなわけです。

IPSwitchによる改変

EdizonやNoexsが予約されたメモリの値を改変してチートを実行するのに対して、IPSwitchによるゲームの改造はプログラム自体を(パッチを用いて)書き換える手法になります。

ゲームを何度起動させてもゲームの実行ファイル自体は変化しないので、どこにどんな値が入っているかなどは全く考える必要がありません。

また、ゲームそのものを改変するので理論上IPSwitch形式のコードで実行できないものはありません。

まあでも実際にはプログラムのサイズとか、書き換えできる命令数とかの問題があるんだけどね。

ある特定のボタンを押したときにコードが実行される〜みたいな感じのも作成するのがめちゃくちゃ大変です。

というように、万能であるがゆえにめんどくさいのでメモリサーチでできるならそっちを使ってしまったほうがいい場合もあります。

例えば壁抜けチートなら壁にあたっている判定を常にFalseにすればいいし、ジャンプの高さを変えたいなら空中にいる判定をFalseにするとかジャンプの高さを無限にするとか、重力の値を0にするとかいろいろ解決法があるぞ!

というわけで、ぼくはメモリサーチよりもパッチの方が弄っていて楽しいので今ところはこっちばっかりやっています。

まとめ

調べてみたところNoexsは結構面白そうな感じなので、コードの一つや二つくらい探してみようかと思います。

日本語の情報がないゼロから始めるのはけっこう大変なのですが、前任者の方もいるので割と簡単に見つけられるのではないかとタカを括っていたりします。

おカネやサザエの数を変えるくらいのコードなら比較的簡単だなあと思いつつ、そんなのはSplatHex使ったほうが早いよねとも思っていたりします。

で、せっかくなのでこっそり5.0.0で使えるスプラのコードを一つ載せておきます。

// Number of Active Players 4 [tkgling]
@disabled
00743C80 80008052

有効化するとサーモンランで回線落ちなどしてメンバーが減っていても常に四人分のノルマを要求されます。
あと、ワンオペでも夜イベントが発生するようになります。

意味ないじゃん!!!

あ、このコードをちょっと変えると(多分)ゼンメツしても即失敗扱いにならなかったりできるよ。全員やられたら復活できないからその時点でノルマが足りてなかったら最終的に失敗になるけど。

またそのうちコードちょくちょく公開していきますね。

記事は以上。