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 © binzume all rights reserved.