PR





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パケットも同じ要領で解読できる。