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

この先は会員の登録が必要です。有料会員(月額プラン)は登録月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら