■■■■ WinMX3.31 WPNプロトコルの解析 by [主]@[またーり]■■■■ ・まだ未解析のメッセージあり。 ・解析結果は保証できない。 ■■ 表記の仕方について ■■ ・[データの注釈:X]   ※ X はデータのバイト単位のサイズ   ※ N のときはサイズは不定(文字列など)   [例]ログイン要求(子)のメッセージの構造体   ※この前にタイプとコマンドサイズが付く。 typedef struct TAG_LOGININFO { char szHandleName[N]; WORD wLineType; WORD wTCPPort; } LOGININFO, *PLOGININFO; ・[00:1] は NULL(0x00)と等価。 ・[文字列:N][00:N] は「NULLで終わる文字列」と等価。 ・(親)、(子)はメッセージの送信元を示す。 ■■ WPNPセカンダリ接続メッセージフォーマット ■■   [タイプ:2][コマンドサイズ:2][コマンド:N]   ※ 暗号化はdracが解析したWPNP暗号に順ずる。 ・ログイン要求(子)   タイプ :0x03E9   コマンド:[ハンドル名:N][00:1][回線種別:2][TCPポート番号:2] ・ログイン許可(親)   タイプ :0x0460   コマンド:[ハンドルID:2] ・キューステータス通知(子)   タイプ :0x0384   コマンド:[ステータス:N] 例:"9001 1 of 1 available"   ※ 1分ごとに送信 ・共有ファイル登録(子)   タイプ :0x0FA3   コマンド:[パス:N][00:1]{[ファイル名:N][00:1][ハッシュ値:20][ファイルサイズ:4][MP3ビットレート:2][サンプル周波数:4][再生時間:4]} * N ・チャットリスト取得(子)   タイプ :0x238D   コマンド:[00 00 00 00:4] ・チャットリスト通知(親)   タイプ :0x238E   コマンド:[人数:4][定員:4][チャンネル名:N][00:1][トピック:N][00:1] ・IM送信(子)   タイプ :0x13EC   コマンド:["WinMX ":6][ノード情報:12][00:1][ハンドル名:N][00:1][メッセージ:N]   ※ ノード情報はテキスト 例:"3f96dada1a2e"   ※ IMが正しく送信されると親からIM送信通知が返って来る ・IM送信通知(親)   タイプ :0x13ED   コマンド:["WinMX ":6][ノード情報:12][00:1][ハンドル名:N][00:1]["SENT":4][00:1] ・IM受信(親)   タイプ :0x13F6   コマンド:[メッセージID:12]["WinMX ":6][ノード情報:12][00:1][ハンドル名:N][00:1][メッセージ:N][00:1]   ※ このメッセージを受け取るとIM受信通知を送信しなければならない ・IM受信通知(子)   タイプ :0x144F   コマンド:["WinMX ":6][ノード情報:12][00:1][ハンドル名:N][00:1][メッセージID:12]["SENT":4][00:1] ・ファイル検索(子)   タイプ :0x1771   コマンド:[検索ID:4][接続種別:2][検索種別:2][キーワード1:N][00:1][キーワード2][00:1] ・ハッシュ検索(子)   タイプ :0x1772   コマンド:[検索ID:4][接続種別:2][検索種別:2][ハッシュ値:16]   ※ ハッシュはDWORD×4 ・検索中止通知(子)   タイプ :0x1775   コマンド:[検索ID:4] ・検索結果(親)   タイプ :0x177A   コマンド:[検索ID:4][親のIP:4][親のUDPポート:2][謎:5][フルパス:N][00:1][ハッシュ値:20][サイズ:4][回線種別:2][ユーザー名:N][00:1][キュー状態:N][00:1]   ※ MP3などのいくつかのファイルタイプはまた別のフォーマットになっている。 ・Whois要求(子)   タイプ :0x1389   コマンド:["WinMX ":6][ノード情報(TEXT UDP):12][00:1][ユーザー名:N][00:1] ・Whois情報成功(親)   タイプ :0x138A   コマンド:["WinMX ":6][ノード情報(TEXT UDP):12][00:1][ユーザー名:N][00:1][回線種別:2][オンライン時間(分):4][共有ファイル数:2][キュー状態:N][00:1] ・Whois情報失敗通知(親)   タイプ :0x138B   コマンド:["WinMX ":6][ユーザー名:N][00:1][エラー情報:N][00:1] ・ブラウズ要求(子)   タイプ :0x1B59   コマンド:["WinMX ":6][ノード情報(TEXT UDP):12][00:1][ユーザー名:N][00:1]   ※ ブラウズ要求(子) → ブラウズ通知(親)× ファイル数 → ブラウズ完了通知(親) → ブラウズ終了通知(子) ・ブラウズ通知(親)   タイプ :0x1BBC   コマンド:["WinMX ":6][ノード情報(TEXT UDP):12][00:1][ユーザー名:N][00:1][フルパス:N][ハッシュ値:20][サイズ:4][00:1] ・ブラウズ完了通知(親)   タイプ :0x1BC6   コマンド:["WinMX ":6][ノード情報(TEXT UDP):12][00:1][ユーザー名:N][00:1] ・ブラウズ終了通知(子)   タイプ :0x1B5A   コマンド:["WinMX ":6][ノード情報(TEXT UDP):12][00:1][ユーザー名:N][00:1] ・ユーザー名通知(子)   タイプ :0x038D   コマンド:[ユーザー名:N][00:1] ・送信キューユーザー通知(子)   タイプ :0x038E   コマンド:[ユーザー名:N][00:1][親のIP:4][親のUDPポート:2]   ※ 改名の順序   ※ 1.新しい名前でログイン(0x03E9)   ※ 2.古いユーザー名通知(0x038D)   ※ 3.ログイン許可受信(0x0460)   ※ 4.キューステータス送信(0x0384)   ※ 5.新しいユーザー名通知(0x038D)   ※ 6.送信キューに居るユーザー通知(0x038E)   ※ 7.共有ファイル登録(0x0FA3)   ※ 8.キューステータス送信(0x0384) ・送信キュー要求(親)   タイプ :0x1FB8   コマンド:["WinMX ":6][ノード情報(TEXT UDP):12][00:1][ユーザー名:N][00:1][フルパス名:N][00:1][回線種別:2][要求ID:1]   ※要求ID=0x00: キュー入り要求   ※要求ID=0x01: 待数要求 ・送信キュー入り通知(子)   タイプ :0x1F54   コマンド:["WinMX ":6][ノード情報(TEXT UDP):12][00:1][ユーザー名:N][00:1][フルパス名:N][00:1][待数:2][不明(02 00):2] ・送信キュー待数通知(子)   タイプ :0x1F5E   コマンド:["WinMX ":6][ノード情報(TEXT UDP):12][00:1][ユーザー名:N][00:1][フルパス名:N][00:1][待数:2][不明(00 00):2] ・送信キュー受け入れ通知(送信受け入れ)(子)   タイプ :0x1F68   コマンド:["WinMX ":6][ノード情報(TEXT UDP):12][00:1][ユーザー名:N][00:1][フルパス名:N][00:1]   ※続けてキューステータス通知送信 ・ノード変更通知(親)   タイプ :0x039D   コマンド:[旧ユーザー名:N][00:1][新ユーザー名:N][00:1][親のIP:4][親のUDPポート:2] ・受信キュー要求(子)   タイプ :0x1F41   コマンド:["WinMX ":6][ノード情報(TEXT UDP):12][00:1][ユーザー名:N][00:1][フルパス名:N][00:1][要求ID:1]   ※要求ID=0x00: キューステータス要求   ※要求ID=0x01: キュー入り要求・待ち数要求 ・受信キューステータス通知(親)   タイプ :0x1FA4   コマンド:["WinMX ":6][ノード情報(TEXT UDP):12][00:1][ユーザー名:N][00:1][フルパス名:N][00:1][キューステータス:N][00:1]   ※キューステータスの例:"Busy (3 in queue)" ・受信キュー入り通知(親)   タイプ :0x1FCC   コマンド:["WinMX ":6][ノード情報(TEXT UDP):12][00:1][ユーザー名:N][00:1][フルパス名:N][00:1][待数:2][不明(00 00):2] ・受信キュー受け入れ通知(受信受け入れ)(親)   タイプ :0x1FC2   コマンド:[自ユーザー名:N]["WinMX ":6][ノード情報(TEXT UDP):12][00:1][相手ユーザー名:N][00:1][フルパス名:N][00:1][相手IP:4][相手TCPポート:2]   ※恐らく続けてキューステータス通知送信 ■■ WPNP転送プロトコルメッセージフォーマット(アップロード側から見て) ■■ ・ファイル要求(受信)   コマンド:["GET":3][ユーザー名:N][" "":2][フルパス名:N]["" M":3] ・ファイルサイズ(送信)   コマンド:[ファイルサイズ(TEXT):N] ・ファイル取得(受信)   コマンド:[開始位置:4][終了位置:4]   ※ 開始位置 = 終了位置 で転送終了 ・ファイル送信(送信)   コマンド:[開始位置:4][終了位置:4][ファイル内容:N]