CTR: 起動時のNCCH読み込みの解析: 始め


私はリバースエンジニアリングはあまり好きではない. なんて言ったって面倒だし飽きる. だがなんだかんだ言ってやらないと先に進まない.

CTR 9.9.0のNATIVE_FIRMを考えてみる. NCCHの署名チェックは既に破壊されているはずなので, あと調べるべきなのはどうやってNCCHが読み込まれるかということだ. loaderプロセスはNANDから読み込むが, それはプラグイン実装等には適さない. 他にはFIRMに内蔵されているNCCHがある. これは当然FIRMと同時に読み込まれるので, 実アドレスがFIRM内にハードコードされているはずだ. そうであればかなり嬉しい. ハードコードされている実アドレスを別の場所に向ければ, それだけでプラグインが実装できる. プラグインが利用するサービス等が開始されていない危険はあるものの, 非常に実装が簡単そうだ.

3dbrew.orgによると, 読み込まれるプロセスはsm, fs, pm, loader, そしてpxiだ. 最後に読み込まれるであろうpxiへのポインタを探す. pxiはFIRM内のオフセットでは0x31D00にある. アドレスでは0x1FF31B00だ.

さて, ここまで調べて問題になってきたのは, ARM11での仮想アドレスがわからないということだ. ここまでに出てきたアドレスはARM9でのアドレスであり物理アドレスだ. エントリーポイントのコードを読んでみる. ヘッダを読むと, ARM11のエントリーポイントが0x1FFAD034であることがわかった. 最初はリンク無しの分岐命令ばかりだ. サイズは32バイト. 例外ベクタかなんかだろうか. だとすれば0x1ffad000は0xFFFF0000か0x00000000ということになるが… で, 0x1ffad000からの分岐先のコードは割り込みを待機する無限ループである.

わからないことが多すぎる. 幸いにもARM9でコードが実行可能なので, それを使ってARM11からMMUのダンプ等を受け取れる. しかし実機を使った手探りの解析は, 面倒, その一言に尽きる. 誰かやってくれないだろうか.

[top]