小ネタ 2005-005

ニンテンドーDSのクロックアップと無線通信(と、ファームウェア解析)

1. クロックアップ改造

標準で取り付けられている16.756MHzの水晶振動子を取り外し、高周波のものに取り替えてみた。
(改造の材料となる不調のDS本体が任天堂から自分にもたらされたことに、ある意味感謝したい。)

ちなみにNTR-CPUの動作クロックは、水晶振動子で作られる基本周波数の4倍である。標準状態では16.756MHzの4倍で、約66MHzとなる。

手元にあった以下の部品について試してみた。
(1) セラミック振動子 20MHz
(2) 水晶振動子 25MHz
(3) 水晶振動子 30MHz
(4) セラミック振動子(?) 33MHz
(5) セラミック振動子 8MHz

結果、
(1)の場合、約1.2倍速で動作した。
(2)の場合、約1.5倍速で動作した。このくらいが妥協点か。[ 動画 約460KB ]
(3)の場合、約1.8倍速で起動するが安定せず、時々フリーズする。30MHzになると配線長を伸ばすことにそもそも無理がある。
(4)の場合、起動しなかった。起動時のNintendoDSロゴが出ない。2倍速化は無理だったようだ。
(5)の場合、約0.5倍速で動作した。

実際に、クロック変更した状態で遊んでみた。
クロックアップして楽しく遊べるのは、リッジレーサーDSだけだった。1.8倍速でのリッジはかなりのスピード感があるが、反射神経もかなり要求される。マリオ64や「きみしね」も遊べないことはないが、いまいち。ペンの入力が滑らかにならないようだ。
クロックダウンについてはほとんど意味がないが、大合奏バンドブラザーズがクリアできないので演奏速度を落としてクリアするのには利用することができた。




2. クロックアップしたDSと未改造のDSとの無線通信について

クロックを変更したDSは、無線通信ができるのか否か?
まず最初にピクトチャットを試してみたが、双方向に問題なく通信できた。

1本のゲームカートリッジで2台のDSで遊ぶダウンロードプレイについても試してみた。
(1) マリオ64DS
(2) 直感ヒトフデ
(3) リッジレーサーDS
(4) バンドブラザーズ

結果、
(1)〜(3)の場合、クロックが速い方をホスト側にするとダウンロード時に失敗してしまう。クロックが遅い方がホストの場合には問題なくプレイすることができる。ただし、ゲームの進行速度は遅い方に合わせられてしまう。
(4)の場合には、どちらをホストにしてもダウンロードプレイができなかった。

無線通信モジュールは独立したクロック(22MHz)を持っているので通信のベース部分は問題がないようだ。速度が速いほうが送信したデータを遅い方が取りこぼすというのが動かない原因と思われる。取りこぼし時のリカバリが無いのか?
AiroPeekだとかAirSnortとかでPCから無線LANの生パケットを観察できれば原因が分かるかもしれない。

仮に無線トンネリングソフトができて遠隔地と通信する場合、同様の取りこぼし問題が発生する可能性があると思われる。特にバンドブラザーズの遠隔地でのダウンロード合奏はシビアだと予想される。

ダウンロードプレイでなく、2本のゲームカートリッジでのマルチプレイは、ソフトを複数本所持していないため、試すことができなかった。



3. 無線通信モジュールについて

無線通信モジュールについては、基板が子基板になっている独立した回路である。

インプレスのサイトでニンテンドーDSの分解記事に出ていた無線部分の写真と、自分のものとを比べると微妙に異なっていることに気が付いた。インプレスの写真では25FW203Tという部品が載っている部分に、自分のものは45PE20とマーキングされた部品が載っているのである。
さて、ここで25FW203TというのはSANYO製のシリアルフラッシュメモリLE25FW203である。ちなみにこの部品は大合奏バンドブラザーズのカートリッジのセーブ用メモリにも使われている。自分のが25FW203だったらバンブラと同じでそのまま読み出せるのに。
それに対して、45PE20というのはSTマイクロエレクトロニクス製のシリアルフラッシュメモリM45PE20である。SANYO製の物とはピン配置が異なっている。そのため基板設計が変わってしまうのである。つまり無線通信モジュール基板が2種類存在するのだが、どう異なるのかは不明である。単にSTM製かSANYO製のデリバリがショートしたので基板設変で代用したのだろうか?
(後日加筆 SANYO LE25FW203とM45PE20とはピン配置が一緒である。LE25FW206のピン配置と勘違いしていた。基板も1種類しかないようだ。SANYOがピン配置をM45PE20に合わせたのだろうか?)

あと、このシリアルフラッシュメモリが何に使われているかが謎である。任天堂独自プロトコルでの特殊な暗号鍵方式の無線通信のファームウェアが記録されていると考えるのが妥当なところだが、無線用のCPUとRAMの存在も謎である。早晩、このシリアルフラッシュメモリの内容も吸い出されて解析されてしまうのかもしれない。暗号の鍵はDS本体のBIOS内か、この無線モジュール内かどちらかにあるはずだが、GBAのBIOSがARMのswiのmidi2freqの穴のせいで早々に吸い出されて解析されてしまったのを鑑みるとBIOS側はヤバいように思える。

ちなみに無線通信モジュール上のこの部品を取り外して動作しないようにしてしまうと、なぜか(?)DSが起動しなくなってしまうので要注意。


(後日加筆 2005.1.30)
あくまでも仮説であるが、この256KBのフラッシュROMにかかれた内容はDS本体にロードされるのではないだろうか?
これを書き換えてDS上で任意のコードを走らせることができれば面白いのだが。
あるいは、この無線通信モジュールが通信+暗号化を担当しているならば、通信モジュールへの入出力ピンをロジアナで観測すると無線ダウンロード機能の暗号化前の生の通信内容が分かるかもしれない。平文と暗号化データの2つがまとまって揃えば解読できる可能性が出てくる。あるいはこの無線モジュールをスルーして別の模倣した信号を送り込むことで自作ソフトをダウンロードさせることが可能になるかもしれない。
(海外ではDSカートリッジ側のバスにCPLDのような物をかませて、カートリッジのROM内の暗号化されてない段階でアクセス可能な部分にあるヘッダ情報部分のジャンプテーブルのアドレスのデータを偽ってGBA側カートリッジのROMアドレスに処理を飛ばすことで任意のコードを実行させることに成功しているらしい。本体の改造なしだとこのような正攻法なアプローチになるようだ。)



4. DSのファームウェア解析について

(後日加筆 2005.6.1)
最近、NintendoDSのファームウェアの書き換えが流行っているらしい。ファームウェアがどこに格納されているのかというと、上記の無線モジュール内の256KBシリアルフラッシュメモリに格納されているそうだ。どーりでこの部品を取り外したらDSが立ち上がらなくなったわけだ。ファームウェアの書き換えを失敗した場合には、直接この部品に書き込むということをすれば、復旧することが可能である。その際には大合奏バンドブラザーズのセーブメモリと同じ部品なのでBBMEのソフトをベースにDSファーム書き換えソフトを作ればよいと思われる。


(後日加筆 2005.6.13)
既にDarkFaderという人物のサイトで、PCを使ってDSのファームウェアを書き換えるための「ppflash.zip」というソフトが公開されている。このソフトはプリンタポートを利用してDS上のファームウェアを書き換えるためのものだ。スキルなしに実践しようとすると危なそう。
BBMEとかのデータ書き換えと同様に、EZ-USBを使ってDSのファームウェアを書き換えるため、ppflashというソフトをEZ-USB用に移植してみた。ハードウェアは以前のものを改造して使った。
また、ppflashにはファームウェアを吸い出す機能が無いので、単に吸い出すために前に作ったndswrt.exeをそのまま使った。

海外版のNintendoDSのファームウェアと日本版のDSのファームウェアを吸い出して比較してみたところ、差が109バイトあった。DSの個体毎に、MACアドレスの下位3バイトと、それを格納したヘッダ部分のCRCが2バイトは必ず異なるのだが、それ以外にも104バイトの差が見つかったわけである。差異はそれほど多くない。それもROM末尾の数百バイトの部分に特に集中していることがわかった。
(後日加筆  ROM末尾の2ページの部分のアドレス3FE00〜3FEFFと3FF00から3FFFFは、ユーザー情報や設定などの記録用に使われているようだ。末尾の部分はファームウェアの差異ではなかった。結局、ほとんど海外版と日本版と違いがないということが分かった。)

ファームウェアのバックアップとリストアが自在に可能になったので、気楽にファーム改変などの実験をすることも可能だと思われる。例えばテキトーなアドレスを改変して機能障害がどこにでるかを探してということを繰り返すと、ファームウェアのどのアドレス部分がだいたいどの機能なのかが推測できるような気がする。既に海外ではかなり解析が進んで改変も2例ほど見られる。

あと、吸い出したファーム自体も逆アセで解析というのが可能なように思える。
% arm-elf-objdump -D -b binary -m arm9 fw.bin
というコマンドで実現できそうだ。(DSの開発環境が必要)


(後日加筆 2005.8.12)
 ファームウェアを書き換えるたびにDSを分解するのが面倒なので、ファームウェア格納用のシリアルFLASHメモリICをDIPタイプの8ピンの変換基板に載せて、DSの筐体の外部からICソケットで取り外せるように改造してみた。なんかMODチップみたいに見えるが、真正の部品である。


 最近発売された新色のレッドのDSなどはPassMeとかWiFiMeが使えないように対策されたそうだ。自作ソフトを起動できないとFlashMeでファームウェアの書き換えもできないので、新たな自作ソフト起動手段が見つかるまでは直接ファームウェアのメモリICを書き換える改造方法しかなくなってしまったようだ。

どのように対策がされたのか、もしレッドDSや中国版iQueDSを手にする機会があったら調べてみようかなあ。他にも未知の穴がさりげに塞いであったりすると凄いんだが。



(後日加筆 2005.10.10)
 「遊戯王デュエルモンスターズ ナイトメアトラバドール」というDSのゲームで遊ぶときに、このカードゲームでカードを出すたびに入る演出をOFFにできないのが気にいらない。せめて動作速度を速くしてサクサクと遊ぼうと思って、クロックアップ状態で動かしてみた。動作はするのだが、セーブができず、セーブに失敗しましたと表示される。他のソフトはちゃんとセーブできるのに何故だろうか?と不思議に思った。
 決まったセーブ用のEEPROM/FLASH書き込みライブラリなどがあるならば他のソフトと同様にセーブできるはずである。どうもDSにはそういうものが無いと思われる。
 市販ソフトを吸い出してマジコンで動作させる場合にも、セーブ関係での不具合やフリーズを避けるためにパッチを当てたりするそうだ。セーブのための決まったライブラリが無いようなので、セーブ用のコード部分のパターンが絞れないので自動的に決まったパターンにパッチを当てるのではうまくいかないことが結構あるとのこと。
 パターンとしては、
 ・DSに同じセーブ用EEPROMまたはFLASHが使われているゲームカートリッジを挿しておく
 ・DSに同じでないセーブ用EEPROMまたはFLASHが使われているゲームカートリッジが挿さっている
 ・DSにゲームカートリッジを挿さない
 といった状態に対して、
 パッチ方法は、
 ・パッチしないでそのままセーブさせる
 ・パッチして、マジコン内の別の不揮発メモリに保存するように書き換える
 ・パッチして、セーブ機能をスキップさせて、とりあえずフリーズを回避するように書き換える
 という選択肢が存在する。
 また、PassMeを使う場合には、PassMeはセーブ用素子への配線が直結でないため、微妙にアクセスタイミングがズレる可能性があると思われる。