Wireshark を使ってパケットデータをプログラムで利用

多機能さにいつも驚かされるネットワーク・プロトコル・アナライザの Wireshark ですが今回また便利機能を見つけたのでエントリ書いておきます。

キャプチャしたパケットを見ているとき「このEthernetフレームをそのままプログラムで再現したいなぁ」と思ったことはありませんか? たとえば、なんらかのテストのためにキャプチャしたパケットと同じ内容を RAW Socket 使ってネットワークに再送するとか。

そんなとき、Wireshark の Export 機能を使うと簡単に該当パケットのバイト列を C言語の配列のとして出力してくれるので簡単にプログラムからパケットデータを利用することができます。
使い方はとっても簡単。

  1. バイト配列として抜き出したいパケットを選択する
  2. File -> Export から「C Arrays(Packet bytes) file ...」を選ぶ
  3. 「Selected Packet Only」を選び Export to file: に書き出すファイル名を指定する


[f:id:kaizawa2:20120811225752p:plain

そうすると、指定したファイルに以下のような内容が得られます。

char pkt6[] = {
0x00, 0x0c, 0x29, 0x05, 0xa6, 0xcf, 0x00, 0x0b, 
0xa2, 0xc1, 0x47, 0x98, 0x08, 0x00, 0x45, 0x00, 
0x01, 0x60, 0x14, 0xc5, 0x40, 0x00, 0x32, 0x06, 
0x9c, 0xa0, 0x3c, 0x20, 0x98, 0x5a, 0xc0, 0xa8, 
0x01, 0x10, 0x00, 0x50, 0x88, 0xda, 0x0d, 0x99, 
0xcf, 0x57, 0x26, 0xe6, 0xbf, 0xeb, 0x80, 0x18, 
0xc5, 0x28, 0xd7, 0xa2, 0x00, 0x00, 0x01, 0x01, 
0x08, 0x0a, 0x31, 0xbe, 0x25, 0x17, 0x03, 0x1d, 
0x6b, 0x43, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 
...中略...
0x65, 0x65, 0x70, 0x2d, 0x41, 0x6c, 0x69, 0x76, 
0x65, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 
0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x3a, 
0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 
0x6d, 0x6c, 0x0d, 0x0a, 0x0d, 0x0a, 0xe3, 0x81, 
0x93, 0xe3, 0x82, 0x93, 0xe3, 0x81, 0xab, 0xe3, 
0x81, 0xa1, 0xe3, 0x81, 0xaf, 0x0a };

これなら C言語だけでなく Java などでも利用できますよね。
とっても便利です。

さらに、パケットのHEX出力見てて「あー、ここ日本語文字列臭いけどなんてかいてあるだろ?」なんてことありませんか?

f:id:kaizawa2:20120811231023p:plain

こんなときも Wireshark の Export 機能を使えば簡単に該当文字列だけを抜き出せます。

  1. 該当部分を選択
  2. File -> Export から「Selected Packet Bytes ...」を選ぶ
  3. Name: に書き出すファイル名を指定する


f:id:kaizawa2:20120811231520p:plain

これで指定したファイルに当該バイト列が書きだされます。
あとは、Emacs などのエディタで開けば日本語が確認できます。簡単ですねっ。

f:id:kaizawa2:20120811231954p:plain