[SWITCH] BIS key / Titlekey / SdSeed の取得法 - 2018/06/17

2018/06/17 20:31 Switch 3
この記事ではSwitchが使用する BIS key、Titlekey、SdSeed の記事執筆時点での取得法をご紹介します。
BIS key(以下biskey)はSwitchのNAND(eMMC)の中身を暗号化/復号するための本体毎に固有の鍵です。
Titlekey(以下titlekey)はeショップのコンテンツやゲームのアップデートのために使用されるチケットに含まれる鍵で、それらのNCAファイルを
PC上で扱うためには必要な鍵です。これはコンテンツ毎に固有で、一度ネット上で共有されてしまえば自分で取得する必要はありません。
SdSeed(以下sdseed)はSwitchがmicroSDカードへ保存するコンテンツの暗号化/復号に使用される本体毎に固有のシードです。
microSDカードにDLしたゲームやアプデ(NCA)はNAX形式で暗号化されており、そのNAXを復号するためにsdseedを使用します。

biskeyはともかく後の2つは困っている方が居そうな気がするので、こうやって記事を書いている次第です。 :)


Switchのファイルの暗号化/復号に使用される数十個の一意の鍵ですが、自分で取得した方が良いのは百も承知で私の思いを書きますと、
任天堂機に関わらずハックシーンでは鍵の流出やアーカイブとしての公開は割とよく見られる行為であり、本体毎に固有の鍵でなければ
共有は良いのではないか?ネットに落ちている鍵をそのまま使おう?というような思いでいます。今の私は。
個人的に、SwitchシーンはGBAtempの著作物を共有しないというルールがSwitchシーン全体に浸透して来ているような気がしてなりません。
もちろんそれは当たり前の至極真っ当な考え方ですが、私はそこまで出来る優秀な人間ではないので、鍵はググれ、としか言えません。



この記事で紹介するtitlekeyの取得で最も厄介なのはrsa_kek(eticket_rsa_kek)です。
そもそもtitlekeyは、アップデートのncaに使用されるものとeショップから購入したコンテンツ全般に使われるものの2つが存在します。
前者は全ユーザー共通のチケットの最後に存在します。チケット部分はタイトルID含め暗号化されていますがtitlekeyはされていません。
後者はユーザー毎に固有のチケットに含まれており、肝心のtitlekey含めほぼ全て暗号化されているので復号しなければいけません。
それら暗号化の復号に使用するのがrsa_kekですが、それを取得するのに3つの鍵が必要で、その鍵の取得手順を私は把握していません。
SimonMKWii氏によればes-sysmoduleから2つの鍵を、そしてrsa_oaepとaes_kek_generation_sourceから1つの鍵を取得可能なようですが、
私はそれの詳細までは把握していません。。よって私には、rsa_kekはググれ、としか言えません。

鍵そのものではなくSHA256のようなハッシュを載せているサイトが存在しますが、それに意味が無いなんて事は思わないでください。
それらは鍵を自分で取得するのに使用可能な、真っ当な人間向けの合法的なハッシュです。

チケットやtitlekeyを復号するには前述したrsa_kekともう1つ、キャリブレーションに用いられるPRODINFOパーティションのダンプも必要です。
PRODINFOをそのままダンプしても暗号化されているため、biskeyを用いて復号状態にする必要があります。
元々この記事はbiskeyを既に持っている方向けに書くつもりだったのですが、PRODINFOやチケットを含んだファイルの取得に必要になるので
面倒な質問が来る前に書いた方が良いか…と思い直してbiskeyの取得方法も書く次第です。

sdseedもbiskey同様に本体毎に固有なので自分で用意しなければいけません。sdseedの取得はtitlekeyの取得よりもずっと簡単です。
一応書いておきますが、sdseedを求める人の大半はゲームデータ本体かアプデのNCAが目的…ですよね?microSDではなく本体のeMMCにDLすると
NAXとしては暗号化されないので、もしsdseedの取得が面倒ならmicroSD抜いてDLすれば良いと思います。


※この記事はSwitchをRCMモードで起動出来てかつペイロードを実行する事が出来る人向けの記事となります。
※また、この記事はWindowsを使用している人向けの記事となります。


記事内 目次
biskeyの取得手順
titlekeyの取得手順
sdseedの取得手順




● BIS key の取得手順

●用意するもの
・Switch本体
・PC(Windows)
TegraRcmSmash
biskeydump


biskeydumpはbiskeyやbiskeyのQRコードをSwitchに表示するペイロードですが、リッスンするホストPCへ取得した鍵を送る事も可能です。
TegraRcmSmashはcoldboot exploitであるFusée Geléeのfusee-launcherをWindows向けに書き直されたツールです。
GUI採用のTegraRcmGUI等はリッスンの機能を持ち合わせていないので、ここではコマンドプロンプトで扱えるTegraRcmSmashを推奨します。
これはスマホのカメラの性能によってはSwitchに表示されるQRコードを読み込めないためです。
まあ、まずはGUI採用のペイロードランンチャーでbiskeydumpを送ってQRコードの読み込みにチャレンジするのも良いかもしれませんね。


1、TegraRcmSmash.exeを適当な場所に解凍する

2、biskeydump.binを手順1の場所に解凍する。(のがオススメ)

3、コマンドプロンプトを起動してcdコマンドでTegraRcmSmash.exeのあるディレクトリに移動

4、以下を実行する
TegraRcmSmash.exe -w -r biskeydump.bin BOOT:0x0

5、コンソールに hwi/sbk/tseckey/devicekey/biskey が表示されるので、適当なテキストファイルにでもコピペ

biskeyはcryptとtweakでワンセットです。eMMCのパーティション毎に使用するbiskeyが異なるため、0,1,2,3と分かれています。




● Titlekey の取得手順

●用意するもの
・Switch本体
・PC(Windows)
HacDiskMount
memloader
get_ticketbins.py
get_titlekeys.py
・Python 2.7 と pycrypto
・自分のSwitchから取得したbiskey
・rsa_kek(eticket_rsa_kek)


titlekeyの取得の際、SwitchのeMMCの中のファイルを使用します。
そのため ダンプ+HacDiskMount か memloader+HacDiskMount の2通りの手段が取れます。
HacDiskMountはSwitchのeMMCのデータを扱うためのツールで、物理デバイス(Switch)のマウントにも対応しています。

私としては何かと便利なmemloaderの使用を推奨します。memloaderはSwitchのためのバイナリをmicroSDから実行する事を可能にする
ペイロードで、サンプルとしてSwitchのeMMC/microSD/boot0/boot1をPCに認識させる事が可能なu-bootが含まれています。
HacDiskMountはPCに認識させたeMMCの各パーティションをマウントしてエクスプローラーで扱えるようにする事が可能です。
memloaderはmicroSDカードをSwitchに挿したままPCに認識させる事も出来るので本当にオススメです。

この手順ではSYSTEMパーティションからSwitchにインストールしたeショップコンテンツ及びアプデのチケットファイルを取得します。
get_ticketbins.pyはそのファイルから不要な部分を取り除いてチケット部分をまとめたチケットブロブを作成するスクリプトで、
get_titlekeys.pyはrsa_kekを使用してチケットブロブのチケットを復号するスクリプトです。
後者のみを使用して1つ1つtitlekeyを取得する人もいますが、んな面倒な事しなくても良いです。
チケットブロブが作成出来れば後者はそれを参照する事でコマンドプロンプトのコンソールに復号状態で全部表示してくれます。


1、memloaderv1.zipをDLし、解凍してペイロード(memloader.bin)とsampleフォルダを取り出す

2、microSDのルートにsampleフォルダの中身をコピーしてSwitchに挿す
※ "sd:/uboot/", "sd:/ums_emmc.ini" のように…

3、SwitchをRCMで起動し、memloader.binを実行し、Switchの画面でums_emmc.iniを選択する

4、このウィンドウが表示されたらキャンセルをクリック

ticket_dec_20180617(2).jpg

5、HacDiskMount1044.zipをダウンロードし、適当な場所に解凍し、HacDiskMount.exeを実行

6、左上メニューから "File/Open physical drive" を選択し、選択ウィンドウで "Linux UMS disk" を選択する

7、SYSTEM の項目をダブルクリックし、このウィンドウを開く

ticket_dec_20180617(3).jpg

8、biskey2を入力し、Testボタンで正常なbiskeyかテストしておく

9、Virtual driveの項目でドライバをインストールし、ドライブレター(ドライブ文字)を適当に選択し、Mountボタンをクリック
(これにより、エクスプローラー上でSYSTEMパーティションが扱えるはず…)

10、"SYSTEM:/save/" から 80000000000000e1 と 80000000000000e2 をPCの適当な場所にコピー
※続けてsdseedを取得する場合は 8000000000000043 も

11、UnmountボタンでSYSTEMパーティションをアンマウントする

12、PRODINFOパーティションの項目を開き、biskey0を入力してTestボタンでテストする

13、PRODINFOのDump to fileの項目でPRODINFOパーティションを適当な場所にダンプ
※biskeyを入力しておくと復号状態でダンプされる。ファイル名は何でも良いが、オススメはPRODINFO.bin
※この時点でHacDiskMountの役目は終了。終了して良し

14、get_ticketbins.py と get_titlekeys.py をダウンロード
※この時、e1、e2、PRODINFO、スクリプト2種 が同じディレクトリにあると楽

15、コマンドプロンプトを起動してcdコマンドでget_ticketbins.pyがあるディレクトリに移動

16、以下のように実行してチケットブロブを作成する
get_ticketbins.py 80000000000000e1
get_ticketbins.py 80000000000000e2

e1はアプデに使用される共通チケットが含まれたファイルで、common_ticketblob.binが作成される
e2はeショップコンテンツに使用される固有チケットが含まれたファイルで、personal_ticketblob.binが作成される

17、get_titlekeys.py をテキストエディタで開き、xxxxxxx となっている部分をrsa_kekで置換

18、コマンドプロンプトで以下のように実行してチケットブロブを復号する
get_titlekeys.py PRODINFO.bin common_ticketblob.bin
get_titlekeys.py PRODINFO.bin personal_ticketblob.bin

ticketdec_20180617.jpg

こんな感じで表示されたら成功です。表示された内容を適当なテキストファイルにでもコピペしておいてください。
Rights IDはチケットのIDです。hactoolでNCAの情報を取得し、表示されたRights IDとタイトルIDに適したtitlekeyを使用する事になります。




● SdSeed の取得手順

●用意するもの
・Switch本体
・PC(Windows)
HacDiskMount
memloader
・お好きなバイナリエディタ
・自分のSwitchから取得したbiskey

1、"microSD:/Nintendo/Contents/private" をバイナリエディタで開く

2、値を全選択(16バイト)して適当なテキストファイルにでもコピペしておく

3、titlekeyの取得手順同様にmemloaderとHacDiskMountを使用してSYSTEMパーティションをマウントする

4、"SYSTEM:/save/8000000000000043" をバイナリエディタで開く

5、手順2の16バイトを検索する

6、ヒットした部分に続く16バイトの値がsdseedなので、適当なテキストファイルにでもコピペしておく




疲れた…
間違っては無い…と思いますが一気に書いたんで間違ってたらすんません…



・追記 2018/06/18 17:38
目的のtitlekeyが取得できなかった場合は以下のget_ticketbins.pyを使用してみてください。
https://gbatemp.net/threads/dumping-your-titles-from-sd-a-bit-advanced.507821/#post-8062627
私は面倒なので書きませんでしたが、取得したtitleidやsdseedの使用方法をKhangaroo氏が解説しています。
https://gist.github.com/khang06/84aabeac507fa99a676d22bb6120cea8
titlekeyやsdseedの使用方法が分からない方はこのガイドを参考にしてください。

kood

▼コメント


名無し 2018/09/22 14:08
結構前の記事なのに質問すみません。見てくれてたら嬉しいです。
titlekey取得の手順18で記事に記されているコマンドを実行したところ、構文エラーが出るのですが(SyntaxError: EOL while scanning string literalのような)何か対処法などはありますでしょうか;;
管理人 kood 2018/09/22 14:43
>>名無しさん
それは ' とか " で正しく囲めていない際に出るエラーです。
以下に私が思う対処法を書いておきますが、それでもエラーが出るなら私には分かりません。

get_titlekeys.pyの10行目にrsa_kek(eticket_rsa_kek)を書き込むので、多分そこでミスってるんじゃないかなあと…
rsa_kek = uhx('xxxxxxxxxxxx')
10行目はこんな感じになっているはずです。(実際にはxの部分をeticket_rsa_kekで置き換えているはずです。)
で、そのエラーは以下のような感じで ' で閉じ忘れた際に発生します。
rsa_kek = uhx('xxxxxxxxxxxx)
仮に上の逆で最初に ' が無ければ、"SyntaxError: invalid syntax" というエラーが発生するはずです。
rsa_kek = uhx(xxxxxxxxxxxx')
対処法はeticket_rsa_kekを ' で囲む事です。
名無し 2018/09/22 22:19
うーん。
今度はpycryptが認識されない...
もうちょっと自力で頑張ってみます


▼コメントを投稿












※「英数字90%以上」のコメントを規制中です。コメントを投稿する際は日本語でお願いします。
※確認ボタンを押すと投稿確認フォームに移ります。投稿確認フォームの送信ボタンを押してください。
※確認フォームにある「メールアドレス」に入力された内容は管理人のみ確認可能です。空欄で構いません。
※確認フォームにある「タイトル」「パスワード」は当ブログでは使用していません。空欄で構いません。
※確認フォームにある「URL」は名前のリンクとして機能します。空欄で構いません。
※確認フォームには非公開コメントのチェック項目がありますが、非公開コメントは受け付けていません。
メールフォームより連絡頂ければメールにてお返事致します。