dq9 解析メモ(daisukedaisukeのブログ)

2023年10月から2024年6月まで、約9カ月間のdq9解析結果を投稿します。エンカ調査がメインです。

dsのWi-Fi接続テストを解析した話(個人的メモ)

daisukedaisuke.hatenablog.com

2025年9月12日から2週間、Wi-Fi接続テストを解析しました。重要なことだけメモ

いくつかの期待の下での解析でしたが、Wi-Fi接続テストはすべてが防弾仕様であり、コード実行は不可能であると結論づけました。
- コード実行ができれば、3dsに組み込まれているWi-Fi設定のファームウェアから任意のndsコードブートが可能となるという希望(だが失敗)
- 多くのゲームでの、新チャートが開発できるという期待(だが失敗)

環境

今回デバッグを行う上で、docker desktopを使用しました。それ以上のことは言及しません。

仕様など

dsは、接続テストを行う上で、dns解決をしたうえで、hxxp://conntest.nintendowifi.nettcpでリクエストを投げます。
httpであるため、虚言dnsサーバーとpython http1.1サーバーを立てれば簡単に偽造することができます。

接続はarm7のおそらくdsのファームウェアが行い、0x04804000~の制御メモリを介して実際に受信を行う。
このとき、いくらサーバーが巨大なコンテンツを送ろうが、一定バイトで切り捨てられる。

レジスタ(ハードウェアバッファ) → Shared WRAM → メインメモリ」2回のコピーを経て、内容がコピーされ、その状況は、os系のIPCメモリで状況が通信されるっぽい(?)
このコピーはバイト数のコピーであると思われ、バイト数はtcpヘッダがハードウェアカウンタの報告と一致しなければ、ハードウェアカウンタから計算されたものを使用する。そのため、バイト数過少報告させ、コピーをオーバーランすることは不可能である。

arm9側では、バイト数で複数回コピーされるが、これはすべてヒープに適切な領域が確保されたうえで格納される。
バイト数を偽装することは不可能であるため、バイト数を過少報告させ、近くにあるビープ管理ヘッダ(空きメモリ数などを保持)を破壊することは不可能である。

コピーが完了すると、解析フェーズに入る。

httpリクエストを正常と認識させるには、次の条件が必要である。

  • \r\n\r\nという文字列があること。
  • <最初のspace>200という文字パターンがあること。

他は忘れた。

また、ヘッダも解析される。たしか「:」と「\r\n」があることが条件だっけ?
解析中キーとバリューの組み合わせは、個別にヒープにコピーするが、最強strlen関数によってビープに確保する大きさが正確に実測されるため、この時点で過少報告させることは不可能である。
この解析された文字は、合計サイズ0x20の配列に格納される。しかし、配列には要素数カウンタとオーバーラン検知コードが搭載されているため、セーフ系である。
このヘッダはおそらく最低1つはないと、本文は解析してくれない。
また、プログラムはコピーしたくない場所の終端をnull文字に置換するので、これのコードを何かするのは不可能であろう。
このビープへのコピーは、最強セーフ系高速バッファコピー関数(長さ指定なし)によって行われており、この関数は絶対null文字以降の文字列をオーバーランすることは許さないので、ここで誤認させることは不可能である。

また、本文も申し訳程度に解析される。
条件は「=」があることである。abc=123&123=abc&=&=&のような文字もなぜか受け付ける。
これも解析され、配列(2つの要素を持つ構造体にヒープのアドレス)にコピーされる。
ただし、配列サイズ0x20以上を超えると、異常として判定され、解析も中断される。しかも、ヒープはゲームが動いていないので鬼のように空きメモリがあり、メモリに展開できるサイズに制限がある事実を考えると、ヒープを確保失敗させることはWi-Fi接続テストでは不可能である。
また、ヘッダのパーサーをだましてを重複させる行為も、正しくカウンタを扱うため、不可能だと思われる。

この解析で重要なのは、httpresultというキーを持つ配列の要素であり、成功時はおそらく常に(char *)200である。これがいろいろあって後の処理で数値化され、http接続テストハンドラで判定に使われると思われる。
この配列キーは、ヘッダ、本文解析と同じ配列を使用しているが、httpresultは内部で名指しされている内部管理用のキーであり、外部から操作することは不可能だと思われる。
解析されたヘッダは何に使われるのかは、今後の課題とする。おそらくhttpresultしか見てないと思われる。
また、httpresultは最初のものを使用するため、httpresultを偽造する試みは失敗した。

これらの解析されたメモリは、接続テストではhttpresultだけを取り出してすべて即解放される。そのため、個別パーサーのバグを狙うことは不可能である。

このため、接続テストは防弾仕様であり、オーバーランさせることは不可能であると結論とした。

※一部のdq9ロムでは、接続テストのほかに、WFCサーバーにログインも行うようです