[Starlight] 最新版でも動く!?3.1.0化の方法を探る

Hack

Starlight

tkgstrator/Starlight
An enviroment for linking to Splatoon 2’s executable and implementing hooks. - tkgstrator/Starlight

Starlightとはスプラトゥーン上で任意のC++コードを実行できるツールのこと。

この「任意の」っていうのが非常に強力なんだな。

Starlightでできること

Starlight 3.1.0

この動画だと、以下の機能を実装しています。

  • WAVE3までの潮位とイベントを先読み
  • 合計取得赤イクラ数を表示
  • 現在金イクラをもっているかを表示
  • 現在のWAVEで納品した金イクラ合計数を表示
  • いままでのWAVEで納品した金イクラ合計数を表示

また、金シャケ探しのイベントが発生したときにはアタリ位置とゴール位置を表示する機能もついています、便利ですね。

Starlightの欠点

ただ、Starlightは仕様上バージョン3.1.0のスプラトゥーンまでしか対応していません。

それは、スプラトゥーン実行ファイルのシンボル名をビルド時に削除するようにしたためなんや。

時間をかければ最新バージョンでStarlightを動作させることも可能ですが、バージョンアップされてしまうとまたその作業をやり直すことになります。

なので、現段階で苦労して最新版に対応させる意味がないのです。

よって、少なくともスプラトゥーン2の最終アップデートがくるまでは「Starlightは3.1.0までしか動作させることができない」と認識しておくと良いでしょう。

Starlightの現状

Starlightは3.1.0までしか動作できないのですが、3.1.0がリリースされたのは2018年6月のことです。

それから一度でもアップデートしていたらもうスイッチ本体からアップデータは取り出せません。

昔は自分のスイッチの証明書を使ってPCで好きなバージョンのアップデータをダウンロードできるCDNSPっていうツールとかもあったんだけどね。

まあこれ、自身の証明書を送らなきゃいけないのでソッコーBANされると思います。

なので、3.1.0のNSPを習得する方法としてはスプラトゥーンのアップデートを3.1.0のままキープしてあるニンテンドースイッチを探してくるしかないのです。

もちろん普通のユーザであれば自動アップデート機能を有効化してあると思うので、このバージョンで維持している人が一体どのくらいいるのかという話になります。

ちなみに、3.1.0以下であればStarlightは動作するので、1.0.0に下げることで遊ぶことは可能です。

最新バージョンでStarlightを動かす

ところが実は最新バージョンでもStarlightを動作させる方法はあるのです。

それはatmosphereが備えるLFSという仕組みを使った疑似ダウングレードを利用する方法です。

atmosphereを含むニンテンドースイッチ用のCFWにはLFS(Layered File System)と呼ばれる、本来は暗号化されたゲームデータを参照するべきところを、SDカード内のファイルに参照先を変更するシステムが備わっています。

Layered File System

スプラに限らず、Switchのゲームの実行ファイルであるmainはプログラム起動時にNCAと呼ばれるゲームファイルをまとめたコンテンツファイルにアクセスしています。

で、大事なことはこのNCAというのは暗号化されている上にものすごく巨大なファイルです。スプラの場合だと大体3GBくらいあります。

こういうファイルを作成する必要があった

ということは、例えばこのFileAを改造してFileA’に置き換えたいとします。従来の方法であれば、このNCAを抽出して、暗号化を解除してFileAを取り出し、それを改造してFileA’にした上でまた暗号化してNCAを作成しなければいけませんでした。

ところがLayered File Systemを使えば、mainが本来アクセスするはずのNCAファイル内のFileAではなく、直接SDカード内の暗号化されていない(ここが大事!)FileA’を参照することができます。

このシステムにより、ニンテンドースイッチではModを簡単に導入することができるのです。

要するに、NCAリパックと再暗号化が不要になった!全部のファイルを用意する必要もないしお手軽なのよね。

LFSで全てを置換する

先程の例ではFileAを置換しましたが、LFSは全てのファイルを置換することができるのでmainすらも置き換えることができます。

LFSで疑似ダウングレード

このとき注意しなければいけないのはダウングレード用の3.1.0のファイル(RomFS)はなるべくパック(バイナリ化)しておいた方がいいということです。

そうであれば、RomFSの先頭アドレスがわかるだけでmainは高速に全てのファイルにアクセスできます。フォルダにしてしまうと「このファイルはここ、あのファイルはそこ」のようにランダムアクセスが発生することがあり、ゲームのパフォーマンスに影響がでます。

で、まあここまでをまとめると3.1.0用のmain(ExeFS)ファイルと、RomFSがあればLFSをつかって擬似的にダウングレードができるということです。

5.1.0でStarlightの動作成功

するとこんな感じで任意のバージョンをあたかも3.1.0のようにブートすることができ、その結果としてStarlightを動作させることができます。

この手法のメリット

でもこれ「3.1.0のNSPをインストールするのと何が違うん?」と思われる方もいると思います。自分も最初はそう思っていました。なので、メリットを解説していきます。

アップデートを任意に行える

ニンテンドースイッチは「インターネットに接続する」「新しいバージョンのアップデータを適応する」「新しいバージョンのセーブを読み込む」などをするとそのゲームを起動するための最小のバージョンが更新されます。

つまり、3.1.0のNSPをインストールして3.1.0で遊んでいて「最新版も解析したいな」と思って5.2.0のアップデータをインストールしてしまうと、その後3.1.0にダウングレードしてもチェックに引っかかってアップデータを促され、3.1.0を起動することができないのです。

これをリセットする方法は本体の初期化以外にありません。

ところがLFSによるダウングレードは元のスプラのバージョンがいくつであっても強制的に3.1.0化することができます。1.0.0でも5.2.0でも3.1.0として遊ぶことができるのです。

全てのリージョンで対応できる

個人的に最も嬉しかったのはこれです。ぼくは北米版の3.1.0のNSPしか所持していないので日本版やEU版でStarlightを動作させることができませんでした。

それはNSPはインストールできるスプラのリージョン(正確にはTitle ID)が決まっているためです。北米版のアップデータを日本版にインストールすることはできませんし、もちろん逆もできません。

ところがこの手法ではNSPからNCAファイルを抽出してバイナリ化したファイルを利用します。スプラは全リージョンでNCAの中身がほぼ99.9%以上同じなので(違うのはRegionLangMask.txtのみ)、いずれかのバージョンで3.1.0を所持していればこの手法を使うことができます。

体験版でもできる

スプラ2の体験版が5/10まで配信されていましたが、あの体験版は中身が完全(もちろんRegionLangMask.txtは除く)に5.2.0と同じです。

体験版の制限はイカッチャとヒーローモードが遊べないことだけ!

なので、体験版を製品版に変更する手法を使うことで体験版を3.1.0化することができます。

体験版を3.1.0化することで、国内版は最新のバージョンのスプラの解析に回せるというわけです。つまり、簡単にスプラの解析環境を増やせるということですね。

3.1.0化の方法

で、本末転倒なのですが、結局のところいずれかのリージョンの3.1.0のNSPが必要となります。

そして、NSPを展開したNCAから3.1.0のアップデータをバイナリ化する必要があります。そのコマンドは紹介してもいいのですが、ここではめんどくさいので割愛します。

3.1.0化に必要なバイナリ

まあ何らかの方法で3.1.0のRomFSとExeFSのバイナリを取得したとしましょう。このとき、ファイル構成は以下のようになっているはずです。

exefs/main
exefs/main.npdm
exefs/rtld
exefs/sdk
romfs.bin/00
romfs.bin/01

romfs.binはアーカイブ可能なフォルダで、その中にromfsをパック化したファイルが入っています。二つに分割されているのは、3.1.0のRomFSは4GB以上あるのでFAT32で扱うことができないためです。

romfs.binがアーカイブ可能なフォルダなので、これをSDカードにコピーするとFAT32環境においてもあたかもromfs.binという一つのファイルが存在するかのように扱えるのです。

ここまでできたらあとはこれらのファイルをSDカードにコピーするだけです。

Title IDは以下のとおりですので、atmosphere/contents/titleid/にそれらをコピーします。

"JP": '01003C700009C000'
"US": '01003BC0000A0000'
"EU": '0100F8F0000A2000'
'TrialJP20': '0100998011330000'
'TrialUS20': '01002120116C4000'
'TrialEU20': '01009240116CC000'
北米体験版を3.1.0化したところ

追加でファイル置換したいとき

で、現状exefsとromfs.binをコピーしただけだと純正の3.1.0化になります。

なのでRomFSのファイル置換による改造が一切効いていない状態です。そういうときはいつもと同じようにromfsというフォルダを作成し、その中にModのファイルを突っ込みます。

romfs.binよりもromfsフォルダのほうが優先されるので、3.1.0化から更に置換することでMod環境をつくることができます。

記事は以上。

コメント

  1. 匿名 より:

    僕は3.1.0のRomFSとExeFSのバイナリを持ってないからできないや

タイトルとURLをコピーしました