本記事はルーターハックAdvent Calendar 5日目の記事です。
本来ならば、5日目は昨日の続きとして、ビルドした OpenWrt のインストールやカスタマイズについて書く予定だったのだが。
盛り上がってしまった。火曜の深夜に。
先人たちの解析をもとに、eMMC の SDカードリーダーによるダンプを試したところあっさり吸い出せてしまったので報告する。
PS Classic が解析されてきた流れ
発売前から、PS Classic の中身については海外で Teardown されたりとごく普通に情報が飛び交っていた。
発売後は、国内の物好きな人々(というか主にnvsoftsさん。アグレッシブな報告感謝します!!!)が次々にブートログや Fastboot について情報を発信していた。人気なハードウェアというのは何人もの人がいじくるので展開が早い。
— NV(*´ω`*)@2日目ト36a (@nvsofts) December 3, 2018
— NV(*´ω`*)@2日目ト36a (@nvsofts) December 3, 2018
— NV(*´ω`*)@2日目ト36a (@nvsofts) December 3, 2018
So, turns out you can access the emulator settings of the PlayStation Classic by plugging in a keyboard and pressing Escape
— Nibel (@Nibellion) 2018年12月4日
..which allows you to use multiple save states, scanlines, change games to NTSC for 60 FPS and so onhttps://t.co/yGPkelROv6 pic.twitter.com/bDNZKxMWc3
「eMMCならもしや…」
タブレットでの使用歴がある SoC の性質からするとデータの保存は eMMC になされるのが自然だろう。そうなると eMMC がどのチップなのかを見つけなければならないが、パーツも多くないのですぐ特定できる。eMMCのよくある置かれ方としては、
- BGA (Ball Grid Array)
- 単品
- SoCとの接続が10本ちょいぐらい
- D0~7, CLK, CMD に加え電源など
- DRAMほどシビアではないので楽そうな配線で置いてある
- クネクネしてない
- SoC との距離が DRAM より遠い
- ピン配置にデファクトスタンダード?的なのがありわかりやすい
基板の写真を眺めてみると、SoC(中央左) に対して対称配置になっている DRAM(中央の上下に並んでいる2つのチップ) より遠くに置いてあるチップ(中央右)は寸法、信号線の本数、裏面のスルーホール配置などいかにも eMMC に見える。
では、次に気になるのは信号線の構成であるが、偶然 nvsofts さんがバッチリのタイミングでツイートしていたのでそれを拝借した。
Playstation ClassicのeMMCピンはこんな感じか? D0は配線のレジストを削る以外に接続する方法がなさそう pic.twitter.com/dMlUtc7wD7
— NV(*´ω`*)@2日目ト36a (@nvsofts) 2018年12月4日
eMMC は SDカードと大体互換
eMMC は、名前の通り MMC (Multi Media Card) つまり SDカードの先祖の親戚にあたる。SD カードは、MMC と物理互換なピンと、"だいたい同じ" コマンド体系を持つ*1。だから、後方・下位互換性の高い SD カードリーダーであれば読めるはずということになる。
今回は、その中でも最も遅いが最もベースラインな通信方式 1-bit Mode を使用した。Bit Mode の説明は Black Hat USA 2017 の eMMC 吸い出しに関するセッションから以下引用する。
1-bit Mode だと、信号線にして実に CMD, CLK, DAT0 の3本しかないため接続が楽であり、今回はこれで吸い出すことにした。
SD カードリーダーにつなげるアダプタ作成
SD カードのアダプタを探すと、もう今後2度と使うことはないであろう Mini SD - SD 変換アダプタが出てきた。こいつのカバーをひっぺがし、対応する信号線に接続した。
SoC を止めてただの電源にする
PS Classic に電源を接続すると、ブートが裏で行われてサスペンド?に入り赤LEDと緑LEDが両方点灯する。この状態では、Vccq(IO電圧)は 1.8 V に吊られたままだが Vcc (カード全体の電源)が Low に落ちてしまう。このブートシークエンスを止めるため、SoC 近傍の Xtal と思われるチップを 1 kΩ 経由で GND に落とす加工を施した。普通に起動させたい時はスイッチで切り替えられるようにしている。 もっとも、オシロのプローブを当てても定数の変化か Xtal のドライブ能力の低さか波が見えないため、Xtal かどうかの確証は得られていないのだが、結果的にはブートシークエンスが止まり電源が供給されっぱなしになるのでとりあえず押し通している。
認識した
接続するとあっさり認識した!
Playstation Classic のeMMC、SDカードリーダーで読めたー!!!!!ダンプしとこ。 Thanks to @nvsofts pic.twitter.com/kv1leo1Mgl
— Takumi Sueda (@puhitaku) December 4, 2018
上記ツイートの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 のような全レイヤーを端々まで固めきれるディストリビューションのほうが良かったのかもしれない。