Winnyの通信を特定する方法には,「流れるパケットのパターン(トラフィック・パターン)を調べる方法」と,「パケットの中身を調べてWinnyのパケットであることを確認する方法」の2通りがある。前者は,直接中身のデータをのぞいているわけではないため,通信の秘密を守るという大前提があるプロバイダがWinnyを規制する際に使っている。しかし,Winnyの通信を確実に特定するなら,後者の方法がベストである。実際にWinnyの通信を解読できるのか,Winny作者の金子勇氏の著書『Winnyの技術』やインターネットで得られた情報などを参考に挑戦してみた。

 Winny(ウイニー)同士の通信はすべて暗号化されている。このため,流れるパケットをのぞいても,内容がどんなものなのかだけでなく,Winnyの通信なのかどうかも,ひと目ではわからない。Winnyが採用している暗号アルゴリズムRC4は,Webアクセスや無線LANの暗号化でも使われているように,正しく使えば簡単には解読できない。

 ただし,Winnyは不特定多数の相手と共通鍵暗号を使って通信するので,通信を始める前に暗号鍵を直接やりとりするか,事前に暗号鍵をソフトに組み込んでおく必要がある。このため,パケットをキャプチャしたり,クライアント・ソフトを解析すれば暗号鍵を探し出して通信データの内容を解読できるはずだ。そこで,実際に簡単なツールを使ってWinny通信の解読に挑んだ。


■準備編

 解読に必要なツールは,(1)パケット・キャプチャ・ツール,(2)RC4の暗号化/復号ソフト,(3)16進数-ASCII文字列変換ツール,(4)バイナリ・エディタ,(5)電卓ソフト,(6)テキスト・エディタだ(図1)。いずれもフリーソフトとしてインターネットからダウンロードできる。意外と簡単に手に入るソフトばかりである。

 ツールをそろえたら,自分のパソコンにパケット・キャプチャ・ツールとWinnyをインストールする(図2)。Winnyは最新バージョンであるWinny2.0b7.1を使った。

図2 Winny通信の解読に使った実験環境

自分から相手へ接続するときのパケットを解析

図3 パケットをキャプチャしてみると...
[画面クリックで拡大表示]
 図2のように環境も整えたところで,自分のパソコン上のパケット・キャプチャ・ツールを起動してから,Winnyを実行する。そうすると,実行されたWinnyは外部のWinnyパソコン(相手ノード)へ接続しようとして,いくつかのパケットを送出する。このパケットをその前に起動しておいたパケット・キャプチャ・ツールで捕捉して内容を解析したわけだ。

 パケットをキャプチャした結果を見ると,最初にTCPの3WAYハンドシェーク(キーワード解説)のパケットがやりとりされているのがわかる(図3)。Winnyは通信プロトコルに必ずTCPを使うが,TCPでは最初に通信相手と接続する(TCPコネクションを確立する)ために3WAYハンドシェークという手順を踏む。そしてTCPコネクションが確立したあと,Winnyの実際の通信が始まる。

 Winny通信の始まりでは,接続元(自ノード)が最初に決まった形式のパケット2個を相手ノードに必ず送る。第1パケットは長さが11バイトのデータが入っていて,暗号鍵のやりとりとバージョン確認に使われている。そして第2パケットで,リンクの種類や自分のノード・タイプ,待ち受けポート番号などの情報を伝えるコマンドが送られる。

 では,これら2個のパケットの内容を解読していこう。これらの内容が解読できれば,そのあとのWinnyパケットも同じ要領で解読できる。