3DS研究所

homebrew・CFW全般

3gxとコンソールの紐付け方法

今回は、3gxプラグインとコンソールを紐付けする方法を紹介します。これは、作成者側が許可したコンソールでのみ使用できるようにすることによって、二次配布を防止することが目的です。

利用者側の手順

  1. Hash Dumperをダウンロードします。
  2. zipファイルを解凍し、プラグインローダーの旧バージョンを使用している場合は0.5.1、新バージョンを使用している場合は0.6.0の中にあるHashDumper.3gxを、任意のソフトで使用します。
  3. 3gxを起動すると、Hash Dumperというメニューがあるので選択します。Dumped.と出れば成功です。
  4. 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の構造

f:id:cfw_question:20200511114603p:plain
TurdPooCharger氏より (https://gbatemp.net/threads/prefetch-abort-svcbreak-processor-arm9-after-ctrtransfer.540415/#post-8669018)

オフセット サイズ 内容
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についてまとめました。少しでも知識の材料になれば嬉しいです。

参考文献: 3dbrew34⅕c3

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カードへの復元手順です。

  1. GodMode9を起動。
  2. [1:] SYSNAND CTRNAND → private → movable.sedと移動する。
  3. Yでコピー後、最初の画面に戻り、[0:] SDCARD 内の任意の場所でYを押してペースト。
  4. メッセージが出た場合は、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

※上記のファイル(フォルダ)のうち、場合によっては必要になるものもあるので、その場合はその都度用意してください。分からないものは、残しておくのが賢明です。