Winny解析::プロトコル

暗号

まず,接続すると互いに乱数から作られた6バイトのデータを交換します.このうち,先頭2バイトはダミーで使いません.後ろの4バイトが通信の暗号鍵になります.

自分が送信した暗号鍵が,そのあと送信するデータを暗号化するための鍵になります.そのため,コネクション上を流れるデータのうち一方向だけ見てれば解析可能です.

ブロック

4バイトのデータ長の後に,1バイトのコマンドと,任意長のデータが続きます.コマンドもデータ長に含まれます.

コマンド一覧

基本的に送られる順に記述します.書きかけです.

0x61

コマンドだけの1バイトのブロックです.データはありません.

0x00 バージョン情報

4バイトのバージョンナンバーの後に,"Winny Ver2.0b1 "が付いています.

このコマンドを送信した後,暗号鍵を変更します.もともとの鍵と0x39393900でxorを取ったものが新しい暗号鍵となり,RC4の構造体などを初期化しなおします.

0x01 回線速度

4バイトの回線速度を送ります.

0x02 接続の種類

0x0D キーの情報の交換

検索時や,それに対する応答が入ります.

まず,データの種類を表すバイト列あり,その後に経由したホストの情報が入っています.

最後にキーの個数とデータが続いています.

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の技術」を参考にしてください.

メモ

あまり一度に大量のデータを送りつけると,動作が怪しくなるようです(?).ファイル送信要求のブロック数のデータと実際に送られるブロック数の関係がまだ少し分かっていません.

転送リンクじゃなくても,ダウンロードできるみたいです.

この文書の履歴

Copyright © 瓶詰堂 all rights reserved.