3gxとコンソールの紐付け方法
今回は、3gxプラグインとコンソールを紐付けする方法を紹介します。これは、作成者側が許可したコンソールでのみ使用できるようにすることによって、二次配布を防止することが目的です。
利用者側の手順
- Hash Dumperをダウンロードします。
- zipファイルを解凍し、プラグインローダーの旧バージョンを使用している場合は0.5.1、新バージョンを使用している場合は0.6.0の中にある
HashDumper.3gx
を、任意のソフトで使用します。 - 3gxを起動すると、
Hash Dumper
というメニューがあるので選択します。Dumped.
と出れば成功です。 - SDカードのルートに、
hash.txt
というファイルが作成されるので、これを作成者に渡します。
作成者側の手順
以下のコードを、メイン関数の最初に入力します。
u64 hash = 0; CFGU_GenHashConsoleUnique(0, &hash); if (!(hash == 01234567890123456789)) //hash.txtの中身に書き換える return 0;
このとき、利用を許可したいユーザーのハッシュ値に書き換えるのを忘れないでください。作業が完了すれば、ビルドしたファイルを利用者に渡します。ここでビルドしたファイルは、この時に指定したユーザーのコンソールでしか使用できません。
最後に
いかがだったでしょうか?少し手順は面倒ですが、二次配布の防止にはつながると思います。
bootromのソース流出について考察
初めに
GBAtempで、3DSのbootromのソースコードが流出したことが発表されました。「そもそもbootromって何だ?」と思った方、少なくないと思います。今回はそれも含めて、今回の件を考察していきます。
bootromとは
bootromとは、3DSの起動プロセスの中で一番最初に起動される部分です。ROM(Read Only Memory)の名の通り、これは読み取り専用で、書き込み不可能です。
sighaxとは
derrek氏が発見した、bootromの脆弱性を利用したエクスプロイトです。これはbootromのRSA検証(署名検証)の脆弱性を利用したもので、ファームウェアに独自の署名を施すことによって、CFWを公式のファームウェアとして認識させることが可能になります。過去に主流であったA9LHは、システム更新によって修正される可能性がありましたが、先述した通りbootromには書き込み不可能なので、システム更新によって修正されることはありません。例として、boot9strapはこのsighaxを利用したブートローダーで、一般的にはこれを使用してLuma3DSを読み込みます。
今回の件の重要性
bootromが書き込み不可能であること、sighaxが既に公開されていることを踏まえると、今回の流出によってなにか新しいことができるようになるということは、基本的に無いように思います。しかし、流出内容によっては、今後何か動きが見られるかもしれません。いずれにせよ、bootromが3DSのいわば心臓部分であり、このソースコードが流出したことの重要性については分かっておいてください。
余談
Wolfvak氏は、今回の件についてこのように述べています。
I think it's worth mentioning these leaks most likely all come from the same source who obtained the files around 2018. It's not that the files are slowly being leaked off Nintendo, it's that they're slowly being let out to the general public.
「2018年に起こった流出と情報源が同じである可能性が高い。任天堂から徐々に流出しているのではなく、徐々に一般公開されているだけなのではないか。」ということです。つまり、今になって一般公開されただけであり、ソースコード自体は既に流出していた、というのがWolfvak氏の見解ですね。
真実は果たして…。今後も進展がありそうです。
野良ciaインストールの危険性
初めに
今回は、安易にciaをインストールすることの危険性について話します。記事に書いてあるまま、人に勧められるままにciaをインストールしたことはありませんか?実は、これは結構危険な行為です。
具体例
有名なhomebrewに偽装
homebrewのほとんどはオープンソースです。これは便利な反面、偽のソフトが出回る危険性があります。これらは、ソフトを起動することによって、何らかの意図しない動作を起こす場合があります。
今回は例として、Checkpointというhomebrewに偽装したプログラムを作成しました。以下の動画では、再起動後にNANDのロードに失敗していることが分かります。
NANDタイトルと同じtitleIDに設定されたソフト
これは、前述の偽装homebrewよりも危険です。全てのソフトはtitleIDで識別されるため、NANDタイトルとtitleIDが一致するものをインストールした場合、インストールするだけで本体が起動出来なくなることがあります。
対策
出処が明確でないものをインストールしない
日本の3DSユーザーは、ソースコードも含め、アップローダーでファイルを共有する傾向があります。匿名性が保たれるため、中には怪しいファイルも少なくありません。できる限り、出処が明確であるソフト(GitHubの公式リポジトリなど)を使用するようにしましょう。
NANDのバックアップをとる
実際、バックアップを省略したり、バックアップファイルを削除してしまう人が多い印象です。NANDが破損しても、バックアップファイルがあれば復元可能です。必ず残しておくようにしましょう。
movable.sedって何だ?
初めに
今回は少し技術的な話になります。皆さん、movable.sedって聞いたことありますか?CFW導入時に、Seedminerで使用されるファイルです。その際、こんな疑問を持ったことはないでしょうか?
- なんでID0が必要なの?
- なんでbotとフレンドにならなきゃいけないの?
今回は、この疑問を解決していこうと思います。
movable.sedとは
movable.sedとは、SDカードのタイトルの暗号化キー(keyYと言います)を含むファイルです。コンソール固有で、NAND(本体メモリ)に格納されています。CFW導入において、DSiWareの脆弱性を使用するためには、このファイルが必要です。CFW未導入の場合、直接movable.sedはダンプ出来ないので、ファイルを解析する必要があります。
movable.sedの構造
オフセット | サイズ | 内容 |
---|---|---|
0x0 | 0x4 | マジックナンバー(SEED) |
0x4 | 0x4 | フラグ(0x5が1の場合AES-MACが存在する) |
0x8 | 0x110 | LocalFriendCodeSeed_B |
0x110 | 0x10 | keyY |
0x118 | 0x4 | msed2(ランダムな数字) |
0x11C | 0x4 | msed3(ランダムな数字) ※実際には多少の法則あり |
0x120 | 0x20 | AES-MAC (システムフォーマットが行われた際に書き込まれるブロック) |
構造は上記の通りです。画像の黄色いマーカーの部分が、keyYの部分ですね。keyYを取得するためには、LocalFriendCodeSeed_Bの取得と、msedの特定を行わなければなりません。
keyYの取得
LocalFriendCodeSeed_Bは、実は案外簡単に取得出来ます。CFW導入済みの3DSとフレンドになっていれば、CFW導入済みの3DS側からダンプ可能です。botとフレンドになる必要があるのはこのためです。対象の3DSのLocalFriendCodeSeed_Bを取得するために、フレンドになるわけです。
では、msedの特定はどうやって行うのでしょうか?
ID0との関連性
ID0とは、SDカードのNintendo 3DSフォルダにある、32桁の16進数です。実は、ID0はkeyYのハッシュ値と関係があります。以下に、gm9スクリプトによる計算式を示します。
set HASH $[GM9OUT]/keyY.sha shaget 1:/private/movable.sed@110:10 $[HASH] fget -e $[HASH]@0:4 HASH1 fget -e $[HASH]@4:4 HASH2 fget -e $[HASH]@8:4 HASH3 fget -e $[HASH]@C:4 HASH4 set ID0 $[HASH1]$[HASH2]$[HASH3]$[HASH4]
上記の式から分かるように、まずmovable.sedの0x110から0x10バイト(これはkeyYの領域)のハッシュ値を、SHA-256で算出します。次に、算出したハッシュ値を4バイトごとに反転しながら、計0x10バイト取り出します。これを連結させた数値がID0です。
試しにこのID0.zipをダウンロードし、中にあるID0.gm9
をGodMode9で実行してみてください。下画面にあなたのID0が表示されるはずです。(算出方法は上記のコードと同じです。)
ID0はkeyYのハッシュ値と関係がある、つまり、ID0はkeyYが正しいことを証明する"材料"になります。msed自体の特定が難しくても、msedをbruteforce attack(総当たり攻撃)することによって、ID0を用いて"答え合わせ"ができます。
ID0の有用性が分かっていただけたでしょうか?
最後に
今回はmovable.sedについてまとめました。少しでも知識の材料になれば嬉しいです。
CTRPF 0.6.0 への移行手順
初めに
PabloMK7(mariohackandglitch)氏が、3gxを更新していましたので、移行手順を紹介します。
※新しい3gxを使用する際は、専用のboot.firmを、SDカードのルートに上書きしてください。
手順
1:リポジトリに移動し、zipファイル(緑のボタンから)をダウンロードし、解凍します。
2:以下のフォルダーまたはファイルを自分のプラグインフォルダーにコピーし、既存のものを置き換えます。
- Makefileを置き換える
- 3ds.ldを削除する
- 3gx.ldを置き換えるかコピーする
- Sources / bootloader.sを削除する
- Lib / libCTRPluginFramework.aを置き換える
- Includesフォルダーをコピーして、既存のファイルを置き換える
3:新しい3gxtool.exeを、C:\devkitPro\tools\bin
に配置します。
4:make re
コマンドを実行してください。(あるいは、それに当たるbuild.bat
がある場合は実行してください。)
トラブルシューティング
Q. couldn't open ~ .plgInfo
というエラーが出ています。
A . ~.plgInfo
の名前の部分を、プラグインのフォルダ名と同一にしてください。
最後に
以上の手順を怠ると、予期せぬエラーが発生する場合があるので、注意してください。
movable.sed復元手順(CFW必須)
CFW導入後、何かしらの理由でmovable.sedが必要になった場合の、SDカードへの復元手順です。
- GodMode9を起動。
- [1:] SYSNAND CTRNAND → private → movable.sedと移動する。
- Yでコピー後、最初の画面に戻り、[0:] SDCARD 内の任意の場所でYを押してペースト。
- メッセージが出た場合は、Copy path(s)を選択。
movable.sedについて https://www.3dbrew.org/wiki/Nand/private/movable.sed
CFW導入済み3DSのディレクトリ構成(SDカード)
時々質問があるので、SDカードのルートに配置されるファイル及びフォルダについて少し説明します。
※以下、TWL Menu++をインストールしている場合
ファイル or フォルダ | 説明 |
---|---|
DCIM (DIR) | 写真フォルダ |
Nintendo 3DS (DIR) | ゲームタイトル格納フォルダ |
otherapp.bin | HBL用のペイロード |
boot.3dsx | HBLの実行ファイル |
42383841.BIN | ds用インターネット接続設定のダンプ |
3ds (DIR) | 自作ソフトの実行ディレクトリ |
movable.sed | コンソール固有の暗号化キーを含むファイル |
TWLFix (DIR) | TWLFixの実行フォルダ |
boot.firm | b9sが認識するペイロード(主にLuma3DS) |
private (DIR) | 主にうごメモの保存ファイル(CFW導入時に使用) |
boot9strap (DIR) | b9sのペイロードとハッシュを含むディレクトリ |
luma (DIR) | Luma3DSのメインディレクトリ |
gm9 (DIR) | gm9のメインディレクトリ |
cias (DIR) | cia保存フォルダ(リネーム可能) |
lumaupdater.log | Luma3DSのアップデーターを使用した際のログファイル |
boot.firm.bak | Luma3DSのアップデーターを使用した際のペイロードのバックアップ |
roms (DIR) | romの保存フォルダ(主にTWLight Menu++に使用) |
_nds (DIR) | TWLight Menu++で使用されるnds(DSソフト)用のフォルダ |
BOOT.NDS | b9sのインストールに使用されるndsソフト(TwLight Menu++をインストールした場合は、TWLight Menu++本体がこれに上書きされる) |
bios.bin | (TWLight Menu++でGBAを実行する為のBIOS) |
screenshots_raw.bin | デフォルトで作成されるスクリーンショットデータのファイル |
_gba (DIR) | TWLight Menu++で使用されるGBA用のフォルダ |
削除しても良いもの
CFWアンインストールの予定が無い場合、上記のうち以下のものは基本的に削除しても問題はありません。
- otherapp.bin
- 42383841.bin
- movable.sed
- TWLFix (DIR)
- private (DIR) ※DSまたは3DSでうごメモを使用している場合は削除しないこと!
- boot9strap (DIR)
- cias (インストール予定のciaが無い場合)
- lumaupdater.log
- boot.firm.bak
- screenshots_raw.bin
※上記のファイル(フォルダ)のうち、場合によっては必要になるものもあるので、その場合はその都度用意してください。分からないものは、残しておくのが賢明です。