【番外編】PlayStation Classic の eMMC をダンプする

本記事はルーターハックAdvent Calendar 5日目の記事です。

本来ならば、5日目は昨日の続きとして、ビルドした OpenWrt のインストールやカスタマイズについて書く予定だったのだが。

盛り上がってしまった。火曜の深夜に。

f:id:puhitaku:20181205032107j:plain
開封して5秒で分解された残骸。

先人たちの解析をもとに、eMMC の SDカードリーダーによるダンプを試したところあっさり吸い出せてしまったので報告する。

PS Classic が解析されてきた流れ

発売前から、PS Classic の中身については海外で Teardown されたりとごく普通に情報が飛び交っていた。

www.eurogamer.net

発売後は、国内の物好きな人々(というか主にnvsoftsさん。アグレッシブな報告感謝します!!!)が次々にブートログや Fastboot について情報を発信していた。人気なハードウェアというのは何人もの人がいじくるので展開が早い。

「eMMCならもしや…」

タブレットでの使用歴がある SoC の性質からするとデータの保存は eMMC になされるのが自然だろう。そうなると eMMC がどのチップなのかを見つけなければならないが、パーツも多くないのですぐ特定できる。eMMCのよくある置かれ方としては、

  • BGA (Ball Grid Array)
  • 単品
  • SoCとの接続が10本ちょいぐらい
    • D0~7, CLK, CMD に加え電源など
  • DRAMほどシビアではないので楽そうな配線で置いてある
    • クネクネしてない
    • SoC との距離が DRAM より遠い
  • ピン配置にデファクトスタンダード?的なのがありわかりやすい

f:id:puhitaku:20181205094557j:plain
改造後の画像で失礼。

基板の写真を眺めてみると、SoC(中央左) に対して対称配置になっている DRAM(中央の上下に並んでいる2つのチップ) より遠くに置いてあるチップ(中央右)は寸法、信号線の本数、裏面のスルーホール配置などいかにも eMMC に見える。

では、次に気になるのは信号線の構成であるが、偶然 nvsofts さんがバッチリのタイミングでツイートしていたのでそれを拝借した。

eMMC は SDカードと大体互換

eMMC は、名前の通り MMC (Multi Media Card) つまり SDカードの先祖の親戚にあたる。SD カードは、MMC と物理互換なピンと、"だいたい同じ" コマンド体系を持つ*1。だから、後方・下位互換性の高い SD カードリーダーであれば読めるはずということになる。

今回は、その中でも最も遅いが最もベースラインな通信方式 1-bit Mode を使用した。Bit Mode の説明は Black Hat USA 2017 の eMMC 吸い出しに関するセッションから以下引用する。

f:id:puhitaku:20181205124308p:plain
"Hacking Hardware with a $10 SD Card Reader" p25

1-bit Mode だと、信号線にして実に CMD, CLK, DAT0 の3本しかないため接続が楽であり、今回はこれで吸い出すことにした。

SD カードリーダーにつなげるアダプタ作成

SD カードのアダプタを探すと、もう今後2度と使うことはないであろう Mini SD - SD 変換アダプタが出てきた。こいつのカバーをひっぺがし、対応する信号線に接続した。

f:id:puhitaku:20181205125156p:plain
"Hacking Hardware with a $10 SD Card Reader" p26

f:id:puhitaku:20181205125054g:plain
出典: https://howlingpixel.com/i-en/Secure_Digital

SoC を止めてただの電源にする

PS Classic に電源を接続すると、ブートが裏で行われてサスペンド?に入り赤LEDと緑LEDが両方点灯する。この状態では、Vccq(IO電圧)は 1.8 V に吊られたままだが Vcc (カード全体の電源)が Low に落ちてしまう。このブートシークエンスを止めるため、SoC 近傍の Xtal と思われるチップを 1 kΩ 経由で GND に落とす加工を施した。普通に起動させたい時はスイッチで切り替えられるようにしている。 f:id:puhitaku:20181205094614j:plain もっとも、オシロのプローブを当てても定数の変化か Xtal のドライブ能力の低さか波が見えないため、Xtal かどうかの確証は得られていないのだが、結果的にはブートシークエンスが止まり電源が供給されっぱなしになるのでとりあえず押し通している。

認識した

接続するとあっさり認識した!

f:id:puhitaku:20181205020858j:plain

上記ツイートの2枚目は試しにそれっぽい画像を見てみた様子、3枚目はパーティションテーブルを gparted で出したスクショである。

パーティションの種類が不明なものがたくさんある。ここに暗号化された形で多様なデータが記録されているのだろう。独自パーティションでデータを格納するのは PS3 時代から Sony のお家芸である。

ダンプと今後

とりあえずダンプをとるため、 dd で適当に吸い出した。吸いミスがあるとまずいので2回吸い出したが、ハッシュを比較すると一致したため(ハッシュは記録し忘れ、後で上げる)問題ないようだ。

今後は binwalk とかを使って各種情報が吸えないか解析しようと思う。自家製 Linux が動けば面白いが、コードが何も公開されていないためブートローダーとの戦いも予想される。

進捗があればまた番外編として投稿する予定だ。

おまけ: PS Classic の中身の感想

構成から鑑みるに、ファミコンミニとは別の方向でコストをかけているという印象。

MediaTek MT8167A が載っているとか、エミュレーターを使っているとか、そういった構成はすぐ思い付くので特に驚かなかった。ファミコンミニと比較すると、SoC の持つ CPU も GPU も総じて能力は高く、総合したコンピューティング能力は PS Classic が上であると思われる。PS のエミュレーションは 3D も絡んでくることから、ファミコンやスーファミのエミュレーションよりもパワーが必要であった可能性は容易に想像できる。

筐体に関してはファミコンミニより部品点数が(多分)少なく、しかしよりパワフルなSoCを載せているためか放熱がしっかりしている。一方で、コントローラーの基板上にUSBコネクタを載せ、そこに USB Type-A→USB Micro-B のケーブルをつなぐという大胆な構成も見てとれる*2

しかしディストリビューションに Android を使わず Yocto を採用しているらしいのは少し驚いた(ブートログに Yocto の文字列があった)。エミュレーターがいくらAndroidを想定していない普通のOSSだったとしても、Android NDK を組み合わせるなどして Android と融合させることはできるはずで、ソニーの場合その程度平気でやってのけそうだ。まあ、ソニーの場合はゲームなどの著作物を極めて厳重に扱うため、Android のような「ハックできるスキ」の生まれやすいゴテゴテしたシステムよりも、Yocto のような全レイヤーを端々まで固めきれるディストリビューションのほうが良かったのかもしれない。

*1:一部非互換なコマンドや、SD特有のセキュアなオペレーションがある

*2:コントローラー基板に基板間接続用コネクタを置いたとして、PS本体とのUSB接続にUSB→表面実装コネクタなハーネスをわざわざ調達するほうがコストがかかるのではないかと推測