この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
最近、インターネットに接続することを前提としたモバイル端末が各種存在しているが、今回はそうしたモバイル端末がどのような通信を行なっているかに着目してみよう。
今回取り上げるモバイル端末は、次の2種類だ。
・Nintendo 3DS
・PS Vita
■ Nintendo 3DSの場合
Nintendo 3DSは、「いつの間にか通信」と呼ばれる機能があり、端末をスリープさせている間に通信を行い、動画ファイルや各種アップデートなどをダウンロードし、ユーザが利用しようと立ち上げた時に、そうした情報を告知する機能だ。では、具体的に通信内容をみてみよう。
下線1のように、定期的にkeep Aliveの通信を行い、接続を常に維持している。そして、下線2の時間になると、データを一気にダウンロードしている事がわかる。また、通信先は常に conntest.nintendowifi.net となっており、米国の任天堂に接続をしているようだ。
この時、サーバに転送している情報が以下となる。
GET / HTTP/1.1
Host: conntest.nintendowifi.net
User-Agent: CTR AC/02
HTTP_X_GAMEID: 00002400
Content-Type: application/x-www-form-urlencoded
Connection: Close
ここに、HTTP_X_GAMEID とあるのが読めるだろうか。このIDを利用することでバージョン情報やどういったゲームなのか等、本体の情報を通知していると思われる。
さて、こうした情報を通信している3DSだが、ゲームを購入する場合、下記通信を行なっている。
GET /ccs/download/0004000000045C00/00000000 HTTP/1.1
Host: ccs.cdn.c.shop.nintendowifi.net
Connection: Keep-Alive
先程のキープアライブ時は、接続先が conntest.nintendowifi.net であったのに対し、アプリを購入する場合、ccs.cdn.c.shop.nintendowifi.netに接続していることがわかる。また、FQDNより、CDN(コンテンツデリバリーネットワーク)を利用していることも想像できる。
■ PS Vitaの場合
PS Vitaの場合は、起動しネットワークに接続した際、下記情報を取得する。
この情報は、ファームウェアの状態を確認し、ファームウェアの更新が必要であるかを起動時にチェックするようになっている。
より、具体的に見ていこう。
まず、上記のURLをリクエストするとき、上記のURLに現在のバージョンらしき情報も送っていることに気づくだろうか。
ver=01520000 だ。この時のリクエストでは、本体のバージョンが、1.52であることを示している。このバージョン情報を書き換えても、帰ってくる情報に変更はない。おそらく、iOSの時と同じように、Vitaに於ける国勢調査的なものだろう。
さて、リクエストした結果、psp2-updatelist.xml がダウンロードされてくる。その中には、下記の情報が含まれている。
<np level0_system_version=”01.600.000″ level1_system_version=”01.610.000″ level2_system_version=”01.610.000″ map=”00.000.000″ />
この情報は、現在の最新版が何であるかを示している。また、最新版の情報以外にも、
<recovery spkg_type=”systemdata”>
<image spkg_version=”01.000.010″ size=”56821248″>
や、
<recovery spkg_type=”preinst”>
<image spkg_version=”01.000.000″ size=”128841216″>
といった情報も含まれている。この情報を見るとわかるように、PS Vita内部では、ファームウェアとしてsystemdataと呼ばれる部分が存在していることがわかる。また、万一システムのアップデートに失敗した際、エマージェンシーモードで起動し、上記2つを強制ダウンロードすることで、システムを復旧させることができると推測される。
■ カスタムファームフェイク画面を作ってみる
上記では、ファームウェアのバージョン情報をXMLが持っている事がわかった。では、この情報を書き換えて、強制的にVitaに流しこむと何が起きるだろうか。
まずは、次のものを用意する。
1.毎度おなじみのフェイクDNS
2.上記DNSの結果を反映するネットワーク
3.カスタムファームウェアを配布するサーバ
まず、1だが、どんなリクエストをおこなっても、必ず特定のIPアドレスを返す、魔法のDNSを用意する。この時、fjp01.psp2.update.playstation.net に対する答えをはじめ、常に一定のIPアドレスを内部に返答してくれる。次に、上記IPアドレスを模したネットワークを用意する。単純に、VM Wareで構築するのがいいだろう。
先ほど構築したVM Ware 上に、どのようなリクエストをされても、常にpsp2-updatelist.xml を返事するサーバを構築しよう。あとは、先ほどの
<np level0_system_version=”01.600.000″ level1_system_version=”01.610.000″ level2_system_version=”01.610.000″ map=”00.000.000″ />
の、01.600.000 を、「KBMJ Custum Edition」等のように、好きな値に書き換えよう。こうすると、PS Vita上にはそのとおりの画面が表示される。スクショを撮影し、友達に見せびらかそう。きっと驚いてくれることに違いない。
ただし、そこの表示されているファームウェア情報は、あくまでもフェイク。実在しないし、実際にファームウェアを更新することはできない。十分注意しよう