まず,接続すると互いに乱数から作られた6バイトのデータを交換します. このうち,先頭2バイトはダミーで使いません. 後ろの4バイトが通信の暗号鍵になります.
自分が送信した暗号鍵が,そのあと送信するデータを暗号化するための鍵になります. そのため,コネクション上を流れるデータのうち一方向だけ見てれば解析可能です.
4バイトのデータ長の後に,1バイトのコマンドと,任意長のデータが続きます. コマンドもデータ長に含まれます.
基本的に送られる順に記述します.書きかけです.
コマンドだけの1バイトのブロックです. データはありません.
4バイトのバージョンナンバーの後に,"Winny Ver2.0b1 "が付いています.
このコマンドを送信した後,暗号鍵を変更します. もともとの鍵と0x39393900でxorを取ったものが新しい暗号鍵となり, RC4の構造体などを初期化しなおします.
4バイトの回線速度を送ります.
検索時や,それに対する応答が入ります.
まず,データの種類を表すバイト列あり, その後に経由したホストの情報が入っています.
最後にキーの個数とデータが続いています.
struct NY_KEY_INFO{ union { unsigned long addr; unsigned char ip[4]; }; unsigned short port; union { unsigned long bbs_addr; unsigned char bbs_ip[4]; }; unsigned short bbs_port; unsigned long size; char md5[16]; unsigned char fname_len; short fname_sum; char fname[fname_len]; char trip[11]; unsigned char bbs_trip_len; char bbs_trip[bbs_trip_len] short ttl; long blockref; long mtime; char flag_ignore; // 0:1 char version; // 5? } 案の定,ファイル名は多重に暗号化されています. これはキャッシュと同じ暗号でした. これ以降は殆ど解析していません. この辺りは書籍「Winnyの技術」を参考にしてください. **メモ あまり一度に大量のデータを送りつけると,動作が怪しくなるようです(?). ファイル送信要求のブロック数のデータと実際に送られるブロック数の 関係がまだ少し分かっていません. 転送リンクじゃなくても,ダウンロードできるみたいです. **この文書の履歴 -2005-11-15 公開 -2005-11-20 追加